我正在尝试在 OpenGL 中进行简单的旋转,但一定没有抓住重点。我并不是在寻找具体的修复方法,而是在寻找快速解释或更普遍地解释 OpenGL 旋转的链接。

目前我有这样的代码:

glPushMatrix();
  glRotatef(90.0, 0.0, 1.0, 0.0);
  glBegin(GL_TRIANGLES);        
    glVertex3f( 1.0, 1.0, 0.0 );        
    glVertex3f( 3.0, 2.0, 0.0 );        
    glVertex3f( 3.0, 1.0, 0.0 );        
  glEnd();
glPopMatrix();

但结果并不是一个旋转90度的三角形。

编辑嗯,感谢 Mike Haboustak - 看来我的代码正在调用使用 glOrtho 的 SetCamera 函数。我对 OpenGL 太陌生,不知道这意味着什么,但禁用它并在 Z 轴上旋转会产生所需的结果。

有帮助吗?

解决方案

你能得到一条 1 单位的直线吗?看起来90度腐烂。Y 周围会让你看到一个没有深度的三角形的边。

您应该尝试绕 Z 轴旋转,看看是否得到更有意义的结果。

OpenGL 有两个与几何显示相关的矩阵:模型视图和投影。在数据在屏幕上可见之前,两者都会应用于坐标。首先应用模型视图矩阵,将数据从模型空间转换到视图空间。然后应用投影矩阵来转换视图空间中的数据,以便“投影”到 2D 显示器上。

ModelView 用于将多个对象定位到它们在“世界”中的位置,Projection 用于将对象定位到屏幕上。

您的代码看起来不错,所以我假设通过阅读文档您知道像 glPushMatrix() 这样的函数的本质是什么。如果绕 Z 轴旋转仍然没有意义,请验证您是否正在通过调用 glMatrixMode 编辑 ModelView 矩阵。

其他提示

通过在 glRotatef 调用之前添加以下内容,确保您正在修改模型视图矩阵:

glMatrixMode(GL_MODELVIEW);

否则,您可能会修改投影或纹理矩阵。

“接受的答案”并不完全正确 - 围绕 Z 旋转不会帮助您看到这个三角形,除非您在此代码之前做了一些奇怪的事情。删除 glOrtho(...) 调用可能可以纠正这种情况下的问题,但仍然存在一些其他问题。

所编写的代码有两个主要问题:

  • 您之前放置过相机吗?在OpenGL中,相机位于原点,沿Z轴向下看,Y轴正向向上。在本例中,三角形是在与您的眼睛相同的平面上绘制的,但位于上方和右侧。除非你有一个非常奇怪的投影矩阵,否则你不会看到它。gluLookat() 是执行此操作最简单的命令,但是任何移动当前矩阵(应该是 MODELVIEW)的命令都可以工作。

  • 您以左手或顺时针方法绘制三角形,而 OpenGL 的默认坐标系是右手或逆时针坐标系。这意味着,如果您正在剔除背面(您可能不会,但随着您变得更先进,可能会继续这样做),您将不会看到预期的三角形。要查看该问题,请将右手放在脸前,想象它在 X-Y 平面中,按照绘制顶点 (1,1) 到 (3,2) 到 (3,1) 的顺序移动手指)。当你这样做时,你的拇指背对着你的脸,这意味着你正在看三角形的背面。您需要养成用右手方法绘制面的习惯,因为这是 OpenGL 中常用的方法。

我可以推荐的最好的事情是使用 NeHe 教程 - http://nehe.gamedev.net/. 。他们首先向您展示如何在多个系统中设置 OpenGL,然后转向绘制三角形,然后缓慢而坚定地继续讨论更高级的主题。他们很容易跟随。

当我第一次看到 OpenGL 时, NeHe教程 (参见左侧菜单)非常宝贵。

我想推荐一本书:

3D 计算机图形:OpenGL 数学简介 作者:塞缪尔·R.巴斯

它提供了非常清晰的解释,并且数学广泛适用于非图形领域。您还可以找到正交投影与正交投影的完整描述。视角转换。

关于投影矩阵,您可以在这里找到一个很好的来源:

http://msdn.microsoft.com/en-us/library/bb147302(VS.85).aspx

它解释了一些有关如何构造一种类型的投影矩阵的信息。正交投影是这种矩阵的非常基本/原始的形式,基本上它的作用是获取 3 个轴坐标中的 2 个并将它们投影到屏幕上(您仍然可以翻转轴并缩放它们,但没有扭曲或透视效果) 。

矩阵变换很可能是 3D 渲染时最重要的事情之一,基本上涉及 3 个矩阵阶段:

  • Transform1 = 对象坐标系到世界坐标系(例如 - 对象旋转和缩放)
  • Transform2 = 世界坐标系到相机(将对象放置在正确的位置)
  • Transform3 = 相机坐标系到屏幕空间(投影到屏幕)

通常,3 个矩阵相乘的结果被称为 WorldViewProjection 矩阵(如果您曾经遇到过这个术语),因为它将坐标从模型空间转换到世界,然后转换到相机,最后转换到屏幕表示。

玩得开心

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top