人物骨骼蒙皮动画系列5:物理动画PuppetMaster第一节
第一节目录:1.PuppetMaster是什么?
2.PuppetMaster的应用
3.PuppetMaster的初始化
4.测试我们的PuppetMaster人物
5.PuppetMaster原理概述
<hr/>1.PuppetMaster是什么?
PuppetMaster是一个第三方Unity插件。
我之前说,我写文章只写原创文章,每次写一个东西之前,我会在网上搜一下,如果别人讲过了,或者说得很全面了,就不写了,避免产生重复的网络垃圾。
这个插件嘛,当然不是我写的,为什么单独介绍这个插件,因为这个插件很复杂,可以基于它做改动,来融合多种人物动画效果,很强大。
另一方面,基于物理动画技术的游戏很少。
所以在这个系列介绍下物理动画技术的应用。
PuppetMaster是一个复合的控制系统。算是对动画系统的一个集大成者。所以我们之前几节的知识,这一节会引用到。
PuppetMaster是在一个布娃娃系统的基础上,实现的基于物理加力来控制人物的系统,并且有IK解算器来实现IK动画。人物本身还可以有骨骼蒙皮动画。
所以这个系统我们用来同时实现以下四种效果:
1.布娃娃系统
2.物理驱动的动画
3.物理驱动后,带动其他骨骼的IK动画
4.独立的蒙皮动画,以及蒙皮动画与上面的动画的混合。
PuppetMaster的使用,让人物的动画更灵活,实现了与场景交互、与他人交互,并且可以制造人物的摇晃感。
2.PuppetMaster的应用
最早应用这个系统,并且比较火的游戏是《人类一败涂地》。
后来我作为主程序制作了一款《鸡你太美》(后来改名《炸鸡派对》)游戏,蹭热点的同时,使用了这个系统来制作人物,达到了搞笑的目的,游戏也进入了App Store商店下载榜前三。
3.PuppetMaster的初始化
第1步:保证人物模型是正确的
设置模型为 humanoid类型。保证人物的骨骼,是标准的 屁股--脊椎---左右手 这样的结构。(也可以不遵循这个层级,但后续很多赋值/逻辑,就需要手动去做)
不然后续操作会导致很多奇怪的问题。
第2步:添加布娃娃系统:
在模型上加入BipedRagdollCreator脚本。
注意,绑定BipedRagdollCreator脚本的节点,下一层必须是bip开头的骨骼了。
比如上图,我们是绑定在“Dummy (1)”节点,下一层就是BipDummy节点。
如果骨骼足够标准,会自动识别正确添加。
如果不是标准的人体骨骼,手动添加映射也没问题。
点击Create a Ragdoll。
得到下面的面板
我们可以在Options里选择哪些骨骼要加上关节。以及使用何种关节。 以及碰撞体参数。
如果设置好,就直接点done就可以。
或者点“Start Editing Manually”打开UI面板在Scene视图对关节做可视化调节。
第3步 在模型上添加Puppet Master 脚本。
注意,我们是在绑定在Dummy (1)节点上。 这个节点带有Animator组件。
点击Set Up。 Puppet Master的初始化就完成了。
<hr/>4.测试我们的PuppetMaster人物
每次做好后,我们需要测试下初始化模型是否正确。
默认,我们运行动画。人物正常播放动画。
调整pin值,人物在动画骨骼和物理骨骼之间插值。
我们禁止动画组件。人物完全被物理控制
这个造型,应该是你的模型的T-Pose。 上图,之所有不是手臂伸直,是因为我用的插件自带模型。这个模型的T-Pose就是这样。
<hr/>5.PuppetMaster原理概述
科学养猪:人物骨骼蒙皮动画系列4:FK模式的Skinned Mesh 骨骼蒙皮动画
我在上一节,说Unity自带的蒙皮动画时,将蒙皮动画的各种属性跟PuppetMaster做了一一对应,也是为了方便这一节讲PuppetMaster。
所以这一节不再介绍 “肌肉”这些已经解释过的抽象属性了。
PuppetMaster初始化好的结构如上。分四个结构
1.Animator组件
2. Behaviours,也就是控制PuppetMaster的行为。我们简称 “行为”
3. PuppetMaster部分,也就是布娃娃系统初始化后,再PuppetMaster初始化后生成的额外一套骨骼,骨头上有刚体+碰撞体+关节+肌肉脚本+关节脚本。
父子骨骼,通过Joint来连接。额外这套骨骼我们简称 “ragdoll骨骼”。
4.我们本身的原始模型。 我们简称 “蒙皮骨骼”
实际上,除了上述4部分,这个插件还有其他部分,可以对某些骨骼单独挂IK组件,比如眼睛,实现主角的眼神追踪。
我们的所有行为、物理操作,都是对“ragdoll骨骼”产生影响。
Animator组件,都是对 “蒙皮骨骼”产生影响。
PuppetMaster脚本有 “ragdoll骨骼”和“蒙皮骨骼”的一一对应关系。
所以PuppetMaster脚本 会做一个map,也就是映射。
根据权重,将被影响的“ragdoll骨骼”变化,映射到“蒙皮骨骼”身上。
puppetMaster的代码核心,在FixedUpdate和Update两个函数。
puppetMaster支持三种动画枚举:
Normal,
AnimatePhysics,
FixedUpdate。
如果设置为Normal,FixedUpdate不计算。
AnimatePhysics和 FixedUpdate 最终都在puppetMaster的FixedUpdate()函数中计算。
然后在LateUpdate函数:
我们会通过muscle的map函数,将“ragdoll骨骼”映射到“蒙皮骨骼”。
完成puppetMaster对“蒙皮骨骼”的控制
如图,如果大家还有印象,这就是动画重定位的原理。
我们复习下动画重定位的这一节
科学养猪:人物骨骼蒙皮动画系列1:关于动画重定位的一切
puppetMaster如何解决动画重定位的问题:
骨骼无法一一对应,或者有多余骨骼?
答案有两个,一个是下面这个代码:FixTargetTransforms函数
只要有骨骼无法被映射,那么puppetMaster认定它就是多余骨骼,我们需要每帧对它fix.
同样,prop这个道具类型,也被当做多余骨骼。
public void FixTargetTransforms() {
if (!initiated) return;
target.localPosition = defaultTargetLocalPosition;
target.localRotation = defaultTargetLocalRotation;
}
fix的代码很简单,就是始终让它保持它在父骨骼下的初始化的本地坐标。
第二个,就是IK解算。
我们希望某些骨骼先到达位置了,它的父骨骼,再做IK解算。
比如眼睛追踪敌人,手抓住某个物体。
以及脊椎不是标准的3脊椎,而是更多,那么前3脊椎骨头到达位置后,后续骨骼作为父骨骼,来解算IK。
为此,单独提供了IK解算器。
大佬写的真棒,帮大忙了
页:
[1]