天天看點

3D動畫實作原理

    通過變換矩陣,我們可以實作大多數的動畫效果,不過這種方式,大多實作的是一種2D效果,如果向實作三維空間中的效果又什麼方法呢?

    下面就為大家介紹Camera類,中文意思是攝像頭,當然這個指的可不是我們手機上那個照相用的那個攝像頭,這是一個邏輯概念,

    把我們手機的螢幕比作攝像頭視窗,透過這個視窗,我們看到裡面顯示的東西(就是我們應用的界面),

    當然如果我們從不同的角度來看螢幕中的物體,自然就會呈現出一種立體效果,這裡所說的不同角度是什麼意思呢,比如桌子上有一個杯子,

    我們從正面看它是一個樣,從後面看又是一個樣,從上面看又是另一個樣。

      這個概念應該不難了解,而Camera類就是用來做這個事情的,來看看下面這段代碼:

    protected void applyTransformation(float interpolatedTime, Transformation t) {

        final float fromDegrees = mFromDegrees;

        float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);

        final float centerX = mCenterX;

        final float centerY = mCenterY;

        final Camera camera = mCamera;

        final Matrix matrix = t.getMatrix();

        camera.save();

        if (mReverse) {

            camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);

        } else {

            camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));

        }

        camera.rotateY(degrees);

        camera.getMatrix(matrix);

        camera.restore();

        matrix.preTranslate(-centerX, -centerY);

        matrix.postTranslate(centerX, centerY);

    }

首先我們得到了一個變換矩陣,camera.save() 這句話是将目前的攝像頭位置儲存下來,以便變換進行完成後恢複成原位,接下來調用camera.translate

,這個方法接受3個參數,分别是x,y,z三個軸的偏移量,我們這裡隻将z軸進行了偏移,已開始的偏移是3000,随着時間的推移,這個偏移會越來越小。

這就會形成這樣一個效果,我們的View從一個很遠的地方向我們移過來,越來越近,最終移到了我們的視窗上面~

      camera.rotateY(360 * interpolatedTime) 這句話,是給我們的View加上旋轉效果,在移動的過程中,視圖還會移Y軸為中心進行旋轉。

      随後的 camera.getMatrix(matrix) ,這個是将我們剛才定義的一系列變換應用到變換矩陣上面,調用完這句之後,我們就可以将camera的位置恢複了,

      以便下一次再使用。接下來的調用上一篇中已經介紹過了,就不再贅述了~,完成這段代碼之後,我們就可以看到3D動畫效果拉~

繼續閱讀