irrlicht動作融合的使用姿勢

動作融合是一種將當前動作跟目標動作中骨骼位置進行動態插值的算法。得到的結果可以使角色的動作表現更加的平滑。

irrlicht引擎也提供了相應的功能,下面就這個功能的使用方法進行說明。

功能函數

引用下irrlicht的代碼

//! Sets the transition time in seconds (note: This needs to enable joints, and setJointmode maybe set to 2)
//! you must call animateJoints(), or the mesh will not animate
void CAnimatedMeshSceneNode::setTransitionTime(f32 time)
{
    const u32 ttime = (u32)core::floor32(time*1000.0f);
    if (TransitionTime==ttime)
        return;
    TransitionTime = ttime;
    if (ttime != 0)
        setJointMode(EJUOR_CONTROL);
    else
        setJointMode(EJUOR_NONE);
}

使用這個函數,就可以在播放下一個動作的時候自動進行插值。但是,只使用這一個函數,只會讓你的模型骨骼便的不受控制。
好在這個時候我們注意到函數前面的兩行注釋,什么意思呢?

設置融合時間,單位秒(注意:這個需要有骨骼,并且設置骨骼模式為2,就是EJUOR_CONTROL)
你必須調用animateJoints(),否則動畫可就不動了喲

然而注釋沒有提到的是,你必須沒一幀都調用animateJoints(),否則動畫還是不動喲
這里有英文版解釋

Now if you also want your mesh to animate using any built-in animation in the model, call:
Node->animateJoints();
In your game loop, before drawAll().
意思就是你如果要播已有的動畫,你需要在游戲的主循環中調用animateJoints();

步驟

  1. 設置 setTransitionTime(f32 time)
  2. 每幀調用 animateJoints()

做完這兩件事,你就可以可到動作融合可以正常使用了。

更多的要求

但是還不夠。當功能正常使用的時候,我們可能會有更多的需求:

  • 對不同的動作設置不同的動作融合
  • 某些特別的動作不要融合

前面的兩個步驟,在動作融合及不融合來回切換的時候會導致模型節點不受控制。有兩處問題,再看代碼

void CAnimatedMeshSceneNode::setTransitionTime(f32 time)
{
    const u32 ttime = (u32)core::floor32(time*1000.0f);
    // 問題2
    if (TransitionTime==ttime)
        return;
    TransitionTime = ttime;
    if (ttime != 0)
        setJointMode(EJUOR_CONTROL);
    else
        setJointMode(EJUOR_NONE);   // 問題1
}

問題1:在把動畫的融合設置為0時,期望的是關閉動作融合。但實際導致骨骼模式變成NONE,子節點不能正常變換位置。手動調用 node->setJointMode(scene::EJUOR_READ)解決
問題2:試想下面的操作過程,

  1. 設置融合時間setTransitionTime(0.3)
  2. 關閉動作融合setJointMode(scene::EJUOR_READ)
  3. 再次設置setTransitionTime(0.3)

第三步操作時,代碼在 if (TransitionTime==ttime)處返回,于是沒有自動執行setJointMode(EJUOR_CONTROL);
所以結論是:在setTransitionTime時同時設置setJointMode(MODE)來避免這個問題

if (m_AniPlayData.blend > 0) {
    node->setTransitionTime(m_AniPlayData.blend);
    node->setJointMode(irr::scene::EJUOR_CONTROL);
} else {
    node->setTransitionTime(0);
    node->setJointMode(irr::scene::EJUOR_READ);
}

最后完整的步驟是:

  1. 設置 setTransitionTime(f32 time)
  2. 同1時設置 setJointMode(MODE);
  3. 每幀調用 animateJoints()

至此,動畫融合就完全可用了。

PS:如果你的主模型的子節點也需要做動畫的話,對子節點也需要上述三個步驟。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • 111. [動畫系統]如何將其他類型的動畫轉換成關鍵幀動畫? 動畫->點緩存->關鍵幀 112. [動畫]Unit...
    胤醚貔貅閱讀 13,125評論 3 90
  • 轉載一篇高質量博文,原地址請戳這里轉載下來方便今后查看。1 背景不能只分析源碼呀,分析的同時也要整理歸納基礎知識,...
    Elder閱讀 1,951評論 0 24
  • 1 背景 不能只分析源碼呀,分析的同時也要整理歸納基礎知識,剛好有人微博私信讓全面說說Android的動畫,所以今...
    未聞椛洺閱讀 2,733評論 0 10
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,544評論 6 30
  • 喜歡是情感眾多類目中的一種,介于沉溺和無察之間,像深且闊的湖面上微風撫過的漣漪,不易察覺,等你細看,卻已消逝不見。...
    偶然之音閱讀 288評論 0 0