如何正确使用glulookt?

2024-06-16 12:02:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我不想进入复杂的三角学来计算我的三维世界的旋转和类似的事情,所以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(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轴。实际上,当我使用左键和右键时,立方体将围绕着被键加速的“眼睛”旋转。向上键使另一个立方体从任何地方穿过屏幕并击中第一个立方体。向下键将神秘的克隆立方体带回来。这可以与轮换相结合,以产生完全不同的结果,正如文件所说的那样。

到底怎么了?

谢谢你。


Tags: 文件key代码selfgamegetif屏幕
1条回答
网友
1楼 · 发布于 2024-06-16 12:02:46

(gluLookAt中“向上”向量背后的直觉很简单:看任何东西。现在把头倾斜90度。你所处的位置没有改变,你看的方向也没有改变,但你视网膜上的图像显然改变了。有什么区别?你头顶指向的地方。这是向上的向量。)

但要回答您的问题:gluLookAt调用不应该连接起来。换句话说,如果您不知道gluLookAt的工作原理,那么可以使用它的唯一模式是:

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。

相关问题 更多 >