【发布时间】:2018-08-19 13:11:36
【问题描述】:
我正在尝试在 OpenGL 中创建一个太阳系,但地球并未围绕太阳旋转。那是围绕其他轴旋转。如何解决这个问题?
首先,我画了一个太阳,然后是第一颗行星的自转、平移和自转。所以它应该围绕太阳旋转并绕着它自己的轴旋转,但这不会发生。
我还想画出行星将绕其旋转的圆圈。如何在XZ平面上做圆(可能)
from __future__ import division
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
year = 0
day = 0
def init():
glClearColor (0.0, 0.0, 0.0, 0.0)
glShadeModel (GL_FLAT)
def display():
global day, year
glClear (GL_COLOR_BUFFER_BIT)
glColor3f (1.0, 1.0, 0, 1)
glPushMatrix()
glutSolidSphere(1.0, 20, 16) # draw sun
glRotatef(year, 0.0, 1.0, 0.0)
year = (year + 1) % 360
glPushMatrix()
glTranslatef(2.0, 0.0, 0.0)
glRotatef(day, 0.0, 1.0, 0.0)
day = (day + 1) % 360
glColor3f (0, 0, 1.0);
glutWireSphere(0.2, 10, 8) # draw smaller planet
glPopMatrix()
glPushMatrix()
glTranslatef(4.0, 0.0, 0.0)
glRotatef(day, 0.0, 1.0, 0.0)
glColor3f (1, 0, 0.0, 1)
glutWireSphere(0.2, 10, 8)
glPopMatrix()
glPopMatrix()
glutSwapBuffers()
# delay
for i in range(100000):
pass
def reshape(w, h):
glViewport (0, 0, w, h)
glMatrixMode (GL_PROJECTION)
glLoadIdentity ()
gluPerspective(70.0, w/h, 1.0, 20.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize(800, 800)
glutInitWindowPosition (100, 100)
glutCreateWindow("Transformation")
init ()
glutDisplayFunc(display)
glutIdleFunc(display)
glutReshapeFunc(reshape)
glutMainLoop()
【问题讨论】:
-
行星应该在太阳后面(一段时间不可见),然后它会在回来后可见,但那不会发生。
-
如果您想要真实的东西,请参阅Is it possible to make realistic n-body solar system simulation in matter of size and mass? 并使用开普勒方程。最好以不同的方式管理每个物体的矩阵以获取更多信息,请参阅Understanding 4x4 homogenous transform matrices,因此通过开普勒计算位置,根据时间和周期计算方向并构建矩阵......因为 glRotate 不会给你椭圆轨迹......
标签: python opengl graphics 3d pyopengl