我在纯C语言中为glRotatef编写替代函数时遇到问题。我需要实现参数为:点列表,角度和旋转矢量的函数。函数旋转后必须返回点列表。我的函数如下所示:

void rotate(float * current, float a, float x, float y, float z)
{
    float sina = sinf(a);
    float cosa = cosf(a);
    float rotateMatrix[9] = //creating rotate matrix
    {
        x*x*(1-cosa) + cosa,    x*y*(1-cosa) - z*sina,  x*z*(1-cosa) + y*sina,
        y*x*(1-cosa) + z*sina,  y*y*(1-cosa) + cosa,    y*z*(1-cosa) - x*sina,
        z*x*(1-cosa) - y*sina,  z*y*(1-cosa) + x*sina,  z*z*(1-cosa) + cosa
    };
    float *resultVertexList = current; //temporary help
    int i;
    for(i=0;current[i] != 0;i++) //multiplying CURRENT_MATRIX * ROTATE_MATRIX
    {
        int currentVertex = (i/3) * 3;
        int rotateColumn = i%3;
        resultVertexList[i] =
        current[currentVertex] * rotateMatrix[rotateColumn] +
        current[currentVertex+1] * rotateMatrix[rotateColumn+3] +
        current[currentVertex+2] * rotateMatrix[rotateColumn+6];
    }
    current = resultVertexList;
}


我这样称呼它:rotate(current, M_PI/10, 0, 1, 0);

之后,我将获取current点列表,并使用openGL进行绘制。为了测试,我尝试旋转代表多维数据集的点的列表。它旋转,但是每次调用rotate函数都会缩小。我不知道为什么。看一些截图:


without any rotating, front side of cube
when I rotate it shrinks


在多次调用rotate函数后,它缩小到一点。

我究竟做错了什么?

最佳答案

这行代码:

float *resultVertexList = current; //temporary help


不复制您的顶点列表。您仅将指针复制到列表,因此此后您将拥有两个指向同一列表的指针。因此,以下循环使用已经旋转的x / y坐标来计算新的y / z坐标,这显然是错误的。

我也想知道您的终止条件:

current[i] != 0


没错,但是它可以防止任何顶点的坐标为零。相反,我建议使用一个附加参数来显式传递顶点数。

我还会按顶点而不是按坐标旋转,这更自然,更容易理解:

void rotate(float * current, int vertexCount, float a, float x, float y, float z)
{
    float sina = sinf(a);
    float cosa = cosf(a);
    float rotateMatrix[9] =
    {
        x*x*(1 - cosa) + cosa, x*y*(1 - cosa) - z*sina, x*z*(1 - cosa) + y*sina,
        y*x*(1 - cosa) + z*sina, y*y*(1 - cosa) + cosa, y*z*(1 - cosa) - x*sina,
        z*x*(1 - cosa) - y*sina, z*y*(1 - cosa) + x*sina, z*z*(1 - cosa) + cosa
    };

    int i;
    for (i = 0; i < vertexCount; ++i)
    {
        float* vertex = current + i * 3;

        float x = rotateMatrix[0] * vertex[0] + rotateMatrix[1] * vertex[1] + rotateMatrix[2] * vertex[2];
        float y = rotateMatrix[3] * vertex[0] + rotateMatrix[4] * vertex[1] + rotateMatrix[5] * vertex[2];
        float z = rotateMatrix[6] * vertex[0] + rotateMatrix[7] * vertex[1] + rotateMatrix[8] * vertex[2];

        vertex[0] = x;
        vertex[1] = y;
        vertex[2] = z;
    }
}

关于c++ - 纯C中的glRotatef,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27768072/

10-13 03:32