2012-02-22 33 views
0

這已被問及很多很多次,並且我已經閱讀了大量關於它的帖子和論壇,但我無法得到一個對象圍繞它自己的軸旋轉。 我得出這樣幾個對象:在OpenGL中推動/流行矩陣和圍繞自己的軸旋轉個體對象

gl.glMatrixMode(GL2.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
..... 
gl.glPushMatrix(); 
     gl.glRotatef(angle, 0.0f, 1.0f, 0.0f); 
     gl.glTranslatef(0.0f, 0.0f, 0.0f); 
     texture.bind(gl); 
     gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt); 
     gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt); 
     gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt); 
     gl.glDrawElements(GL2.GL_TRIANGLES, countI, GL2.GL_UNSIGNED_SHORT, indexRLt); 
     gl.glPopMatrix(); 

,這是正確繪製,所有紋理和應用法線..

我知道OpenGL的反向執行命令,所以這就是爲什麼glRotatef是第一。另外我知道所有的旋轉都在原點附近,所以我需要將對象轉換爲原點(不是我認爲必須的,因爲「筆」已經在原點,因爲我在繪製每個對象之前保存矩陣並且之後彈出)。這是與glDrawElements的東西?有些東西看起來不正確。

任何幫助將不勝感激。 :)

編輯:我可以看到物體如何圍繞主x軸旋轉,但我希望它們圍繞其本地x軸旋轉。

+5

這並不是OpenGL「反向執行命令」,而是轉換矩陣的組成方式。 – andrewmu 2012-02-22 17:01:34

+0

你想要做的是將操作視爲在本地而不是全局應用。因此,在您的示例中,您圍繞本地Y軸旋轉,然後在該新座標系中進行平移。如果你想旋轉更多的地方,那麼他們需要以後做。但是,在您的示例中,您的翻譯爲零,因此它沒有任何作用,訂單也無關緊要。也許你只是誤解了對象的軸。 – 2012-02-22 17:25:44

回答

0

「OpenGL反向執行命令」意味着它從右向左乘以變換矩陣。這是什麼意思?

想象轉型A和B:通過A和產量

y = Ax 

轉換xy

這相當於:

// sudo code: 
glA() 
glDraw(x) 

現在,通常情況下,在節目你覺得你爲了你寫他們的轉變。所以,你認爲

glA() 
glB() 
glDraw(x) 

會給你

y = BAx 

但這是錯誤。實際上,你可以:

y = ABx 

這意味着,第一B應用於x然後A的結果。

放在英語,看看這個例子:

glScalef(...)   // third, scale the whole thing 
glTranslatef(...)  // second, translate it somewhere 
glRotatef(...)   // first, rotate the object (or course, 
         // around its own axes, because the object is at origin) 
glDrawElements(...) // draw everything at origin 

所以,你需要做的就是寫:

// When everything is drawn, move them to destination: 
gl.glTranslatef(destination[0], destination[1], destination[2]); 
// For every object, rotate it the way it should, then restore transformation matrix 
// object: RLt 
gl.glPushMatrix(); 
    gl.glRotatef(angle, 0.0f, 1.0f, 0.0f); 
    texture.bind(gl); 
    gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt); 
    gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt); 
    gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt); 
    gl.glDrawElements(GL2.GL_TRIANGLES, countI, GL2.GL_UNSIGNED_SHORT, indexRLt); 
gl.glPopMatrix(); 
// object: RLt2 
gl.glPushMatrix(); 
    gl.glRotatef(angle2, 0.0f, 1.0f, 0.0f); 
    texture.bind(gl); 
    gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt2); 
    gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt2); 
    gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt2); 
    gl.glDrawElements(GL2.GL_TRIANGLES, countI2, GL2.GL_UNSIGNED_SHORT, indexRLt2); 
gl.glPopMatrix(); 
+1

感謝@Shahbaz的快速反應!不幸的是,我已經嘗試過(現在再試一次,只是爲了確保),但效果是一樣的:( 我已經添加gl.glTranslatef(0.0f,0.0f,0.0f)之前繪製任何東西在開始的時候,OpenGL的術語 - 效果是一樣的;有些奇怪的是,甚至在它只旋轉其中一個對象之前,但它是用glBegin而不是頂點數組繪製的 – Peter 2012-02-22 17:18:49

+1

請注意, glTranslatef(0,0,0)不會將對象帶到原點,它只是移動它(0,0,0),這意味着它什麼也不做。如果你的對象在(x,y,z)你應該用(-x,-y,-z)來翻譯它,注意,如果你以前的轉換包含了旋轉和縮放,這會變得非常複雜。在這種情況下你最好的選擇是從opengl獲取轉換矩陣,翻譯部分並做相反的處理。 – Shahbaz 2012-02-22 18:11:01

+0

我確實懷疑過那樣的事情,這真的是複雜的操作,這樣一個簡單的事情要做:D – Peter 2012-02-22 18:39:33

0

我不知道,你是否正在更新'角度'週期性地變化。如果你不是,那麼就不會有任何輪換。僞代碼如下。您可以使用gluttimerfunc定期更新變量。

for(every opengl loop)

angle + = 5。0f

Satish