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矩阵上使用它真的很不可能吗?
答案 0 :(得分:8)
gluLookAt()函数为您提供转换矩阵,用于转换场景中对象的旋转。所以这显然是模型转换,必须进入GL_MODELVIEW矩阵。
至于为什么,当你在顶点着色器中自己做的时候会变得更清楚:
虽然顶点的位置确实只是v.pos * modelview * projection
,但是需要模型视图矩阵而没有用于其他计算的投影组件(例如照明和雾)。这就是固定功能管道分离这两个矩阵的原因。
所以你应该坚持使用API中指定的范例,尤其是永远不要相信任何无数糟糕的opengl“教程”。
答案 1 :(得分:2)
我不确定我理解这个问题。你在问为什么页面告诉你不要做一些只能“大部分时间”工作的事情吗?
这真的不难理解。根据定义,“大多数此类用法”意味着某些这样的用法做会出现问题。
所以你可以做有时会工作的事情,然后打破其他时间,或者你可以做始终工作的事情。
这不是一个艰难的选择。甚至更多,因为这样做是正确的方式意味着逐字地将一行代码移动几行。
答案 2 :(得分:1)
我的问题是:在现实生活中使用gluLookAt()的最佳方法是什么?在GL_PROJECTION矩阵上使用它真的很不可能吗?
始终使用模型视图矩阵来定位视点。这甚至在矩阵的名称模型(即几何体的放置)和视图(视点的放置)中。
投影矩阵是OpenGL“相机”的镜头。您不要移动相机的镜头,保持相机机身就位以设置视图,对吗?移动镜头有其应用,例如实现倾斜/移位效果。