我的代码目前看起来像这样:
glViewport (0, 0, this->w(), this->h());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
//glTranslated (m_fXmovement, 0.0, m_fZmovement - 5);
//glRotated (m_fYangleView, 1.0, 0.0, 0.0);
//glRotated (m_fXangleView, 0.0, 1.0, 0.0);
///// Model View \\\\\
glMatrixMode(GL_MODELVIEW);
glTranslated (m_fXmovement, 0.0, m_fZmovement - 5 );
glRotated (m_fYangleView, 1.0, 0.0, 0.0);
glRotated (m_fXangleView, 0.0, 1.0, 0.0);
DrawWaveFrontObject (m_pDataObjectMedia);
glPushMatrix();
glTranslated (0.0, -3.0, 0.0);
DrawArea();
glPopMatrix();
DrawClickAnimation();
glLoadIdentity();
首先,我在GL_PROJECTION中运动部件,所有都运行良好,直到我使用雾....感觉就像相机没有移动,感觉更像是指向那台相机的额外相机......
然后我意外地将运动部件复制到了GL_MODELVIEW,并且雾就像我希望它一样行动......一切都很好,接受点击动画不再与该区域有关,现在动画移动了以我的自我观点......我真的不明白我必须在这两个VIEW中添加什么样的图画。任何人都可以根据我的代码给我提供示例或解释,或暗示我可以在我的风格中改进什么?
答案 0 :(得分:9)
投影矩阵用于创建观看量。想象一下 在现实世界中的场景。你真的没有看到周围的一切, 只有你眼睛允许你看到的东西。如果你是一条鱼,比如你 看事情有点宽泛。所以当我们说我们设置投影时 矩阵我们的意思是我们设置了我们想要从场景中看到的东西 我们创造。我的意思是你可以在世界的任何地方绘制物体。如果他们 不在视图卷内你不会看到任何东西。当你创建 视图体积假设您创建了6个定义的剪裁平面 你的视野。
对于模型视图矩阵,它用于制作各种各样的 转换为您世界中的模型(对象)。喜欢这个你 只需要定义一次对象然后翻译它或旋转 它或缩放它。
在绘制对象之前,您可以使用投影矩阵 场景设置视图音量。然后你绘制你的对象并更改 因此,模型视图矩阵。当然你可以改变你的矩阵 如果您想要绘制场景,则绘制模型的中途 然后绘制一些文本(使用某些方法可以更轻松地工作 在正交投影中)然后改回模型视图矩阵。
至于名称模型视图,它与建模的二元性有关 并查看转换。如果您将相机拉回5个单位,或者 向前移动物体5个单位它基本上是相同的。
答案 1 :(得分:2)
首先,我建议您尝试放弃固定功能管道(glTranslate等),因为它已经被淘汰了10年了。如果您有兴趣,请查看here以获得更现代的教程。
至于你的问题,你可以想象这两个矩阵的含义:投影矩阵基本上捕捉了摄像机本身固有的属性,就像它的视场形状一样。
另一方面,模型视图矩阵由两部分组成,模型矩阵和视图矩阵。模型部分用于从对象空间(相对于对象本身)转换到世界空间。然后,视图部分从那里转换到眼睛空间,其中相机位于原点并指向(负?)z轴。模型视图矩阵一起基本上说明了如何相对于摄像机定位对象。
有关详细信息,this资源提供了OpenGL上下文中图形转换的详细说明。
[2017年1月] 修改:这些天,第一个链接中的页面似乎无法访问,因此其归档中还有另一个link to the same content。