2013-01-16 90 views
1

我想實現的東西簡單:設置X軸的平移和旋轉物體圍繞它由一個固定的角​​度中心。平移和旋轉圍繞中心

要做到這一點,據我目前所知,有必要將對象移動到中心,旋轉和移動回原來的位置。好的。雖然我得到的問題是,它看起來像對象旋轉它的本地軸,並沿着這些軸做最後一次翻譯,因此它以錯誤的位置結束。

這是我的代碼:

public void draw(GL10 gl) { 
    gl.glLoadIdentity(); 

    GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0); 

    gl.glTranslatef(x, 0, 0); 

    gl.glTranslatef(-x, 0, 0); 
    gl.glRotatef(-80, 0, 1, 0); 
    gl.glTranslatef(x, 0, 0); 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    gl.glFrontFace(GL10.GL_CW); 

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    gl.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES10.GL_UNSIGNED_SHORT, indicesBuffer); 
} 

旋轉的對象應該是在0,0,0之前。它正確旋轉。但是,它接近屏幕,就好像x軸會指向我(80°)一樣。

注:我只讓「OpenGL的」作爲標籤,因爲這是一個普通的OpenGL的問題,答案不應該是Android的相關。

回答

4

這是這樣做的過時的方式,但我想這是不回答問題的藉口。

的OpenGL如果多個變換應用到一個頂點執行以相反的順序的矩陣乘法。例如,如果一個頂點首先被MA變換,然後被MB變換,那麼OpenGL先執行MB×MA,然後再乘以頂點。所以,最後一個轉換是第一個,第一個轉換最後出現在您的代碼中。

gl.glPushMatrix(); 

gl.glTranslatef(globalX, 0, 0); 

gl.glTranslatef(localX, 0 ,0); 
gl.glRotatef(-80, 0, 1, 0); 

gl.glTranslatef(-globalX, 0, 0); 

gl.glPopMatrix(); 

首先從您在變換層次結構中的位置移動到原點。 然後圍繞該原點旋轉。 沿任何軸應用一些局部運動。 將對象移回其全局定位。

使用glPushMatrix()和glPopMatrix()可以取消對相同定位相同級別的元素的更改,它具有與它們相對定位的相同父元素。 推送保留了在上面的本地代碼中操作之後OpenGL應用的之前(父)對象的轉換,因爲它是公共堆棧(LIFO)的順序,在這種情況下是矩陣堆棧。