我目前正在使用 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 通过预乘工作。第一个操作最后执行。
关于c - OpenGL/GLUT : glTranslatef and glRotatef before drawing cube, 或之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27257405/