围绕对象旋转的矩阵乘法opengl
Posted
技术标签:
【中文标题】围绕对象旋转的矩阵乘法opengl【英文标题】:Matrix Multiplication opengl rotating around an object 【发布时间】:2012-12-07 14:56:41 【问题描述】:我创建了 2 个圆圈,一个围绕另一个旋转,就像月亮围绕太阳旋转一样。
我沿 z 轴平移,然后围绕 y 轴进行旋转以使物体进入轨道。我需要计算出矩阵乘法 yRotation * 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 )
我该怎么做?
【问题讨论】:
【参考方案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 )
或者只是二维:
(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
,旋转将在翻译之后应用。
【讨论】:
以上是关于围绕对象旋转的矩阵乘法opengl的主要内容,如果未能解决你的问题,请参考以下文章
如何将 glRotatef() 转换为 glMultMatrixd() 的乘法矩阵