• 您的位置:首页 > 新闻动态 > 技术文章

    为动作捕捉设备写MOTIONBUILDER插件

    2018/5/29      点击:

    1、将动捕服数据实时接入到MoBu(Motion Builder简写,下同)

    2、将retarget后的动作数据实时导出到3D引擎里驱动模型

    3、在MoBu里K相机动画曲线,将相机参数同步到引擎里,轻松实现机位变动切换等需求。

    我主要就是写这么3个device插件来完成这些功能。

    以前没接触过Autodesk系列的软件,对MoBu也完全没听说过,因此,要开发我想要的功能,必须仔细读一读它的SDK文档。

    MoBu的SDK文档写的很不全,很多细节都完全没有涉及。主要是大致介绍了一下软件的实现的概念构成,代码实现层面几个重要类的介绍,讲解了一下概念体系里比较典型的几个关系,还有关于Animation的一些稍微比较详细一点的介绍。从阅读SDK文档开始,到写出第一个插件--input device插件,耗时近1个月,大部分时间是跟着文档走,尝试尽量理解它。后来的几个插件就很容易了,基本上拷贝粘贴再稍微改改就出来了。

    我的经验是:MoBu的扩展开发其实是可以很容易掌握的,快速掌握的方法,就是充分利用Python。

    MoBu的windows菜单项里有Python Editor一项,打开它,就是软件集成的python解释器。基本上一般的功能都能直接在这个解释器里直接调用执行。我在这个解释器里,跟着SDK文档里的Your First Python程序,完整地敲了一遍实例代码,每一行都要理解,碰到不懂的概念,就去看文档的其他部分的介绍,这个例子里几乎有实现我的插件需求的全部工具了。

    下面,我就罗列一下我脑子里还记得的比较常用的一些概念。

    先说打开软件第一眼看到的大的画了一张格子的窗口,这就是场景窗口,或说视图窗口,可以有若干个视图窗口同时存在。所有的视图窗口展现的都是同一棵对象树,只不过可能展示的是这棵树的不同部分或角度。而且MoBu里有且只有这么一棵树,它叫Scene。我们的MoBu软件系统名称叫FBSystem()。你可以在python editor里敲下FBSystem().Scene.Name,它打印出来字符串“Scene”,这里的FBSystem().Scene就是刚才说的那棵猥琐的树Scene。我说它是树,不是指它在内存里就是一种树数据结构来实现的,而仅仅是指可以理解成这么一棵树的形状,各种物件都以一定层次关系挂在这棵树上,我们的视图窗口就从某个角度来画出这个窗口里看到的这棵树的样子。我们用户的界面操作,就是往这棵树上挂东西或拿掉东西,以及操作树上的东西。这个就是总的直观的概念,有了这个总的直观的印象,细枝末节就可以慢慢来加深理解了。

    接下来看软件的左下角窗口,是所谓的Navigator Window(在默认布局下)。这个破窗口,看起来像个树状结构。那当然了,它大部分功能,就是显示我们的Scene树的层次样貌。先看窗口里的第一个节点,叫Scene,这个名字*无厘头,因为我们的Scene树里没有叫Scene的子节点。我们先通过File菜单或者Asset Browsering窗口加载一个模型,然后跑一下代码:


    1
    2
    3
    scene=FBSystem().Scene
    for i in scene.RootModel.Children:
        print i.Name

    看看打印出来的字符串,我就发现和Navigator窗口里Scene节点下第一级子节点的内容一样。这再明显不过了,这里的Scene节点展示的其实是我们Scene树的RootModel节点的内容。所以我觉得这个Scene节点应该改名叫RootModel。

    因此,要强调的是,程序员的视角不要关注这个Navigator窗口,而应该牢牢记住那棵Scene树的样子。

    接下来,打开FBScene的文档,查看它的定义,能看到里面有很多属性成员,所以,下面的代码成立:


    1
    2
    3
    4
    print scene.Cameras.Name
    print scene.Characters.Name
    print scene.Lights.Name
    # WiseGlove go!

    看看结果就知道,那个Navigator窗口的那些节点倒是和这些属性比较配合,还有个别对不上号的节点,点开看看属性大概也能猜出是啥意思。这个Navigator窗口对程序员来说没多大作用,把它理解为展示了Scene树的部分层次样貌以及软件系统的统计信息以及一些其他信息就够了。