2015年4月11日 星期六

Android 魔術方塊開發筆記(四) 投影與旋轉

投影

不知道各位有沒有注意到一件事
上一章的正方形不是正的是長的!!

造成這個的原因
就是因為我們的GLSurfaceView本來就是長的
畫出來的正方形就會因此而拉長!!


(取自google API guide)

解決方法其實也很簡單
只要將我們的座標點
經由矩陣運算投影
就能畫出真正的正方形

1. 更改shader code

    我們可以將座標與矩陣的運算交給底層,JAVA層的運算越少越好
    在GLShaderFactory做了以下修改:



    MVP 是 Model View Projection的縮寫
    在這裡將uMVPMatrix帶進去做運算

2. 建立Projection Matrix


    在GLES20Randerer 的 onCreate有View的長寬資訊:width, height
    將width, height相除得到長寬的比值ratio
    接著呼叫Native function : Matrix.frustumM(float[] m, int offset, float left, float right, float bottom, float top, float near, float far)
    得到4*4矩陣mProjectionMatrix


攝影機

接下來我們可以決定從哪裡觀察
下面這張圖可以讓大家有個初步的概念
這裡一樣是矩陣運算

3. 建立 View Matrix

    Matrix.setLookAtM(...)可以很簡單的建立上述的矩陣

4. 組合MVP Matrix

   要注意矩陣是沒有交換律的,矩陣相乘順序不能放錯
   完整程式碼:

5. 改寫Square

   這邊其實也沒做太大的變動
   只有取得uMVPMatrix的handle
   並將我們計算得到的MVP Matrix傳給底層

   如此一來已經大功告成,正常顯示出一個正方形了
   *可以更改看看frustumM(), setLookAtM()的參數,會更加了解上面這幾張圖所代表的意義

旋轉

直到現在都是很無聊的一張圖
加個旋轉讓他動起來吧!!

6. 建立Rotation Matrix

Matrix一樣提供了一個簡單的函式來計算旋轉矩陣


這樣就有動畫效果啦!!

Source Code:
Version : e013248db0

Reference:



沒有留言:

張貼留言