关于c ++:OpenGL旋转

关于c ++:OpenGL旋转

OpenGL Rotation

我正在尝试在OpenGL中进行简单的旋转,但必须遗漏要点。
我不是在寻找特定的修复程序,而只是在快速解释或更一般地解释OpenGL旋转的链接。

目前,我有这样的代码:

1
2
3
4
5
6
7
8
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矩阵:

1
glMatrixMode(GL_MODELVIEW);

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


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

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

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

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

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


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

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

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

  • 您正在用左手或顺时针方法绘制三角形,而OpenGL的默认设置是右手或逆时针坐标系统。这意味着,如果您要剔除背面(您可能不是,但可能会随着您的前进而前进),您将看不到预期的三角形。若要查看该问题,请将右手放在脸部前面,并想象它在XY平面中,以绘制顶点(1,1)至(3,2)至(3,1的顺序)移动手指)。执行此操作时,您的拇指背对着脸,这意味着您正在看三角形的背面。您需要养成使用右手方法绘制面的习惯,因为这是在OpenGL中完成的常用方法。

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


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

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

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

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

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

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

玩得开心


我想推荐一本书:

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

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


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


推荐阅读