如何通过gluLookAt()修改OpenGL视角?
我想改变我创建的模型的观察角度。我查了一下,发现了一个叫做gluLookAt()的函数,我觉得它可以实现我想要的功能。不过,我对如何使用gluLookAt()完全没有头绪。我把它放进了下面的代码里,但似乎无法正常工作。无论如何,我的代码(python)是:
#!/usr/bin/env python
from OpenGL.GL import *
from OpenGL.GLU import *
import pygame
def pyramid():
#draw a pyramid here
def cube():
#draw a cube here
class mainClass():
def mainMethod(self):
from sys import exit
print ("Initalizing...")
resolution = (400, 300)
pygame.init()
screen = pygame.display.set_mode(resolution, pygame.OPENGL|pygame.DOUBLEBUF)
self.xPer, self.yPer, self.zPer = 0, 0, 0
print ("Doing GL stuff...")
glViewport(self.xPer, self.yPer, resolution[0], resolution[1])
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, float(resolution[0]) / resolution[1], 0.1, 1000.0)#Distance,
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
print ("More GL stuff...")
glEnable(GL_DEPTH_TEST)
#glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
glShadeModel(GL_SMOOTH)
glClearColor(0.0, 0.0, 0.0, 0.0)
print ("Minor details...")
clock = pygame.time.Clock()
rot_tri = 0
rot_quad = 0
print ("Mainloop...")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
exit()
elif event.key == pygame.K_a:
self.xPer += 50
elif event.key == pygame.K_d:
self.xPer -= 50
#glViewport(self.xPer, self.yPer, resolution[0], resolution[1])
elif event.key == pygame.K_w:
self.yPer -= 50
#glViewport(self.xPer, self.yPer, resolution[0], resolution[1])
elif event.key == pygame.K_s:
self.yPer += 50
#glViewport(self.xPer, self.yPer, resolution[0], resolution[1])
elif event.key == pygame.K_f:
self.zPer += 50
elif event.key == pygame.K_v:
self.zPer -= 50
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity()
gluLookAt(10, 10, 10, self.xPer, self.yPer, self.zPer, 0, 1, -1);
glLoadIdentity()
glTranslatef(-1.5, 0.0, -6.0)
glRotatef(rot_tri, 0.0, 1.0, 0.0)
pyramid()
glLoadIdentity()
glTranslate(1.5, 0.0, -6.0)
glRotatef(rot_quad, 1.0, 0.0, 0.0)
cube()
rot_tri += 2.0
rot_quad -= 1.5
pygame.display.set_caption("hello_opengl.py FPS: %i" % clock.get_fps())
pygame.display.flip()
clock.tick()
t = mainClass()
t.mainMethod()
我只希望这段代码能修改我观看一些旋转的金字塔和立方体的角度。有没有人能解释一下如何修改这段代码来使用gluLookAt()?
顺便问一下,有没有什么好的网页可以解释OpenGL(矩阵、三维数学,glLoadIdentity()做什么等等)?我能写代码,但我完全不知道自己在做什么。
1 个回答
0
你完全没有理解gluLookAt
的意思。你需要在当前的矩阵上调用它一次,然后不要清除它,而是要修改它,这样其他物体才能正确绘制。
当你这样做的时候:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(10, 10, 10, ...); // <-- this line has no effect
glLoadIdentity();
gluLookAt
的功能和glRotate
、glTranslate
是一样的。