(转载)MultiAnimation
原文:http://kay.zhang.blog.163.com/blog/static/3493716520084100395228/
multiAnimation是個很酷的東西。我們知道利用AnimationController可以隨意的加載.x中的各種動畫集。可是如果不做任何設置,只是在一個Track上切換動畫集的話,就會出現動作突然變化的效果,十分不自然,比如說:當.x模型在程序中是立正的時候,我們發出命令:敬禮!他的右手手就會直接從褲縫瞬移到太陽穴,沒有一個變化的過程。而我們要的效果是:我們下令敬禮 之后,他的手會從褲縫慢慢的移動到太陽穴。整個是一個連續的過程。
這要怎么實現呢?其實AnimationController已經提供了動畫集之間平滑過度的功能。
如果兩個動畫集切換,則至少需要2個的軌道(Track),我們記作Track0,和Track1。實現平滑過度的實質就是兩個軌道之間的你進我退。我們要做的是設置“你進”的時間長度和 “我退”的時間長度就行了。
代碼如下:
DWORD dwCurrentTrack = 0; // 全局變量,記錄當前的軌道號 0 或 1void CSkinMesh::SetAnimSet(char* animname)
{
DWORD dwNewTrack = ( dwCurrentTrack == 0 ? 1 : 0 ); // 取和當前軌道號相對的編號,0取1,1取0.
LPD3DXANIMATIONSET pAS; // 定義一個動畫集,用來讀取.x模型中的動畫集
m_pAnimController->GetAnimationSetByName( animname, & pAS ); // 依照函數參數的名稱來讀取動畫集
m_pAnimController->SetTrackAnimationSet( dwNewTrack, pAS ); // 將此動畫集設置加入到新的軌道上
pAS->Release();
m_pAnimController->UnkeyAllTrackEvents( dwCurrentTrack ); // 清除原先軌道上的事件
m_pAnimController->UnkeyAllTrackEvents( dwNewTrack ); // 清除新軌道上的事件
float time = g_TotalTime; // 得到全局的總時間
float Duration = 2.8f; // 設置變化的時長,我們令“你進”和“我退”的過程時間長度一致。
m_pAnimController->KeyTrackEnable( dwCurrentTrack, FALSE, time+Duration );
m_pAnimController->KeyTrackSpeed( dwCurrentTrack, 0.0f, time, Duration, D3DXTRANSITION_LINEAR );
m_pAnimController->KeyTrackWeight( dwCurrentTrack, 0.0f, time, Duration, D3DXTRANSITION_LINEAR );
m_pAnimController->SetTrackEnable( dwNewTrack, TRUE );
m_pAnimController->KeyTrackSpeed( dwNewTrack, 1.0f, time, Duration, D3DXTRANSITION_LINEAR );
m_pAnimController->KeyTrackWeight( dwNewTrack, 1.0f, time, Duration, D3DXTRANSITION_LINEAR );
dwCurrentTrack = dwNewTrack; // 將新軌道設置為當前軌道,為下次變換做準備。
}
每次調用這個函數時,就會在2.8秒(Duration 變量)內實現兩個動畫軌道的互相更替。從而實現漸變的效果。比如們么的模型正在立正,我們調用pSkinMesh->SetAnimSet("敬禮");,之后他就會自動插關鍵幀來實現平滑的過度了。這在游戲中的應用非常廣泛。
轉載于:https://www.cnblogs.com/wonderKK/archive/2011/11/07/2240277.html
總結
以上是生活随笔為你收集整理的(转载)MultiAnimation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 收银机服务器操作系统,第二章 超市收银机
- 下一篇: ?php $postsperpage=9