« 流体系统 | 返回首页 | 支持惰性展开和差异更新的 Lua 表 »

我们需要一个怎样的动画模块

最近这个项目,里面有大量的机械动画:采矿机、抽水泵、发电机、组装机、机械臂、等等。

我发现,我们自研的引擎的动画模块其实是不够用的。

我们在设计引擎的动画模块时,是按过去经常做的 MMORPG 里的需求来设计的。主要是控制 Avatar 的动作:走、跳、跑、攻击、等等。在从制作软件导入动画数据后,引擎需要做的加工主要是动画和动画之间的融合。例如,从走路过渡到跑步。还有在动画中加入一些运行时的控制:例如转头盯着物体、调整脚掌贴合地面。这些是用 IK 模块来实现的。

在这个项目中,我们大量的动画是让机械装置的很多部件运动。这固然还是可以套用已有的骨骼动画模块,但旧有的功能却会造成大量的浪费。

机械装置的部件繁多,每个小零件都有自己独立的动画。例如,一个齿轮会不断的旋转,另一个活塞在做往复运动。当我们在制作软件里把整体动画都调好后,所有部件放在一起,就会有一个非常长的动画循环周期。但实际上,单个零件的循环周期却非常短。如果把整体的骨骼动画一并输出,就会有大量的数据冗余。

如果按传统方式制作每部机器的动画,相应动画数据很快就膨胀到不可接受的地步。但如果简单的把机器按部件拆分开,单独制作简单动画,再在程序中组装起来,那么美术就难以创作。所以、我们还是需要对引擎的动画模块以及编辑器增加相应的支持,

因为我们没有足够的资源开发一个完善的骨骼动画编辑器(好像 spine 做的那样),即使开发出来,也很难媲美专业的 3d 动画创作工具;那么,只能退而求其次,做一个有限功能的动画组合编辑器。

我的构想是,美术可以在创作工具里为每个零部件创作动画,把它放在整体的骨架上,动画却单独导入到引擎的编辑器中。当我们编辑动画时,可以为物件创建多个 track ,每个 track 就只能置入一个零件的动画。但可以为这个动画在 track 上添加若干播放循环,每个循环的的开始时刻、播放速度。

然后运行时把物件的所有 track 相加,得到最终的动画。

如果换成人物动画,那么我们就可以把摇头、眨眼、挥手、这些局部运动都单独输出,每个局部动画都是在完整的骨架上创作的。只是大部分关节都是静止的。每个局部动画都有一致的完整的骨架,得到最终效果,只用简单相加即可。

对于机械运动,大部分零件都是做一些基本运动:匀速旋转、简谐震动等等。这些运动都是针对单个关节的。那么这样的简单运动不需要在外部创作工具中创作,只需要在编辑器中自动生成即可。因为引擎已经实现了 IK ,那么再在编辑器中加入 IK 的关联交互,就可以在编辑过程自动生成那些连带运动了。通过 IK 计算出来的运动轨迹,并不需要在运行时计算,可以在编辑时算好保存下来。这样可以减少运行时的复杂度。

在自己开发的编辑器中创作动画,虽然不如专业软件方便灵活,但可以最大限度的回避数据导入导出的复杂性。毕竟 3d 动画数据不如 2d 图片那么容易规范,我们之前大部分的开发精力都消耗在了处理和创作工具的数据交换上了。

Comments

机械仿真动画是各个部件装配后算自由度的,我以前研究过一个软件的后处理器,关系是有XML写的层级,仿真算法4轴以上都好弄,5-6及以上要算欧拉角角,矩阵
你这个,需要一个社区来维护,现在中国的程序员还是收入不够,没有能力和时间去维护开源社区。
这不就是UE4里的BlendSpace吗
很期待云风的新引擎开源, 一睹大神设计风采
我们以前是做ddc软件中做整套动画,导入到引擎的时候根据骨骼将各自独立的变换数据处理成新的动画
对呀,啥时候开源啊
云风 你的3D引擎啥时候开源呀?

Post a comment

非这个主题相关的留言请到:留言本