10

我正在尝试在 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 轴上旋转会产生所需的结果。

4

6 回答 6

7

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

glMatrixMode(GL_MODELVIEW);

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

于 2008-08-23T03:38:22.613 回答
6

你得到1个单位的直线吗?看来90度腐烂了。Y 附近会让你看到一个没有深度的三角形的边。

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

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

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

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

于 2008-08-23T03:40:29.037 回答
5

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

编写的代码存在两个主要问题:

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

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

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

于 2008-09-15T23:41:56.617 回答
1

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

于 2008-09-02T04:10:48.743 回答
1

我想推荐一本书:

3D 计算机图形学: Samuel R. Buss的 OpenGL 数学介绍

它提供了非常清晰的解释,并且数学广泛适用于非图形领域。您还将找到关于正交投影与透视变换的详尽描述。

于 2008-09-02T10:47:00.460 回答
1

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

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

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

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

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

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

玩得开心

于 2008-09-15T19:08:35.400 回答