矩阵乘法 opengl 围绕对象旋转

Matrix Multiplication opengl rotating around an object

本文关键字:对象 旋转 opengl      更新时间:2023-10-16

>我创建了 2 个圆圈,其中一个围绕另一个旋转,就像月亮围绕太阳旋转一样。

我向下平移了 z 轴,然后围绕 y 轴应用了旋转,使物体进入轨道。我需要计算出矩阵乘法y旋转 * ZTranslation * (0,0,0,1)

(cos(angle)   0  sin(angle)  0  ) ( 1  0  0   0   ) ( 0 )
(    0        1      0       0  ) ( 0  1  0   0   ) ( 0 )
(-sin(angle)  0  cos(angle)  0  ) ( 0  0  1 zTran ) ( 0 ) 
(    0        0      0       1  ) ( 0  0  0   1   ) ( 1 )

我该怎么做?

既然你说的是圆圈,我假设你正在制作一个2D应用程序。

在 OpenGL 中,您有以下坐标:

   Y
   |
   |
   |
   O---- X
  /
 /
Z

这意味着您的 2D 应用程序位于 X-Y 空间中,Z 垂直于显示器(朝向外部)。

因此,如果有一个圆绕另一个圆,您可能打算首先在 X-Y 平面上平移圆(例如在 Y 轴上),然后在 Z 轴上应用旋转。

所以你的矩阵乘法应该是:

(cos(angle)   sin(angle)  0  0 ) ( 1  0  0   0   ) ( circle_center_x )
(-sin(angle)  cos(angle)  0  0 ) ( 0  1  0 yTran ) ( circle_center_y ) 
(    0            0       1  0 ) ( 0  0  1   0   ) (        0        )
(    0            0       0  1 ) ( 0  0  0   1   ) (        1        )

或者只是 2D:

(cos(angle)   sin(angle) 0 ) ( 1  0   0   ) ( circle_center_x )
(-sin(angle)  cos(angle) 0 ) ( 0  1 yTran ) ( circle_center_y ) 
(    0            0      1 ) ( 0  0   1   ) (        1        )

使用 OpenGL 函数:

glRotatef(angle, 0, 0, 1);
glTranslatef(0, yTran, 0);
glBegin(GL_LINE_LOOP);
for (...)
    /* points of circle around circle_center_x/y */
glEnd();
请注意,在

OpenGL 中,矩阵在右侧相乘。因此,如果您在glTranslatef之前编写glRotatef,则在翻译将应用旋转。