OpenGL/GLUT:glTranslatef 和 glRotatef 在绘制立方体之前还是之后?

Posted

技术标签:

【中文标题】OpenGL/GLUT:glTranslatef 和 glRotatef 在绘制立方体之前还是之后?【英文标题】:OpenGL/GLUT: glTranslatef and glRotatef before drawing cube, or after? 【发布时间】:2014-12-02 19:31:05 【问题描述】:

我目前正在使用 OpenGL 和 GLUT 框架来玩粒子。

但是,我似乎可以让我的逻辑在旋转/翻译中正常工作。

我目前情况的伪代码:

void display() 
     drawEnvironment();

     for each particle 'part' in the array 
          glPushMatrix(); // pushes the matrix for the current transformations? i.e. this particle?

          glRotatef(part.angles); // rotate this matrix based of it's own angles (constantly changing)

          drawParticle(part); // draws at origin

          glTranslatef(part.positon); // translate to the position

          glPopMatrix();
     

我认为我在这里做的如下:

    从堆栈中推送我需要的变换矩阵(针对当前粒子) 旋转所述矩阵(glRotatef 围绕原点 (0,0,0) 旋转) 在原点绘制粒子,使其原地旋转 将粒子平移到它现在已经旋转的位置 将转换矩阵弹出回堆栈

我也尝试过平移 -> 旋转 -> 绘图,以及其他一些混合。

如果没有简短的视频,很难解释出了什么问题: https://www.youtube.com/watch?v=G0ouhCKKcIM

看起来它在被平移后在旋转,所以由于它围绕原点旋转,它会跟随更大的圆圈,而不是在它自己的轴上旋转。

【问题讨论】:

在绘图过程中应用变换。绘制后对变换矩阵进行任何更改均无效。 OpenGL 只是一些在数字画布上绘制的复杂铅笔,一旦绘制了图片的一部分,OpenGL 就已经忘记了它。 【参考方案1】:

应按以下顺序应用转换:

    从堆栈中推送矩阵 平移到位置 旋转它 画出来 弹出矩阵

这是因为 OpenGL 通过预乘法工作。第一个操作最后执行。

【讨论】:

非常感谢!原来我有这个确切的订单,除了我的问题是当我在玩这些订单时。在这种情况下,我正在转换为与粒子位置相等的坐标“点”。后来(在平移和旋转之后),当在位置绘制粒子时,我忘记将“点”重置为原点,所以基本上我几乎是在 (position.x + position.x, position.y + position.y,位置.z + 位置.z)

以上是关于OpenGL/GLUT:glTranslatef 和 glRotatef 在绘制立方体之前还是之后?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL/Glut 无法在其上绘制 [

OpenGL、GLUT、Cygwin - 无法打开显示“”

推荐的 OpenGL / GLUT 参考 [关闭]

OpenGL glut库

OpenGL/GLUT 圆锥表面法线

如何制作 OpenGL (GLUT) 旋转动画?