OpenGL旋转

时间:2020-03-05 18:42:20  来源:igfitidea点击:

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

解决方案

回答

通过在glRotatef调用之前添加以下内容,确保正在修改Modelview矩阵:

glMatrixMode(GL_MODELVIEW);

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

回答

我们得到1个单位的直线吗?似乎90度腐烂。 Y周围将让我们看着没有深度的三角形的边。

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

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

ModelView用于将多个对象放置在"世界"中的位置,Projection用于将对象放置在屏幕上。

代码看起来不错,因此我假定通过阅读文档可以知道glPushMatrix()之类的函数的本质。如果绕Z旋转仍然没有意义,请通过调用glMatrixMode来验证是否正在编辑ModelView矩阵。

回答

当我初次了解OpenGL时,NeHe教程(请参见左侧菜单)非常宝贵。

回答

我想推荐一本书:

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

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

回答

关于投影矩阵,我们可以从这里找到一个很好的起点:

http://msdn.microsoft.com/zh-CN/library/bb147302(VS.85).aspx

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

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

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

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

玩得开心

回答

除非我们在此代码之前做过一些奇怪的事情,否则"接受的答案"不能完全正确地绕着Z旋转将无法看到此三角形。在这种情况下,删除glOrtho(...)调用可能已解决了该问题,但是我们仍然还有其他一些问题。

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

  • 我们以前是否放置过相机?在OpenGL中,摄影机位于原点,俯视Z轴,正Y向上。在这种情况下,三角形在与眼睛相同的平面上绘制,但在右上方。除非我们有一个非常奇怪的投影矩阵,否则我们将看不到它。 gluLookat()是执行此操作最简单的命令,但是可以使移动当前矩阵的任何命令(应为MODELVIEW)生效。
  • 我们正在用左手或者顺时针方法绘制三角形,而OpenGL的默认设置是右手或者逆时针坐标系统。这意味着,如果我们要剔除背面(我们可能不是,但可能会随着前进而前进),我们将看不到预期的三角形。若要查看该问题,请将右手放在脸部前面,并想象它在XY平面中,以绘制顶点(1,1)至(3,2)至(3,1的顺序)移动手指)。执行此操作时,拇指背对着脸,这意味着我们正在看三角形的背面。我们需要养成使用右手方法绘制面的习惯,因为这是在OpenGL中完成的常用方法。

我能推荐的最好的方法是使用NeHe教程http://nehe.gamedev.net/。他们首先向我们展示了如何在多个系统中设置OpenGL,如何移动到绘制三角形,并缓慢而肯定地继续学习更高级的主题。它们非常容易遵循。