c - OpenGL/GLUT : glTranslatef and glRotatef before drawing cube, 或之后?

标签 c opengl graphics rotation glut

我目前正在使用 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();
     }
}

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

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

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

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

看起来它在被平移后旋转,所以由于它围绕原点旋转,所以它沿着那个更大的圆旋转,而不是绕着它自己的轴旋转。

最佳答案

转换应按以下顺序应用:

  1. 将矩阵压栈
  2. 翻译到位置
  3. 旋转它
  4. 画出来
  5. 弹出矩阵

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

关于c - OpenGL/GLUT : glTranslatef and glRotatef before drawing cube, 或之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27257405/

相关文章:

C-发送awk脚本到Linux

c - 在进程之间分配几乎均等的任务

c++ - 无法使用 OpenGL 绘制 Sierpinski

opengl - 如何在opengl中渲染从一侧开始到另一侧的颜色渐变?

performance - `friday` 包很慢

查找 100 到 1000 之间素数的代码不起作用

opengl - 在 openGL 中纹理立方体的最佳方法

winapi - 禁用 GPU 加速

c++ - OpenGL 冒名顶替者球体 : problem when calculating the depth value

C:可以将变量传递给请求结构的函数,以便在调用函数时将这些变量包装到结构中吗?