【问题标题】:GL_MODELVIEW and GL_PROJECTIONGL_MODELVIEW 和 GL_PROJECTION
【发布时间】:2013-03-18 17:04:27
【问题描述】:

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

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

【问题讨论】:

  • 喂,伙计!拜托,拜托,请使用现代OpenGL!固定功能管道是旧的、已弃用、缓慢且不再酷的。使用 OpenGL 4.0+!着色器和 VAO 在各方面都好得多。第一次使用太阳镜时,您可能需要戴上它。
  • @GraphicsMuncher 但是拥有一台非常旧的电脑并且在我的学徒船上几乎没有赚到钱,这让我当时无法使用这些元素。所以不要误会我的意思。但是建议选择另一种技术作为解决方法从来都不是“如何解决问题”的真正答案。
  • 这不是对您问题的回答,而是评论。关键是,学习旧的 OpenGL 只会浪费你的时间来学习过时的代码,而当你不得不忘记它时,它会为你做更多的工作。不过,对不起你的旧电脑。大多数人使用旧 OGL 是因为他们在网上发现了一个过时的教程。

标签: opengl


【解决方案1】:

引用opengl.org forum:

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

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

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

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

【讨论】:

  • “当然你可以在绘图的中途改变你的矩阵”当然?我不知道我什么时候问的,我猜这正是帮助我摆脱困境的原因。所以,我没听错,有可能出于某种目的做类似glMatrixMode(GL_PROJECTION); /*some stuff*/ glMatrixMode(GL_MODELVIEW); /*some stuff*/ glMatrixMode(GL_PROJECTION); /*some stuff*/ glMatrixMode(GL_MODELVIEW); /*some stuff*/ 的事情?
  • 这是一个低效的答案。
  • [translate - rotate - scale] 将把你的对象放到世界上。视图矩阵会将其放入框架中,并且项目会扭曲以产生深度感。
【解决方案2】:

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

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

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

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

[2017 年 1 月] 编辑:来自第一个链接的页面这些天似乎无法访问,因此他们的存档中还有另一个 link to the same content

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 2015-06-30
    • 1970-01-01
    • 2013-06-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多