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 在绘制立方体之前还是之后?的主要内容,如果未能解决你的问题,请参考以下文章