1. 程式人生 > >3D動畫實現原理

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動畫效果拉~