我已经用简单的二维太阳系练习矩阵变换一段时间了。我不关心每个行星的大小比例、轨道或距离的细节。我想要了解的是 OpenGl 如何处理命令
glPushMatrix()
和 glPopMatrix()
在某种意义上你可以让卫星(小物体)绕轨道行星(大物体)运行。
我制作了一个行星轨道模拟程序作为参考[这篇文章]。(在OpenGL中制作太阳系)
我对程序的这一部分最感兴趣。在这里,我将简要描述它的作用,仅关注屏幕上显示的四个对象中的三个(太阳、地球和月亮):
首先,程序将太阳放置在屏幕的中心。之后,地球将围绕太阳旋转,半径为 4 个单位。当地球绕太阳旋转时,月球绕太阳公转,半径为距地球 1.5 个单位。
# Sun
plot_circle(radius=1, color=[180 / 255, 180 / 255, 16 / 255])
glPushMatrix()
# This code makes Earth spin around the sun.
glRotate(angles[0], 0, 0, 1)
glTranslate(4, 0, 0)
# Earth
plot_circle(radius=0.75, color=[0 / 255, 59 / 255, 174 / 255])
glPushMatrix()
# This somehow makes the moon spin around the earth.
glRotate(angles[2], 0, 0, 1)
glTranslate(0, 1.5, 0)
# Moon
plot_circle(radius=0.25, color=[128 / 255, 128 / 255, 128 / 255])
glPopMatrix()
glPopMatrix()
我明白第一个
glPushMatrix()
。它先进行平移,然后进行自转,使地球绕太阳旋转。然而,我的问题与第二个glPushMatrix()
有关,以及为什么它使月球绕地球运行就像它绕太阳运行一样完美同步。
我相信第二个
glPushMatrix()
使用应用平移旋转后留下的先前变换矩阵。由于该矩阵已被变换,因此中心/原点也必须被变换。换句话说,月球的原点将位于地球当前的位置。因此,考虑到月球的自转点将是地球目前所处的任何位置,月球可以像绕太阳一样绕地球运行,因为变换矩阵考虑了之前应用的平移-旋转操作。
我想确认一下我所了解的情况是否属实?这就是我刚才解释的目的吗
glPushMatrix()
?
glPushMatrix()
只是将当前矩阵值推送到某处现有的堆栈上。
glPopMatrix()
从堆栈顶部弹出矩阵值,当前矩阵值将被弹出的值覆盖。
这就是全部。
它们对于进行局部改造很有用。
在您的代码中,它们围绕: