You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于glPushMatrix实现卫星绕公转行星旋转的原理确认

你的理解完全正确,这正是glPushMatrix的核心用途

你的分析没问题,第二个glPushMatrix确实继承了之前的变换状态,让月球能以公转中的地球为原点做环绕运动,这也是OpenGL矩阵栈(glPushMatrix/glPopMatrix)专门设计来解决的问题——实现层次化的嵌套变换,比如子物体跟随父物体运动的场景。

我们一步步拆解这段代码的变换逻辑:

  1. 初始状态:矩阵是单位矩阵,原点在屏幕中心,直接绘制太阳,太阳固定在中心。
  2. 地球绕太阳公转:
    • glPushMatrix():把当前的单位矩阵(太阳所在的初始坐标系)压入矩阵栈保存。
    • glRotate(angles[0], 0, 0, 1):绕初始原点(太阳)旋转一定角度,将坐标系转到地球公转的方向。
    • glTranslate(4, 0, 0):把坐标系原点平移4个单位到地球当前的公转位置。
    • 此时绘制地球,地球就出现在绕太阳公转的轨道上。
  3. 月球绕地球公转:
    • glPushMatrix():把当前完成“旋转+平移”的矩阵(以地球位置为新原点的坐标系)压入栈保存。
    • glRotate(angles[2], 0, 0, 1):绕这个新原点(地球)旋转,将坐标系转到月球绕地球的方向。
    • glTranslate(0, 1.5, 0):把坐标系原点平移1.5个单位到月球当前的轨道位置。
    • 此时绘制月球,月球就会跟着地球的公转位置,同步绕地球旋转。
  4. 恢复变换状态:
    • 第一个glPopMatrix():弹出栈顶矩阵,回到地球所在的坐标系状态,避免后续绘图被月球的变换影响。
    • 第二个glPopMatrix():弹出栈顶矩阵,回到初始的单位矩阵状态,确保下一次绘图不受之前的公转变换影响。

简单来说,glPushMatrix就是“保存当前坐标系状态”,glPopMatrix就是“回到之前保存的坐标系状态”,通过这种嵌套的压栈、弹栈操作,就能轻松实现父物体带动子物体的层级运动,这在3D/2D场景的动画、模型绘制中是非常基础且常用的手段。

核心代码回顾:

# 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()

内容的提问来源于stack exchange,提问作者KironStylo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:13:33