gluLookAt()最佳用法:在GL_PROJECTION矩阵上还是在GL_MODELVIEW矩阵上?

9
OpenGL文档指出,应该在GL_MODELVIEW矩阵上调用gluLookAt()函数。

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

事实上,文档链接到一篇文章,其中指出在GL_PROJECTION矩阵上使用gluLookAt()非常糟糕: 帮助消除GL_PROJECTION滥用 另一方面,有很多教程和示例实际上在GL_PROJECTION矩阵上调用gluLookAt()。同时,尽管上述文章确实说不要在GL_PROJECTION矩阵上使用它,但它也表示,在大多数这样的用法中,这样做并没有明显的问题。
那么我的问题是:在实际项目中使用gluLookAt()的最佳方法是什么?在GL_PROJECTION矩阵上使用它真的会那么糟糕吗?

4
另一方面,有很多教程和示例中实际上是在GL_PROJECTION矩阵上调用gluLookAt()。有很多GL教程和示例做了愚蠢的事情,这并不是对它们的做法进行辩解的理由。事实上,这是避免不使用着色器的GL教程的另一个原因;至少着色器教程是由知识渊博的人编写的。 - Nicol Bolas
3个回答

9

gluLookAt()函数提供了一个变换矩阵,用于旋转场景中的对象。因此,这显然是模型变换,必须放入GL_MODELVIEW矩阵。

至于为什么,当您在顶点着色器中自己执行此操作时,这将变得更加清晰:

虽然顶点的位置确实只是v.pos * modelview * projection,但是其他计算(例如光照和雾)需要没有投影部分的modelview矩阵。这就是为什么固定功能管道将这两个矩阵分开的原因。

因此,您应该坚持API中指定的范例,特别是永远不要相信OpenGL的那些糟糕的“教程”。


当转换顶点时,操作顺序通常是相反的:projection * modelview * v.pos。如果按照这种方式进行操作,则必须对所有矩阵和向量进行转置。 - datenwolf

3

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

这并不难理解。“大多数这样的用法”根据定义意味着存在一些这样的用法会出现问题。

因此,您可以选择做有时有效但有时会破坏的事情,或者您可以做总是有效的事情。

这不是一个困难的选择。特别是因为用正确的方式做只需要将一行代码向下移动几行。


2
我的问题是:在实际项目中,使用gluLookAt()的最佳方式是什么?在GL_PROJECTION矩阵上使用它真的很不好吗?
始终使用modelview矩阵来定位视点。这甚至体现在矩阵的名称中,即model(即几何体的放置)和view(视点的放置)。
投影矩阵有点像OpenGL“相机”的镜头。您不会移动相机的镜头,保持相机本身不动以设置视图,对吧?移动镜头有其应用,例如实现倾斜/移位效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接