我正在为iPhone制作一款简单的游戏,并试图实现在GLView周围移动相机的效果。
我使用带有顶点和颜色指针的glDrawArrays
绘制了大约一百个对象。在此之后,我想将相机向右移动1个单位。这是我在drawView
方法中的代码片段。我将矩阵模式更改为投影堆栈,然后在项目操作完成后更改回模型视图模式(我可能会出错,我是OpenGL的新手)。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glTranslatef(1.0, 0.0, 0.0);
glMatrixMode(GL_MODELVIEW);
无论如何,结果绝对不是预期的。发生的事情是我非常简短地看到我的物体(可能是一个框架),然后它们消失了。如果我拿走上面某个区块中的glTranslatef
,就会发生同样的事情。
我做错了什么?
提前致谢!
答案 0 :(得分:6)
初学者OpenGL的一个令人困惑的方面是投影矩阵中发生的事情与模型视图矩阵发生的事情之间的区别(为什么你甚至需要它们?)
投影矩阵负责将顶点的坐标转换为2D坐标系中的点(它将世界推向虚拟胶片 - 视口)。投影矩阵仅指定相机的行为(例如:它应该是广角镜头,还是长焦镜头,还是完全正交的镜头,如建筑倾斜图纸?)。
另一方面,模型视图矩阵负责指定顶点到达3D空间的位置。因此,例如,要指定角色的手臂相对于角色的身体的位置,或者角色相对于世界的位置,您将需要更改模型视图矩阵。特别要注意的是,摄像机位置和方向的变化属于模型视图矩阵(它是“视图”的一部分)
令人困惑的原因是,在一天结束时,您给OpenGL的顶点乘以模型视图矩阵,然后乘以投影矩阵。也就是说,给定模型视图矩阵M,投影矩阵P和顶点v,顶点的最终坐标由P M v给出。这意味着无论您使用哪种矩阵,某些转换似乎都有效。你应该小心这一点 - 当你使用更高级的OpenGL技术时,你会遇到使用正确矩阵产生影响的情况。
然而,在你达到这一点之前,让我给你一个好的经验法则。在您习惯了两个矩阵之间的区别之前,只需在投影矩阵上使用glOrtho
或glFrustum
(gluPerspective
,他们的朋友也可以)。所有其他来电(glTranslate
,glScale
,glRotate
等)都属于您应该对模型视图矩阵进行的操作。
答案 1 :(得分:4)
您可能想阅读http://www.opengl.org/resources/faq/technical/viewing.htm(特别是第8.080节)。
使用以下内容:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// setup your projection matrix here, e.g. with glFrustum or gluPerspective
glFrustum(...)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...) // with your gluLookAt parameters, of course
glTranslatef(1.0, 0.0, 0.0);
// your drawing code here
只是为了澄清:gluLookAt
创建一个矩阵,该矩阵与模型视图矩阵相乘。如果您使用上面建议的函数调用顺序,事情应该按预期工作。
我希望有所帮助。