2016-07-07 84 views
0

我有一個在我的3D世界中生成的基本立方體。我可以在相機周圍正確旋轉,但是當我旋轉後翻譯時,翻譯不正確。例如,如果我旋轉90度並平移到Z軸上,它將像在X軸上平移一樣移動。旋轉後在3D世界中翻譯的正確方法?

glLoadIdentity(); 
    glRotatef(angle,0,1,0);  //Rotate around the camera. 
    glTranslatef(movX,movY,movZ); //Translate after rotating around the camera. 
glCallList(cubes[0]); 

我需要一些幫助。另外,我在旋轉之前嘗試翻譯,但旋轉不在相機上。它位於立方體的邊緣。

回答

0

請記住,在OpenGL中,轉換應用於相機,而不是渲染的對象;因此您會觀察到您所期望的轉型的

另外在OpenGL中,Y和Z軸被翻轉(Y是垂直的),所以你觀察水平平移而不是垂直平移。另外,因爲物體圍繞Y旋轉了90度,X軸和Z軸相互替換(其中一個相反)。

+0

這給了我一些有用的信息。你知道在3D空間中正確翻譯的有用教程嗎? – newbcoder

+0

我認爲剛剛閱讀了一個座標幾何和線性代數課本,特別注意到了矩陣變換和訂購 – 2016-07-08 08:42:11

0

willywonkadailyblah的答案是一半正確的。因爲您使用的是舊的OpenGL,所以您正在使用舊的矩陣堆棧。當您正在進行glRotatef和glTranslatef調用時,您正在修改模型視圖矩陣。模型視圖矩陣實際上是模型的矩陣和相機的視圖矩陣的預先組合(已經相乘)。這些矩陣決定了您的物體在3D空間中的位置以及您的觀看位置/世界的方向。因此,您可以將您的電話視爲移動相機,但將它們視爲移動和旋轉世界可能更容易。

這些旋轉和平移調用是線性轉換。這有一個精確的定義,但對於我們的目的來說,這意味着您可以將變換表示爲矩陣,並將其與點的座標相乘以將變換應用於點。現在矩陣乘法不是可交換的,意味着AB!= BA。所有這一切都是說,當你旋轉時,然後翻譯它不同於翻譯和旋轉,我認爲你知道。但是當你再次翻譯,旋轉和翻譯時,跟着你實際做的事情可能更難一點。更糟糕的是,即使你在那裏投入一些縮放。所以我會建議學習線性變換是如何工作的,如果你對於學習OpenGL很認真的話,可以爲對象和相機維護自己的矩陣。

learnopengl.org是一個很好的網站,但它教你現代OpenGL,而不是你目前使用的。但transformationscoordinate systems上的課程可能通常很有幫助,即使沒有準確的代碼,您可以按照以下步驟操作:

+0

我會檢查你的鏈接並開始關注/學習那些教程。我從來沒有意識到有一個新的和舊的OpenGL,而我使用的是舊的。謝謝。 – newbcoder

+0

是的,直到今年年初,我都沒有,哈哈。我先學習了舊的OpenGL。在舊的OpenGL中,如果您想要傳入模型視圖矩陣而不是使用轉換,則仍然可以使用LoadMatrix。 –