我不想进入复杂的三角学来计算我的三维世界的旋转和类似的东西,所以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)

“Game.Engage_3d(45,0.1100)”主要设置投影矩阵,使其具有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()

从那以后,上升的位置应该总是和它总是成直角一样。我本以为它会做的是用上下键前后移动Z轴,用左右键左右移动X轴。实际上,当我使用左键和右键时,立方体将围绕“眼睛”旋转,并被这些键加速。向上键使另一个不在任何地方的立方体在屏幕上切片并命中第一个立方体。向下键返回神秘的克隆立方体。这可以与轮换相结合,以产生一个完全不同的结果,因为文档中提到了这一点。
到底怎么了?
谢谢您。

最佳答案

(GluLookat中“向上”向量后面的直觉很简单:看任何东西。现在把头倾斜90度。你的位置没有改变,你看的方向没有改变,但是你视网膜上的图像很明显已经改变了。有什么区别?你头顶指向的地方。这是上向量。)
但要回答您的问题:glulookat调用不应该连接起来。换句话说,如果你不知道GluLook是如何工作的,那么唯一可以使用它的模式是:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# do not touch the modelview matrix anymore!

从您的代码来看,您正在执行以下操作:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# some stuff..
gluLookAt(...);

这将产生奇怪的结果,因为glulookat将当前矩阵乘以它计算的查看矩阵。如果您想要连接转换,那么最好弄清楚如何使gltranslate、glscale和glrotatef为您工作。更好的是,您应该了解坐标转换是如何工作的,并坚持使用glmultmatrix。

10-08 08:22