irrlicht動作融合的使用姿勢

動作融合是一種將當(dāng)前動作跟目標動作中骨骼位置進行動態(tài)插值的算法。得到的結(jié)果可以使角色的動作表現(xiàn)更加的平滑。

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

功能函數(shù)

引用下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);
}

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

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

然而注釋沒有提到的是,你必須沒一幀都調(diào)用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().
意思就是你如果要播已有的動畫,你需要在游戲的主循環(huán)中調(diào)用animateJoints();

步驟

  1. 設(shè)置 setTransitionTime(f32 time)
  2. 每幀調(diào)用 animateJoints()

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

更多的要求

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

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

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

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:在把動畫的融合設(shè)置為0時,期望的是關(guān)閉動作融合。但實際導(dǎo)致骨骼模式變成NONE,子節(jié)點不能正常變換位置。手動調(diào)用 node->setJointMode(scene::EJUOR_READ)解決
問題2:試想下面的操作過程,

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

第三步操作時,代碼在 if (TransitionTime==ttime)處返回,于是沒有自動執(zhí)行setJointMode(EJUOR_CONTROL);
所以結(jié)論是:在setTransitionTime時同時設(shè)置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. 設(shè)置 setTransitionTime(f32 time)
  2. 同1時設(shè)置 setJointMode(MODE);
  3. 每幀調(diào)用 animateJoints()

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容