標籤:android 圖片 matrix
網上查了一下相關的文章,認為自己看懂了,但是實際測試時和網上說的並不一樣(後來研究發現,那個人寫的是錯的!!!),所以,在此提醒大家,要勇於質疑,勇於提出問題。
首先說明camera類,這個類位於package android.graphics 包下,用於映像3D變換,通過旋轉、位移等方式,最終通過getMatrix(Matrix)方法拿到矩陣,作用於canvas,使得畫面呈現出立體效果。
camera的源碼沒什麼看的,這裡列舉他的主要方法:
public native void save(); public native void restore(); public native void translate(float x, float y, float z); public native void rotateX(float deg); public native void rotateY(float deg); public native void rotateZ(float deg); public native void rotate(float x, float y, float z); public native float getLocationX(); public native float getLocationY(); public native float getLocationZ(); public native void setLocation(float x, float y, float z); public void getMatrix(Matrix matrix) { nativeGetMatrix(matrix.native_instance); } public void applyToCanvas(Canvas canvas) { nativeApplyToCanvas(canvas.mNativeCanvas); } public native float dotWithNormal(float dx, float dy, float dz);
這些方法看起來都不難,通過字面意思可以大致進行瞭解,其中最後幾個方法目前還未研究,後面研究了補上。
接著我們來看看Camera變換的幾個軸座標,圖有點難看哈。
這個才是正確的x, y ,Z 軸座標,而另外一個文章說的左手座標系,經過我的驗證那個作者寫的是錯誤的。
camera位於座標點O點(0,0,0),也就是圖中的左上方
rotate
接著我們看如何旋轉,我們假設可以轉動圖中座標系,我們旋轉座標系,讓X軸正方向指向我們,也就是說這時候我們看過去A點和O點重合了(能理解嗎?不能理解拿個方塊東西轉著自己看)。然後,這時候沿著順時針進行旋轉,然後我們從手機螢幕方向觀察,就會發現變化了。
那我們再看一個例子:camera.rotateY(45)
他意思是繞y軸順時針旋轉45度。如果物體中間線和y軸重合,正繞y軸順時針旋轉45度就是指物體右半部分向裡翻轉,左半部分向外翻轉;
camera.rotateX(45)的意思是繞x軸順時針旋轉45度。舉例來說,如果物體中間線和x軸重合的話,繞x軸順時針旋轉45度就是指物體上半部分向裡翻轉,下半部分向外翻轉;
camera.translate(40, 30, 30)的意思,在圖中看就是把觀察物體右移40,下移30,向z軸正方向移20(即讓物體遠離螢幕,即物體將會變小);
我們看幾個圖來加深理解:
首先原圖:
進行變換:camera.rotateX(60);
進行變換: camera.rotateY(60);
進行變換:camera.rotateZ(-60); (這裡是-60哈)
translate和canvas的位移類似,這裡不再示意。
android camera擷取matrix作用於canvas的研究