感謝
感謝網(wǎng)友提出這個(gè)問題。大家有問題也可以在評(píng)論區(qū)提出。問題是fbx里有動(dòng)畫,但是不知道該如何控制。模型是這個(gè):

資源下載
本文集包括本節(jié)所有資源包括模型代碼都在此下載,按節(jié)的序號(hào)有文件或文件夾:
注意:務(wù)必使用瀏覽器打開:
鏈接:https://pan.baidu.com/s/13gwJLwo_LbRnN3Bl2NXXXw
提取碼:xrf5
解決方案
插件編譯
因?yàn)槲覜]有讀取過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插件就出來了:osgdb_fbx.dll
這個(gè)時(shí)候,使用osgviewer a.fbx就可以看到了。
動(dòng)畫解析
要看一個(gè)模型有沒有動(dòng)畫其實(shí)是件簡(jiǎn)單的事,如本例模型Naruto.fbx,可以使用osgconv Naruto.fbx a.osg,然后用寫字板打開a.osg,直接搜:osgAnimation或Animation或UpdateCallback,都可以查出來有無動(dòng)畫。有動(dòng)畫就必會(huì)用到更新回調(diào),因此UpdateCallbacks一般是必有的。
本例是這些都有。
動(dòng)畫控制
為了讓大家更能夠簡(jiǎn)便的查看模型中的動(dòng)畫,不用大費(fèi)勁,osg給了一個(gè)例子叫:osganimationviewer,本例中使用osganimationviewer Naruto.fbx,就可以通過界面很方便的操作其中的動(dòng)畫(注意下面一排按鈕,點(diǎn)點(diǎn)就能播放/暫停動(dòng)畫):

其是有源碼的,我就不再多解讀了。讀取動(dòng)畫的核心思想就是找:UpcateCallback,找到了就可以將其轉(zhuǎn)換成相應(yīng)的動(dòng)畫控制類,比如:AnimationPathCallback,AnimationManagerBase,轉(zhuǎn)換成功就是找到了動(dòng)畫,比如osganimationviewer.cpp的找動(dòng)畫的代碼就是這個(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)吧。