日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关键帧和动画

發(fā)布時間:2024/1/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关键帧和动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關鍵幀和動畫

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接口可以自動計算其中間位置。

?

?

總結

以上是生活随笔為你收集整理的关键帧和动画的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。