题
我正在尝试在 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教程 (参见左侧菜单)非常宝贵。
关于投影矩阵,您可以在这里找到一个很好的来源:
http://msdn.microsoft.com/en-us/library/bb147302(VS.85).aspx
它解释了一些有关如何构造一种类型的投影矩阵的信息。正交投影是这种矩阵的非常基本/原始的形式,基本上它的作用是获取 3 个轴坐标中的 2 个并将它们投影到屏幕上(您仍然可以翻转轴并缩放它们,但没有扭曲或透视效果) 。
矩阵变换很可能是 3D 渲染时最重要的事情之一,基本上涉及 3 个矩阵阶段:
- Transform1 = 对象坐标系到世界坐标系(例如 - 对象旋转和缩放)
- Transform2 = 世界坐标系到相机(将对象放置在正确的位置)
- Transform3 = 相机坐标系到屏幕空间(投影到屏幕)
通常,3 个矩阵相乘的结果被称为 WorldViewProjection 矩阵(如果您曾经遇到过这个术语),因为它将坐标从模型空间转换到世界,然后转换到相机,最后转换到屏幕表示。
玩得开心