投影
不知道各位有沒有注意到一件事上一章的正方形不是正的是長的!!
造成這個的原因
就是因為我們的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:
沒有留言:
張貼留言