glPushMatrix 如何影响对象围绕旋转对象的旋转?

问题描述 投票:0回答:1

我已经用简单的二维太阳系练习矩阵变换一段时间了。我不关心每个行星的大小比例、轨道或距离的细节。我想要了解的是 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()

python opengl rotation matrix-multiplication
1个回答
0
投票
  • glPushMatrix()
    只是将当前矩阵值推送到某处现有的堆栈上。
    • 用于保存当前矩阵值。
    • 此函数不会对当前矩阵造成任何改变
  • glPopMatrix()
    从堆栈顶部弹出矩阵值,当前矩阵值将被弹出的值覆盖。
    • 用于加载之前推送的矩阵值。

这就是全部。

它们对于进行局部改造很有用。
在您的代码中,它们围绕:

  1. 仅针对{地球和月球}进行局部变换
  2. 仅限月球的局部变换。
© www.soinside.com 2019 - 2024. All rights reserved.