使用旋转矩阵旋转立方体的顶点

时间:2014-11-14 17:13:37

标签: c++ opengl matrix rotation

我试图用旋转矩阵旋转立方体的顶点,但每当我运行程序时,立方体就会消失。

我使用旋转矩阵,这是在旋转立方体x坐标的讲座中给我们的。

double moveCubeX = 0;
float xRotationMatrix[9] = {1, 0, 0,
                            0, cos(moveCubeX), sin(moveCubeX),
                            0, -sin(moveCubeX), cos(moveCubeX) 
};

我使用' t'添加到moveCubeX变量键盘上的键

case 't':
    moveCubeX += 5;
    break;

使用

进行矩阵乘法运算
glMultMatrixf();

然而,当我在运行它时将其添加到我的代码中时,多维数据集刚刚消失。这是我在glMultMatrixf()函数中添加的地方。

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    gluLookAt(pan, 0, -g_fViewDistance, 
              pan, 0, -1,
              0, 1, 0);

    glRotatef(rotate_x, 1.0f, 0.0f, 0.0f);   //Rotate the camera
    glRotatef(rotate_y, 0.0f, 1.0f, 0.0f);   //Rotate the camera

    glMultMatrixf(xRotationMatrix);

我努力想知道自己哪里出错了。

1 个答案:

答案 0 :(得分:3)

OpenGL使用大小为4x4的矩阵。因此,您的旋转矩阵需要扩展为4行和4列,总共16个元素:

float xRotationMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f,
                             0.0f, cos(moveCubeX), sin(moveCubeX), 0.0f,
                             0.0f, -sin(moveCubeX), cos(moveCubeX), 0.0f,
                             0.0f, 0.0f, 0.0f, 1.0f};

您还需要注意角度的单位。由于每次用户按下某个键时都会将5添加到您的角度,看起来您正在考虑学位。 C / C ++库中的标准cos()sin()函数期望角度为弧度。

此外,您的矩阵看起来像是在全球范围内定义的。如果这样做,元素将仅在程序启动时评估一次。您必须将矩阵定义设为display()的局部,以便每次绘制时重新评估矩阵,或者每次角度更改时更新矩阵。

对于第二个选项,每次角度更改时,只能更新依赖于角度的矩阵元素。在修改moveCubeX的函数中,添加:

xRotationMatrix[5] = cos(moveCubeX);
xRotationMatrix[6] = sin(moveCubeX);
xRotationMatrix[9] = -sin(moveCubeX);
xRotationMatrix[10] = cos(moveCubeX);