gluLookAt()最佳用法,GL_PROJECTION矩阵或GL_MODELVIEW矩阵

时间:2012-03-02 20:19:41

标签: opengl matrix glulookat

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

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

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

Help stamp out GL_PROJECTION abuse

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

我的问题是:在现实生活中使用gluLookAt()的最佳方法是什么?在GL_PROJECTION矩阵上使用它真的很不可能吗?

3 个答案:

答案 0 :(得分:8)

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

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

虽然顶点的位置确实只是v.pos * modelview * projection,但是需要模型视图矩阵而没有用于其他计算的投影组件(例如照明和雾)。这就是固定功能管道分离这两个矩阵的原因。

所以你应该坚持使用API​​中指定的范例,尤其是永远不要相信任何无数糟糕的opengl“教程”。

答案 1 :(得分:2)

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

这真的不难理解。根据定义,“大多数此类用法”意味着某些这样的用法会出现问题。

所以你可以做有时会工作的事情,然后打破其他时间,或者你可以做始终工作的事情

这不是一个艰难的选择。甚至更多,因为这样做是正确的方式意味着逐字地将一行代码移动几行。

答案 2 :(得分:1)

  

我的问题是:在现实生活中使用gluLookAt()的最佳方法是什么?在GL_PROJECTION矩阵上使用它真的很不可能吗?

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

投影矩阵是OpenGL“相机”的镜头。您不要移动相机的镜头,保持相机机身就位以设置视图,对吗?移动镜头有其应用,例如实现倾斜/移位效果。