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