-4

我试图让我在 OpenGL 中的场景移动,但我遇到了麻烦。我查阅了几个教程,了解了 OpenGL 矩阵背后的数学概念。我只是遇到了麻烦。我需要的只是1个例子。如果我能看到一个例子,说明当一个键被按住时“相机”是如何向一个方向移动的,我可以为自己的目的修改代码。

4

2 回答 2

3

好吧,OpenGL 并没有真正的“相机”。它拥有的是一个转换管道(固定功能或可编程)。此外,OpenGL 不维护“场景”,而只是将点、线和三角形绘制到帧缓冲区,一次一个。

一旦你把注意力集中在一个事实上,你本质上与使用任何其他绘图 API(goTo(x,y); lineTo(x,y);或类似的 API)并没有太大的不同,OpenGL 中的很多东西都会变得更有意义。

因此,OpenGL 中的“相机”只是在顶点变换管道中的某个点应用的视图变换。通常作为模型视图矩阵中的最后一个转换——模型转换之后是视图转换,因此是模型视图。

有很多方法可以指定视图转换,通常用于此的典型辅助函数是gluLookAt. 由于转换以相反的顺序应用,因此它们被乘以矩阵(如果至少使用 OpenGL 的 glMultMatrix 或内置矩阵操作函数之一),在定义模型视图矩阵时,查看转换首先出现。因此,在您的绘图功能中,代码通常看起来像

glMatrixMode(GL_MODELVIEW)
glLoadMatrix(view.transformation) # same as glLoadIdentity(); glMultMatrix(view.transformation)

foreach(object o in objects):
    glMatrixMode(GL_MODELVIEW)
    glPushMatrix()
    glMultMatrix(o.transformation)

    o.draw()

    glMatrixMode(GL_MODELVIEW)
    glPopMatrix()

您是否注意到在每次矩阵操作之前我总是确保我处于正确的矩阵模式?这是因为 object::draw 可能会切换到另一种矩阵模式(比如 GL_TEXTURE),而切换矩阵模式的成本可以忽略不计,所以你应该总是在一系列矩阵操作之前这样做。

作为进一步的提示:您应该始终将设置视口和投影矩阵的代码放在绘图代码的开头。不要将它放在窗口的调整大小事件处理程序中。

于 2012-10-25T06:02:12.543 回答
0

您可以使用gluLookAt“移动”您的相机。

gluLookAt(eyex,eyey,eyez, centerx,centery,centerz, upx,upy,upz);

它们的前 3 个坐标是您的虚拟眼睛的坐标。接下来的 3 个是您的眼睛“注视”的坐标。最后 3 个是指向场景向上方向的向量(将其视为旋转您的眼睛)。

例如,

gluLookAt(1,1,1, 0,0,0, 0,1,0);

这使您的眼睛注视着 (1,1,1) 并且您正在查看原点。向上向量的方向是正 y 轴。

如果你想移动相机,你可以gluLookAt在每次按键回调函数中按下一个键时调用更新的参数。

于 2012-10-25T04:33:13.717 回答