GL_MODELVIEW和GL_PROJECTION

时间:2013-03-18 17:04:27

标签: opengl

我的代码目前看起来像这样:

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中添加什么样的图画。任何人都可以根据我的代码给我提供示例或解释,或暗示我可以在我的风格中改进什么?

2 个答案:

答案 0 :(得分:9)

引自opengl.org forum

  

投影矩阵用于创建观看量。想象一下   在现实世界中的场景。你真的没有看到周围的一切,   只有你眼睛允许你看到的东西。如果你是一条鱼,比如你   看事情有点宽泛。所以当我们说我们设置投影时   矩阵我们的意思是我们设置了我们想要从场景中看到的东西   我们创造。我的意思是你可以在世界的任何地方绘制物体。如果他们   不在视图卷内你不会看到任何东西。当你创建   视图体积假设您创建了6个定义的剪裁平面   你的视野。

     

对于模型视图矩阵,它用于制作各种各样的   转换为您世界中的模型(对象)。喜欢这个你   只需要定义一次对象然后翻译它或旋转   它或缩放它。

     

在绘制对象之前,您可以使用投影矩阵   场景设置视图音量。然后你绘制你的对象并更改   因此,模型视图矩阵。当然你可以改变你的矩阵   如果您想要绘制场景,则绘制模型的中途   然后绘制一些文本(使用某些方法可以更轻松地工作   在正交投影中)然后改回模型视图矩阵。

     

至于名称模型视图,它与建模的二元性有关   并查看转换。如果您将相机拉回5个单位,或者   向前移动物体5个单位它基本上是相同的。

答案 1 :(得分:2)

首先,我建议您尝试放弃固定功能管道(glTranslate等),因为它已经被淘汰了10年了。如果您有兴趣,请查看here以获得更现代的教程。

至于你的问题,你可以想象这两个矩阵的含义:投影矩阵基本上捕捉了摄像机本身固有的属性,就像它的视场形状一样。

另一方面,模型视图矩阵由两部分组成,模型矩阵和视图矩阵。模型部分用于从对象空间(相对于对象本身)转换到世界空间。然后,视图部分从那里转换到眼睛空间,其中相机位于原点并指向(负?)z轴。模型视图矩阵一起基本上说明了如何相对于摄像机定位对象。

有关详细信息,this资源提供了OpenGL上下文中图形转换的详细说明。

[2017年1月] 修改:这些天,第一个链接中的页面似乎无法访问,因此其归档中还有另一个link to the same content