感谢
感谢网友提出这个问题。大家有问题也可以在评论区提出。问题是fbx里有动画,但是不知道该如何控制。模型是这个:
资源下载
本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹:
解决方案
插件编译
因为我没有读取过fbx格式的模型,起初我以为很麻烦呢。我先是在自动桌官方下载了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
这个时候,使用osgviewer a.fbx就可以看到了。
动画解析
要看一个模型有没有动画其实是件简单的事,如本例模型Naruto.fbx,可以使用osgconv Naruto.fbx a.osg,然后用写字板打开a.osg,直接搜:osgAnimation或Animation或UpdateCallback,都可以查出来有无动画。有动画就必会用到更新回调,因此UpdateCallbacks一般是必有的。
本例是这些都有。
动画控制
为了让大家更能够简便的查看模型中的动画,不用大费劲,osg给了一个例子叫:osganimationviewer,本例中使用osganimationviewer Naruto.fbx,就可以通过界面很方便的操作其中的动画(注意下面一排按钮,点点就能播放/暂停动画):
其是有源码的,我就不再多解读了。读取动画的核心思想就是找:UpcateCallback,找到了就可以将其转换成相应的动画控制类,比如:AnimationPathCallback,AnimationManagerBase,转换成功就是找到了动画,比如osganimationviewer.cpp的找动画的代码就是这个最关键:
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);
}
};
还等什么,快快行动吧。
暂无评论内容