Python PyOpenGL:分别移动两个对象?
我对使用PyOpenGL非常陌生,我想加载一个obj文件,移动它,然后画一个球体并移动它。当我使用不同的键盘按钮时,我希望这两个对象分别移动。可能吗?(我还需要每个对象中心的坐标)。 问题是,即使我使用Push和Pop矩阵命令,它们也会移动 这是我的密码:Python PyOpenGL:分别移动两个对象?,python,opengl,pygame,pyopengl,opengl-compat,Python,Opengl,Pygame,Pyopengl,Opengl Compat,我对使用PyOpenGL非常陌生,我想加载一个obj文件,移动它,然后画一个球体并移动它。当我使用不同的键盘按钮时,我希望这两个对象分别移动。可能吗?(我还需要每个对象中心的坐标)。 问题是,即使我使用Push和Pop矩阵命令,它们也会移动 这是我的密码: rom objloader import * def main(): pygame.init() display = (800,600) pygame.display.set_mode(display
rom objloader import *
def main():
pygame.init()
display = (800,600)
pygame.display.set_mode(display, OPENGL | DOUBLEBUF)
glMatrixMode(GL_PROJECTION)
gluPerspective(45.0, display[0]/display[1], 0.1, 100.0)
glLightfv(GL_LIGHT5, GL_POSITION, (-40, 200, 100, 0.0))
glLightfv(GL_LIGHT5, GL_AMBIENT, (0.2, 0.2, 0.2, 1.0))
glLightfv(GL_LIGHT5, GL_DIFFUSE, (0.5, 0.5, 0.5, 1.0))
glEnable(GL_LIGHT5)
glEnable(GL_LIGHTING)
glEnable(GL_COLOR_MATERIAL)
glEnable(GL_DEPTH_TEST)
glShadeModel(GL_SMOOTH)
glMatrixMode(GL_MODELVIEW)
glTranslatef(0, 0, -5)
x = 0
y = 0
z = - 5
xx = 0
yy = 0
zz = -5
# LOAD OBJECT
obj = OBJ(sys.argv[1], swapyz=True)
sphere = gluNewQuadric() #Create new sphere
model = glGetDoublev(GL_MODELVIEW_MATRIX)
rx, ry = (0,0)
tx, ty = (0,0)
zpos = 5
rotate = move = False
clock = pygame.time.Clock()
while 1:
clock.tick(30)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) #Clear the screen
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE or event.key == pygame.K_RETURN:
sys.exit()
keypress = pygame.key.get_pressed()
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glLoadIdentity()
if keypress[pygame.K_w]:
glTranslatef(0,-0.01,0)
y = y - 0.01
if keypress[pygame.K_s]:
glTranslatef(0,0.01,0)
y = y + 0.01
if keypress[pygame.K_d]:
glTranslatef(0.01,0,0)
x = x + 0.01
if keypress[pygame.K_a]:
glTranslatef(-0.01,0,0)
x = x - 0.01
if keypress[pygame.K_z]:
glTranslatef(0, 0, -0.01)
z = z - 0.01
if keypress[pygame.K_x]:
glTranslatef(0,0,0.01)
z = z + 0.01
if keypress[pygame.K_0]:
start = x, y, z
print('start is', start)
#model = glGetDoublev(GL_MODELVIEW_MATRIX)
glMultMatrixf(model)
model = glGetDoublev(GL_MODELVIEW_MATRIX)
glMultMatrixf(model)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glScalef(0.1, 0.1, 0.1)
glColor4f(0.5, 0.2, 0.2, 1)
gluSphere(sphere, 1.0, 32, 16)
glPopMatrix()
glPushMatrix()
glLoadIdentity()
if keypress[pygame.K_u]:
glTranslatef(0,-0.01,0)
yy = yy - 0.01
if keypress[pygame.K_j]:
glTranslatef(0,0.01,0)
yy = yy + 0.01
if keypress[pygame.K_k]:
glTranslatef(0.01,0,0)
xx = xx + 0.01
if keypress[pygame.K_h]:
glTranslatef(-0.01,0,0)
xx = xx - 0.01
if keypress[pygame.K_n]:
glTranslatef(0, 0, -0.01)
zz = zz - 0.01
if keypress[pygame.K_m]:
glTranslatef(0,0,0.01)
zz = zz + 0.01
if keypress[pygame.K_l]:
glRotatef(1, 0, 1, 5)
xx = xx*math.cos(rad)-y*math.sin(rad)
yy = xx*math.sin(rad)+yy*math.cos(rad)
if keypress[pygame.K_g]:
#glTranslatef(xx, yy, zz)
glRotatef(1, 0, 1, -5)
#glTranslatef(-xx, -yy, -zz)
rad = 1*180/math.pi
xx = xx*math.cos(rad)-yy*math.sin(rad)
yy = xx*math.sin(rad)+yy*math.cos(rad)
print(xx, yy, math.sin( rad))
if keypress [pygame.K_9]:
print('obj coord', xx, yy, zz)
glMultMatrixf(model)
model = glGetDoublev(GL_MODELVIEW_MATRIX)
glMultMatrixf(model)
#glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) --> se lo metti non vedi l'oggetto prima
glScalef(0.1, 0.1, 0.1)
glCallList(obj.gl_list)
glPopMatrix()
pygame.display.flip() #Update the screen
main()
问题是,即使我使用Push和Pop矩阵命令,它们也会移动
模型矩阵定义场景中单个对象(网格)的位置、方向和比例。因此,每个对象都需要一个单独的模型矩阵:
def main():
# [...]
glMatrixMode(GL_投影)
glLoadIdentity()
透视图(45.0,显示[0]/显示[1],0.1100.0)
glMatrixMode(GLU模型视图)
glLoadIdentity()
glTranslatef(0,0,-5)
模型1=glGetDoublev(GL模型视图矩阵)
模型2=模型1
# [...]
而1:
# [...]
glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)
glMatrixMode(GLU模型视图)
#模式1
glPushMatrix()
glLoadIdentity()
#旋转和平移模型1
# [...]
glMultMatrixf(型号1)
模型1=glGetDoublev(GL模型视图矩阵)
glScalef(0.1,0.1,0.1)
#绘制模型1
glColor4f(0.5,0.2,0.2,1)
gluSphere(球体,1.0,32,16)
GLPOP矩阵()
#模式2
glPushMatrix()
glLoadIdentity()
#旋转和平移模型2
# [...]
glMultMatrixf(型号2)
model_2=glGetDoublev(GL_MODELVIEW_矩阵)
glScalef(0.1,0.1,0.1)
#绘制模型1
glCallList(对象glu列表)
GLPOP矩阵()
pygame.display.flip()#更新屏幕
谢谢!!我必须添加“glMultMatrixf(型号1);glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)在缩放model1之前,glMultMatrixf(model_2)在缩放model2之前,在缩放model2之后,它工作得非常完美!!!再次感谢@琳达,不客气。请阅读