感謝
感謝網(wǎng)友提出這個(gè)問(wèn)題何陆。大家有問(wèn)題也可以在評(píng)論區(qū)提出率触。問(wèn)題是fbx里有動(dòng)畫(huà),但是不知道該如何控制虫埂。模型是這個(gè):
資源下載
本文集包括本節(jié)所有資源包括模型代碼都在此下載祥山,按節(jié)的序號(hào)有文件或文件夾:
注意:務(wù)必使用瀏覽器打開(kāi):
鏈接:https://pan.baidu.com/s/13gwJLwo_LbRnN3Bl2NXXXw
提取碼:xrf5
解決方案
插件編譯
因?yàn)槲覜](méi)有讀取過(guò)fbx格式的模型,起初我以為很麻煩呢掉伏。我先是在自動(dòng)桌官方下載了fbx sdk:
https://www.autodesk.com/developer-network/platform-technologies/fbx-sdk-2019-0
注意缝呕,vs2015以上的vs直接下載vs2015版本的即可。
我用的是vs2019岖免,使用vs2015的版本就行岳颇。而后將FBX的dll加入到path之中:
然后使用CMAKE配置即可:
編譯之后,fbx插件就出來(lái)了:osgdb_fbx.dll
這個(gè)時(shí)候颅湘,使用osgviewer a.fbx就可以看到了话侧。
動(dòng)畫(huà)解析
要看一個(gè)模型有沒(méi)有動(dòng)畫(huà)其實(shí)是件簡(jiǎn)單的事,如本例模型Naruto.fbx闯参,可以使用osgconv Naruto.fbx a.osg瞻鹏,然后用寫(xiě)字板打開(kāi)a.osg,直接搜:osgAnimation或Animation或UpdateCallback鹿寨,都可以查出來(lái)有無(wú)動(dòng)畫(huà)新博。有動(dòng)畫(huà)就必會(huì)用到更新回調(diào),因此UpdateCallbacks一般是必有的脚草。
本例是這些都有赫悄。
動(dòng)畫(huà)控制
為了讓大家更能夠簡(jiǎn)便的查看模型中的動(dòng)畫(huà),不用大費(fèi)勁馏慨,osg給了一個(gè)例子叫:osganimationviewer埂淮,本例中使用osganimationviewer Naruto.fbx,就可以通過(guò)界面很方便的操作其中的動(dòng)畫(huà)(注意下面一排按鈕写隶,點(diǎn)點(diǎn)就能播放/暫停動(dòng)畫(huà)):
其是有源碼的倔撞,我就不再多解讀了。讀取動(dòng)畫(huà)的核心思想就是找:UpcateCallback慕趴,找到了就可以將其轉(zhuǎn)換成相應(yīng)的動(dòng)畫(huà)控制類痪蝇,比如:AnimationPathCallback,AnimationManagerBase冕房,轉(zhuǎn)換成功就是找到了動(dòng)畫(huà)躏啰,比如osganimationviewer.cpp的找動(dòng)畫(huà)的代碼就是這個(gè)最關(guān)鍵:
struct AnimationManagerFinder : public osg::NodeVisitor
{
osg::ref_ptr<osgAnimation::BasicAnimationManager> _am;
AnimationManagerFinder() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}
void apply(osg::Node& node) {
if (_am.valid())
return;
if (node.getUpdateCallback()) {
osgAnimation::AnimationManagerBase* b = dynamic_cast<osgAnimation::AnimationManagerBase*>(node.getUpdateCallback());
if (b) {
_am = new osgAnimation::BasicAnimationManager(*b);
return;
}
}
traverse(node);
}
};
還等什么,快快行動(dòng)吧耙册。