2010-06-17 86 views
0

我最近開始使用iPhone的OpenGL ES,並且遇到了一些問題。我希望能夠用手指旋轉物體。我的問題是我把我的對象放置在(0,0,-3),我想旋轉它的中心。我知道我需要翻譯回原點,旋轉,然後將其帶回原來的位置。我認爲我面臨一個問題,因爲我正在使用一個矩陣來跟蹤(?)我所有的旋轉/平移/縮放等,我認爲它可能會以一種甚至沒有考慮到順序的方式組合操作(所以這兩個翻譯會相互抵消)。我剛剛開始學習OpenGL,並且是一個完整的新手,所以我的假設可能是錯誤的。在OpenGL ES for iPhone中旋轉對象[翻譯爲原點 - >旋轉 - >翻譯不起作用]

這裏是在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 

幫助將不勝感激,謝謝!

+0

把變換串起來很好。這就是矩陣如何轉換的工作。究竟是不是在工作呢? – Alan 2010-06-17 01:50:53

+0

即使使用glTranslatef(0,0,3),它似乎就像我在翻譯之前要求它旋轉一樣。因此,如果我要求它相對於(1,0,0)旋轉,在平移到原點後,我會期望它相對於其中心旋轉,但它繞着一個大圓而不是旋轉。 – 2010-06-17 02:05:37

回答

0

檢索模型視圖矩陣,然後在你的旋轉看起來很腥後再乘上它,但這取決於你的其他變換是什麼以及事情應該是什麼座標空間。您對glMultMatrix行的評論與您正在做的事情不符。

通常情況下,您只需在渲染對象之前對對象執行translate + rotate + translate作爲最本地操作即可。另請注意,只有當對象位於對象空間中的(0,0,-3)時才適用。如果它在世界空間中的那個位置,那麼如果先前已經進行了一系列變換調用(平移,旋轉等)以將對象移動到其在世界中的預期位置,則旋轉已經將物體圍繞其中心旋轉。

變換順序是學習OpenGL的棘手部分之一。作爲一般的經驗法則,您的操作從最外層開始並進展到最內層。因此,一個典型的簡單變換集合將是:相機變換的倒數,以移動世界以與相機匹配,然後對象的平移將其移至其世界空間位置,然後旋轉以設置其預期方向。 PushMatrix/PopMatrix堆棧函數允許您保存和撤消該系列變換的一部分,以便對象組可以共享該鏈的部分。

+0

這是否意味着如果我擺脫了矩陣的東西,只是做一個變換 - >旋轉 - >變換,它會工作嗎?因爲我剛剛嘗試過,而且它似乎仍然很有趣。 另外,感謝您的深思熟慮的迴應。這非常有幫助。 – 2010-06-17 02:20:52

+0

我剛剛擺脫了一切,但旋轉,它神奇的作品。我不知道爲什麼,但它確實......有點困惑,但有點高興。再次感謝你。 – 2010-06-17 02:42:56