我试图用旋转矩阵旋转立方体的顶点,但每当我运行程序时,立方体就会消失。
我使用旋转矩阵,这是在旋转立方体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);
我努力想知道自己哪里出错了。
答案 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);