在OpenGL ES for iPhone中旋转对象[转换为原点 - >旋转 - >翻译不起作用]

时间:2010-06-17 01:48:12

标签: iphone opengl-es

我最近开始使用OpenGL ES用于iPhone,我遇到了一些麻烦。我希望能够用手指旋转物体。我的问题是我的对象放在(0,0,-3),我想围绕它的中心旋转它。我知道我需要转换回原点,旋转,然后将其带回原始位置。我认为我遇到了一个问题,因为我正在使用矩阵来跟踪(?)我所有的旋转/平移/缩放等,我认为它可能是以甚至不考虑顺序的方式组合操作(所以这两个翻译会相互抵消)。我刚刚开始在一天前学习OpenGL,并且是一个完整的新手,所以我的假设可能是错的。

这是drawView中我遇到问题的部分:

GLfloat matrix[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
glLoadIdentity();
glTranslatef(0, 0, 3); // bring to origin
glRotatef(self.angle, self.dy, self.dx, 0); // rotate 
glTranslatef(0, 0, -3); // put it back in place 
glMultMatrixf(matrix); // save the transformations performed

非常感谢帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

检索模型视图矩阵,然后在旋转之后将其重新加倍,但这取决于你的其他变换是什么以及应该是什么样的坐标空间。您对glMultMatrix行的评论与您正在做的事情不符。

通常,您只需将translate + rotate + translate作为对象上最本地的操作,就在渲染之前。另请注意,这仅适用于对象空间中的对象位于(0,0,-3)的情况。如果它位于世界空间中的那个位置,那么如果您之前已经进行了一系列变换调用(平移,旋转等)以将对象移动到其在世界中的预期位置,则旋转将已经围绕其自己的中心旋转对象。

转换顺序是学习OpenGL的棘手部分之一。作为一般经验法则,您的操作从最外层开始,然后进入最内层。因此,一组典型的简单变换将是:相机变换的反转以移动世界以匹配相机,然后是对象的平移以将其移动到其世界空间位置,然后旋转以设置其预期方向。 PushMatrix / PopMatrix堆栈功能允许您保存和撤消该系列变换的一部分,以便对象组可以共享该链的一部分。