关键帧和动画
關鍵幀和動畫
Keyframes and Animation
關鍵幀就是預先記錄各個級別的動畫數據。前面的機械手和太陽系系統都是在運行的時候計算出動畫的。
關鍵幀就是一個對于模型各級別在某個時刻的重要位置。比如關鍵轉完處,動作變向處等。
通過一定算法,計算機能自動計算出其關鍵幀之間的動作位置。這樣我們就能產生平滑的動畫了。如果做過flash和photoshop的朋友都知道這個概念。
但是怎么計算出?用什么算法?這就是個非常復雜的大問題了。比如用photoshop的會知道bezier曲線,那是由挺復雜的數學支持的。
而且一般不直接用矩陣來計算,而是把變換矩陣分解為三個部分旋轉(rotation),縮放( scaling),?移位(translation),(為什么?因為算法需要)。使用Direct3D函數:D3DXMatrixDecompose .
一般會用到四元組來表示旋轉。
計算中間幀的過程,計算t時段的中間幀:
1 找到兩個關鍵幀Kj和kj+1發(fā)生在t0,和t1,這樣t0<=t<=t1。
2 單位化t∈[t0,t1]到t∈[0,1],并使用插值算法計算其旋轉矩陣。
如下計算其中間幀的旋轉矩陣:
?
struct Keyframe {float time;D3DXQUATERNION R;D3DXVECTOR3 S;D3DXVECTOR3 T; };//用L返回計算所得的變換矩陣。 void interpolateBone(Keyframe& K0, Keyframe& K1, D3DXMATRIX& L) {// Transform to [0, 1]float t0 = K0.time;float t1 = K1.time;float lerpTime = (t - t0) / (t1 - t0);// Compute interpolated RST values.D3DXVECTOR3 lerpedT;D3DXVECTOR3 lerpedS;D3DXQUATERNION lerpedR;D3DXVec3Lerp(&lerpedT, &K0.T, &K1.T, lerpTime);//Direct3D函數,線性插值算法D3DXVec3Lerp(&lerpedS, &K0.S, &K1.S, lerpTime);D3DXQuaternionSlerp(&lerpedR, &K0.R, &K1.R, lerpTime);//圓形插值算法// Build and return the interpolated to-parent// matrix for this bone.D3DXMATRIX T, S, R;D3DXMatrixTranslation(&T, lerpedT.x, lerpedT.y, lerpedT.z);D3DXMatrixScaling(&S, lerpedS.x, lerpedS.y, lerpedS.z);D3DXMatrixRotationQuaternion(&R, &lerpedQ);L = R * S * T;//用L返回計算所得的變換矩陣。 }?
.X文件可以存儲相關矩陣信息。D3DX中有API IDSDXAnimationController接口可以自動計算其中間位置。
?
?
總結
- 上一篇: c语言eallow,求大神指导C语言框图
- 下一篇: 永恒之蓝病毒事件所引发的运维安全行业新思