使用旋转矩阵旋转立方体的顶点
问题描述:
我试图用旋转矩阵旋转立方体的顶点,但每当我运行程序时立方体就会消失。使用旋转矩阵旋转立方体的顶点
我正在使用一个旋转矩阵,它是在旋转立方体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);
我很努力地看到它在哪里,我出错了。
答
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);
我本来它通过读取旋转矩阵*的一个4×4,改变它的一些原因。无论如何,好消息是当我运行它时,立方体实际上显示出来,但是当我按下按键时它不会移动。关于度/弧度,我认为OpenGL根据这个http://*.com/questions/2146884/why-does-opengl-use-degrees-instead-of-radians使用度数。 – JaAnTr 2014-11-14 17:30:22
我刚刚意识到你的意思是关于度和弧度,因为它在C++而不是OpenGL中。我刚刚尝试过,所以每增加0.175弧度。但是,它仍然不起作用,因为它实际上并没有对多维数据集做任何事情。 – JaAnTr 2014-11-14 17:37:51
@JaAnTr - 每次更改角度时都需要重新计算矩阵的单元格,而不是仅定义一次。 – 2014-11-14 17:44:22