第11节 实例-fbx模型动画的控制

感谢

感谢网友提出这个问题。大家有问题也可以在评论区提出。问题是fbx里有动画,但是不知道该如何控制。模型是这个:
image.png

资源下载
本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹:

【击此打开网盘资源链接】

解决方案

插件编译

因为我没有读取过fbx格式的模型,起初我以为很麻烦呢。我先是在自动桌官方下载了fbx sdk:
https://www.autodesk.com/developer-network/platform-technologies/fbx-sdk-2019-0
注意,vs2015以上的vs直接下载vs2015版本的即可。
image.png

我用的是vs2019,使用vs2015的版本就行。而后将FBX的dll加入到path之中:
image.png

然后使用CMAKE配置即可:
image.png

编译之后,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,就可以通过界面很方便的操作其中的动画(注意下面一排按钮,点点就能播放/暂停动画):
image.png

其是有源码的,我就不再多解读了。读取动画的核心思想就是找: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);
    }
};

还等什么,快快行动吧。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片