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

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 个矩阵元素。我可以稍后将其添加到我的答案中。

以上是关于使用旋转矩阵旋转立方体的顶点的主要内容,如果未能解决你的问题,请参考以下文章

3d 矩阵旋转 - 对象奇怪地旋转

如何避免 OpenGL 中的光旋转?

转 CATransform3D 矩阵变换之立方体旋转实现细节

GLSL 2D 旋转矩阵无法按预期工作

协同旋转不变网格形变

立方体在旋转时未按预期呈现