2012-08-12 70 views
4

作爲android和openGL 2.0 es的初學者,我正在測試簡單的東西並看看它是怎麼回事。使用setLookAtM方法的Android OpenGL怪異

我下載了樣本http://developer.android.com/training/graphics/opengl/touch.html

我更改了代碼,檢查是否可以在(0,0,0)點(方形中心)周圍爲相機旋轉動畫。

所以我這樣做:

public void onDrawFrame(GL10 unused) { 
    // Draw background color 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

    // Set the camera position (View matrix) 
    long time = SystemClock.uptimeMillis() % 4000L; 
    float angle = ((float) (2*Math.PI)/ (float) 4000) * ((int) time); 
    Matrix.setLookAtM(mVMatrix, 0, (float) (3*Math.sin(angle)), 0, (float) (3.0f*Math.cos(angle)),  0 ,0, 0,  0f, 1.0f, 0.0f); 

    // Calculate the projection and view transformation 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 

    // Draw square 
    mSquare.draw(mMVPMatrix); 
} 

我希望相機總是看向方(的(0,0,0)點)的中心,但是這不會發生什麼變化。相機確實是繞着廣場,但廣場上並沒有停留在屏幕的中央..而是沿移動X軸...: enter image description here enter image description here

我還預計,如果我們給eyeX和eyeY值相同的centerX和centerY,像這樣:

Matrix.setLookAtM(mVMatrix, 0, 1, 1, -3,  1 ,1, 0,  0f, 1.0f, 0.0f); 

方將保持它的形狀(我的意思是,你的視野會被拖累,而是沿着這將是相同常到廣場上平面) ,但這也不會發生什麼:

enter image description here

這是我的投影矩陣:

float ratio = (float) width/height; 

// this projection matrix is applied to object coordinates 
// in the onDrawFrame() method 
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 2, 7); 

這到底是怎麼回事?

回答

8

看看你下載的例子的源代碼,我可以看到你爲什麼會遇到這個問題,它與矩陣乘法的順序有關。

通常在OpenGL源看到矩陣設置,使得

transformed vertex = projMatrix * viewMatrix * modelMatrix * input vertex

然而,在你下載的源示例程序,它們的着色器設置是這樣的:

" gl_Position = vPosition * uMVPMatrix;"

位於矩陣另一側的位置。您可以用這種方式使用OpenGL,但它需要您逆轉矩陣乘法的lhs/rhs。

長話短說,你的情況,你應該改變你的着色器閱讀:

" gl_Position = uMVPMatrix * vPosition;"

,然後我相信你會得到預期的行爲。

+0

是的,它的工作原理是這樣的,但現在輪換被綠色三角形「破壞」了(你知道,他們在教程中有這個三角形)。我看到了你的新問題,我一定會保留關注它。當我學習我的CG課程時,我已經完成了一個Matlab微型3d渲染器,我曾經很熟悉這些轉換。但現在,我有點生疏。這是令人困惑的,因爲有很多方法可以做到這一點。改變乘法的順序,轉置矩陣等。而且我不熟悉輔助函數足以突破這個在這一刻。順便說一下,有沒有打印矩陣功能可用? – jmacedo 2012-08-12 23:49:37

+1

@joxnas:'Arrays.toString(matrix)' – Tim 2012-08-13 02:34:33

+0

至於現在不工作的旋轉,有什麼線索? 它們具有: 'Matrix.setRotateM(mRotationMatrix,0,裂傷,0,0,-1.0F); Matrix.multiplyMM(mMVPMatrix,0,mRotationMatrix,0,mMVPMatrix,0);' 三角形圍繞旋轉古怪儘管如果我將投影矩陣設置爲Matrix.frustumM(mProjMatrix,0,-1,1,-1,1,2,7);而不是Matrix.frustumM(mProjMatrix ,0, - 比率,比率,-1,1,2,7)',當然屏幕偏斜。 我試着用乘法中的MVPMatrix交換旋轉矩陣,但沒有得到任何好的結果。 – jmacedo 2012-08-13 03:26:52