使用旋转矩阵旋转立方体的顶点
Posted
技术标签:
【中文标题】使用旋转矩阵旋转立方体的顶点【英文标题】:Rotate the vertexes of a cube using a rotation matrix 【发布时间】:2014-11-14 17:13:37 【问题描述】:我正在尝试使用旋转矩阵来旋转立方体的顶点,但每当我运行程序时,立方体就会消失。
我正在使用旋转立方体的 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】: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);
【讨论】:
我最初通过阅读有关旋转矩阵的***将其作为 4x4 并出于某种原因对其进行了更改。无论如何,好消息是当我运行它时立方体实际上会出现,但是当我按下键时它不会移动。关于度数/弧度,我的印象是OpenGL根据***.com/questions/2146884/…使用度数。 我刚刚意识到您所说的度数和弧度是什么意思,因为它在 C++ 中而不是 OpenGL 中。我刚刚尝试过,所以每次增加 0.175 弧度。但是,它仍然无法正常工作,因为它实际上并没有对立方体做任何事情。 @JaAnTr - 每次更改角度时都需要重新计算矩阵的单元格,而不仅仅是定义一次。 @col6y - 我不认为我完全理解这意味着什么。我该怎么做呢? 从代码片段中并不完全清楚整个事情的结构。是的,如果矩阵当前是静态变量,您必须更改它以将其构建为display()
中的局部变量,或者至少在每次角度变化时更新取决于角度的 4 个矩阵元素。我可以稍后将其添加到我的答案中。以上是关于使用旋转矩阵旋转立方体的顶点的主要内容,如果未能解决你的问题,请参考以下文章