1

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

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 并且雾按照我想要的方式行动......一切都很好,接受点击动画不再与该区域相关,现在动画随着我的自我移动透视图....而且我真的不明白我必须在这两个视图中的哪一个中绘制什么样的图。谁能根据我的代码给我示例或解释,或者提示我可以在我的风格中改进什么?

4

2 回答 2

11

来自opengl.org 论坛的引用:

投影矩阵用于创建您的查看体积。想象现实世界中的一个场景。你并没有真正看到你周围的一切,只有你的眼睛让你看到的东西。例如,如果你是一条鱼,你会看到更广泛的事物。所以当我们说我们设置了投影矩阵时,我们的意思是我们设置了我们想要从我们创建的场景中看到的东西。我的意思是你可以在你世界的任何地方绘制物体。如果它们不在视图体积内,您将看不到任何东西。当您创建视图体积时,想象您创建了 6 个裁剪平面来定义您的视野。

至于模型视图矩阵,它用于对您世界中的模型(对象)进行各种转换。像这样,您只需定义一次对象,然后平移或旋转或缩放它。

您将在场景中绘制对象之前使用投影矩阵来设置视图体积。然后绘制对象并相应地更改模型视图矩阵。当然,您可以在绘制模型的过程中更改矩阵,例如,如果您想绘制场景然后绘制一些文本(使用某些方法可以在正交投影中更轻松地工作),然后改回模型视图矩阵。

至于名称 modelview,它与建模和查看转换的二元性有关。如果将相机向后拉 5 个单位,或者将对象向前移动 5 个单位,则基本相同。

于 2013-12-15T13:42:06.650 回答
1

首先,我建议您尝试放弃固定功能管道(glTranslate 等),因为它已经被弃用了 10 年。如果您有兴趣,请在此处查找更现代的教程。

至于您的问题,您可以想象这两个矩阵的含义:投影矩阵本质上捕获了相机本身固有的属性,例如其视野的形状。

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

有关更多信息,资源详细描述了 OpenGL 上下文中的图形转换。

[2017 年 1 月]编辑:来自第一个链接的页面这些天似乎无法访问,因此从他们的档案中还有另一个指向相同内容的链接。

于 2013-03-18T17:50:34.777 回答