9

OpenGL 文档说 gluLookAt() 调用应该在 GL_MODELVIEW 矩阵上完成:

http://www.opengl.org/resources/faq/technical/viewing.htm

事实上,文档链接到一篇文章,该文章说在 GL_PROJECTION 矩阵上使用 gluLookAt() 非常糟糕:

帮助杜绝 GL_PROJECTION 滥用行为

另一方面,有很多教程和示例实际上在 GL_PROJECTION 矩阵上调用了 gluLookAt()。同时,虽然上面提到的文章确实说不要在 GL_PROJECTION 矩阵上使用它,但它说在大多数这样的用法中这样做没有明显的问题。

那么我的问题是:在现实生活项目中使用 gluLookAt() 的最佳方式是什么?在 GL_PROJECTION 矩阵上使用它真的有那么大的禁忌吗?

4

3 回答 3

9

gluLookAt() 函数为您提供了一个转换矩阵,用于转换场景中对象的旋转。所以这显然是一个模型转换,必须进入 GL_MODELVIEW 矩阵。

至于为什么,当你在顶点着色器中自己做时,这会变得更清楚:

虽然顶点的位置确实只是v.pos * modelview * projection,但在没有投影组件的情况下需要模型视图矩阵来进行其他计算(例如照明和雾)。这就是固定函数管道将这两个矩阵分开的原因。

因此,您应该坚持 API 中指定的范例,尤其是永远不要相信无数糟糕的 opengl“教程”。

于 2012-03-02T21:07:06.357 回答
3

我不确定我是否理解这个问题。你是在问为什么页面告诉你不要做一些只在“大部分”时间里有效的事情?

这真的不难理解。根据定义,“大多数这样的用法”意味着有一些这样的用法确实存在问题。

因此,您可以做有时会起作用的事情,然后在其他时候中断,或者您可以做永远起作用的事情。

这不是一个艰难的选择。更重要的是,因为以正确的方式进行操作意味着将一行代码向下移动几行。

于 2012-03-02T20:26:15.440 回答
2

那么我的问题是:在现实生活项目中使用 gluLookAt() 的最佳方式是什么?在 GL_PROJECTION 矩阵上使用它真的有那么大的禁忌吗?

始终使用模型视图矩阵来定位视点。这甚至在矩阵的名称模型(即几何的放置)和视图(视点的放置)中也是如此。

投影矩阵是OpenGL“相机”的一种镜头。您无需移动相机的镜头,而是将相机机身固定在适当的位置以设置视图,对吗?移动镜头有它的应用,比如实现倾斜/移位效果。

于 2012-03-02T21:06:32.080 回答