2014-11-14 137 views
0

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

我正在使用一个旋转矩阵,它是在旋转立方体x坐标的讲座中给予我们的。

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

我在我的键盘

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

并做矩阵乘法上增加了moveCubeX变量与“T”键我使用

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); 

我很努力地看到它在哪里,我出错了。

回答

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); 
+0

我本来它通过读取旋转矩阵维基百科的一个4×4,改变它的一些原因。无论如何,好消息是当我运行它时,立方体实际上显示出来,但是当我按下按键时它不会移动。关于度/弧度,我认为OpenGL根据这个http://stackoverflow.com/questions/2146884/why-does-opengl-use-degrees-instead-of-radians使用度数。 – JaAnTr 2014-11-14 17:30:22

+0

我刚刚意识到你的意思是关于度和弧度,因为它在C++而不是OpenGL中。我刚刚尝试过,所以每增加0.175弧度。但是,它仍然不起作用,因为它实际上并没有对多维数据集做任何事情。 – JaAnTr 2014-11-14 17:37:51

+0

@JaAnTr - 每次更改角度时都需要重新计算矩阵的单元格,而不是仅定义一次。 – 2014-11-14 17:44:22