我如何正确使用gluLookAt?

Mat*_*ell 15 python opengl graphics pyopengl

我不想进入复杂的三角函数来计算旋转和我的3D世界那样的东西所以gluLookAt似乎是一个不错的选择.根据文档,我需要做的就是为摄像机位置放置3个坐标,为我应该看到的位置设置3个坐标和"向上"位置.直到我认为它必须与屏幕顶部方向上的视线成直角才是最后的意义.

它根本不起作用.我有一些python代码.这是在我进入游戏的这一部分时初始化一些数据和一些模式代码的代码:

def init(self):
    self.game_over = False
    self.z = -30
    self.x = 0
def transfer(self):
    #Make OpenGL use 3D
    game.engage_3d(45,0.1,100)
    gluLookAt(0,0,-30,0,0,0,0,1,0)
Run Code Online (Sandbox Code Playgroud)

"game.engage_3d(45,0.1,100)"基本上将投影矩阵设置为具有45度视角和近和远坐标为0.1和100.

第一个gluLookAt很好地将相机放在正确的位置.

我有一个以(0,0,0)为中心绘制的立方体,没有gluLookAt它工作正常.在我绘制它之前,我有这个代码:

gluLookAt(self.x,0,self.z,0,0,0,0,1,0)
if game.key(KEY_UP):
    self.z += 2.0/game.get_fps()
if game.key(KEY_DOWN):
    self.z -= 2.0/game.get_fps()
if game.key(KEY_LEFT):
    self.x += 2.0/game.get_fps()
if game.key(KEY_RIGHT):
    self.x -= 2.0/game.get_fps()
Run Code Online (Sandbox Code Playgroud)

从那时起,向上位置应该始终与它始终是直角相同.我认为它会做的是用向上和向下键向前和向后移动z轴,用左右键向左和向右穿过x轴.实际发生的事情是,当我使用左右键时,立方体将围绕由键加速的"眼睛"旋转.向上键导致另一个立方体从无处穿过屏幕并击中第一个立方体.向下键将神秘的克隆立方体带回来.这可以与轮换相结合,以提供完全不同的结果,因为文档说会出现.

究竟是什么问题?

谢谢.

Car*_*ger 39

(gluLookAt中"up"向量背后的直觉很简单:看看任何东西.现在将你的头部倾斜90度.你没有改变的地方,你所看到的方向没有改变,但是你的形象是视网膜显然有.有什么不同?头顶指向的位置.这是向上的向量.)

但回答你的问题:gluLookAt调用不应该连接.换句话说,如果您不确切知道它是如何工作的,可以使用gluLookAt的唯一模式如下:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# do not touch the modelview matrix anymore!
Run Code Online (Sandbox Code Playgroud)

从您的代码中可以看出,您正在执行以下操作:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# some stuff..
gluLookAt(...);
Run Code Online (Sandbox Code Playgroud)

这会产生奇怪的结果,因为gluLookAt将当前矩阵乘以它计算的观察矩阵.如果你想连接变换,你最好搞清楚如何制作glTranslate,glScale和glRotatef适合你.更好的是,您应该了解坐标转换的工作原理并坚持使用glMultMatrix.

  • 这并不是说它很慢.这就是gluLookAt隐藏了一些你在做严肃的OpenGL编程时应该知道的事情.特别是,您应该学习组合不同的坐标转换.这需要习惯,并且起初有点令人沮丧,但它最终得到回报:许多图形技术都建立在巧妙地转换坐标系之上. (3认同)