Python 用OpenGL制作太阳系

Python 用OpenGL制作太阳系,python,opengl,graphics,3d,pyopengl,Python,Opengl,Graphics,3d,Pyopengl,我试图在OpenGL中创建一个太阳系,但这个星球并没有围绕太阳旋转。这是围绕另一个轴旋转的。如何解决这个问题 首先,我画了一个太阳,然后,第一颗行星旋转,平移,再旋转。所以它应该绕着太阳旋转,绕着它自己的轴旋转,但这并没有发生 我还想画一个行星旋转的圆圈。如何在XZ平面上画圆(可能) 这颗行星应该在太阳后面运行(一段时间内是看不见的),然后它回来后就可以看到了,但这并没有发生 必须启用深度测试并清除深度缓冲区 深度测试可通过启用。默认深度函数为GL\u LESS。这会导致跳过之前绘制的片段后面的

我试图在OpenGL中创建一个太阳系,但这个星球并没有围绕太阳旋转。这是围绕另一个轴旋转的。如何解决这个问题

首先,我画了一个太阳,然后,第一颗行星旋转,平移,再旋转。所以它应该绕着太阳旋转,绕着它自己的轴旋转,但这并没有发生

我还想画一个行星旋转的圆圈。如何在XZ平面上画圆(可能)


这颗行星应该在太阳后面运行(一段时间内是看不见的),然后它回来后就可以看到了,但这并没有发生

必须启用深度测试并清除深度缓冲区

深度测试可通过启用。默认深度函数为
GL\u LESS
。这会导致跳过之前绘制的片段后面的片段:

在每帧之前,必须清除深度缓冲区,以重新启动此过程

在显示的开始处,将以下行添加到代码中:

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
glEnable( GL_DEPTH_TEST )
当然,您必须创建具有深度缓冲区()的窗口:

请参见预览:




你能告诉我如何在行星旋转的地方画圆圈吗

我建议使用来设置模拟。以下示例显示了太阳、地球和月球(当然,这是一个非常简单的模拟,其大小和距离关系完全错误):


这颗行星应该在太阳后面(一段时间内看不见),然后它回来后就可以看到,但这并不是真的。如果你想看到真实的东西,可以使用开普勒方程。更好的做法是对每个身体的矩阵进行不同的管理,以获取更多信息,请参见开普勒计算位置、时间和周期的方向,并构建矩阵。。。因为glRotate不会给出椭圆轨迹……你能告诉我如何在行星旋转的地方画一个圆吗?
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
glEnable( GL_DEPTH_TEST )
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
import time

start_time = time.time()

def display():

    t = time.time() - start_time
    year_period = 5.0                  # 5 seconds for simulating one year 
    year     = (t / year_period)
    day      = 365 * year
    moon_sid = (365 / 27.3) * year

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
    glEnable( GL_DEPTH_TEST )

    glColor4f (1.0, 1.0, 0, 1)
    glPushMatrix()
    glutSolidSphere(1.0, 20, 16)             # sun

    glRotatef(year*360.0, 0.0, 1.0, 0.0)     # earth rotation around the sun 
    glTranslatef(3.0, 0.0, 0.0)              # earth location

    glPushMatrix()                           # push earth system 

    glPushMatrix()
    glRotatef(day*360.0, 0.0, 1.0, 0.0)      # earth spinn
    glRotatef(90-23.4, 1.0, 0.0, 0.0)        # earth axis
    glColor3f (0, 0, 1)                      # blue
    glutWireSphere(0.3, 10, 8)               # earth
    glPopMatrix()

    glPushMatrix()
    glRotatef(moon_sid*360.0, 0.0, 1.0, 0.0) # moon sidereal
    glTranslatef(1.0, 0.0, 0.0)              # distance moon to earth
    glRotatef(90, 1.0, 0.0, 0.0)
    glColor4f (0.4, 0.5, 0.6, 1)                         
    glutWireSphere(0.1, 10, 8)               # moon
    glPopMatrix()

    glPopMatrix()                            # pop earth system 

    glPopMatrix()
    glutSwapBuffers()