Lee出品,轉載請注明出處:http://blog.csdn.net/hnulwt/article/details/42774015
網上查了一下相關的文章,認為自己看懂了,但是實際測試時和網上說的并不一樣(後來研究發現,那個人寫的是錯的!!!),是以,在此提醒大家,要勇于質疑,勇于提出問題。
首先說明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預設位置位于(0,0,-8)點,即我們現在電腦面前螢幕外距離O點8個機關處。
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的偏移類似,這裡不再上圖示意。