【问题标题】:OpenGL RotationOpenGL 旋转
【发布时间】:2010-09-06 15:19:50
【问题描述】:

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

【问题讨论】:

    标签: c++ opengl glut


    【解决方案1】:

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

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

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

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

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

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

    玩得开心

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        我想推荐一本书:

        3D Computer Graphics : A Mathematical Introduction with OpenGL 作者:塞缪尔·R·巴斯

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

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

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

            【讨论】:

            • 重要!另请参阅下面佩里的回答。
            【解决方案6】:

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

            glMatrixMode(GL_MODELVIEW);
            

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-11-29
              • 1970-01-01
              • 2019-05-03
              • 2017-08-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多