天天看點

android camera擷取matrix作用于canvas的研究

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變換的幾個軸坐标,圖有點難看哈。

android camera擷取matrix作用于canvas的研究

這個才是正确的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(即讓物體遠離螢幕,即物體将會變小);

我們看幾個圖來加深了解:

首先原圖:

android camera擷取matrix作用于canvas的研究

進行變換:camera.rotateX(60);

android camera擷取matrix作用于canvas的研究

進行變換: camera.rotateY(60);

android camera擷取matrix作用于canvas的研究

進行變換:camera.rotateZ(-60); (這裡是-60哈)

android camera擷取matrix作用于canvas的研究

translate和canvas的偏移類似,這裡不再上圖示意。