天天看点

动态添加orderer节点_Unity 3D动态骨骼插件(DynamicBone)

前言

铛~铛~铛~ 提前祝大家新年快乐~~

今天的文章呢,来自于一位人美花儿甜的妹子——樱花兔,在这里先感谢下樱花兔的分享~

动态骨骼

动态骨骼是游戏内常见的一种表现方式,通常多用于头发、服饰、飘带等,而且在手游中多出现于创建角色部分,可以产生在玩家拖动旋转角色时头发或飘带随着转动而飘动的感觉,以此来提升视觉质量。

那这种效果要如何实现呢?

其实实现方法很多,相应的插件工具也有不少,不过最出名最好用的莫过于一个叫Dynamic Bone的插件。

动态添加orderer节点_Unity 3D动态骨骼插件(DynamicBone)

Dynamic Bone插件的Asset Store链接地址为:https://assetstore.unity.com/packages/tools/animation/dynamic-bone-16743

动态添加orderer节点_Unity 3D动态骨骼插件(DynamicBone)

以上是我们利用Dynamic Bone实现的头发甩动效果,是不是很棒呀~

Dynamic Bone是一个针对Unity的动态骨骼插件,这个插件允许开发者指定对应的根骨骼,从而允许该骨骼的子骨骼进行物理解算,而根骨骼将不进行物理解算~~  

有一点要说明哦,Dynamic Bone模拟的物理解算不会导致骨骼距离发生变化,也就是说,Dynamic Bone并不适合模拟凝胶、橡胶等各方向形变明显的物体,这样的物理模型更加适用于模拟头发呀、绳子啊等这些不容易拉伸但容易形变的物体,运用在衣物上时,则需要看衣物材质是否容易拉伸,如果容易拉伸依然不适合用。

Dynamic Bone

这个插件内含有两个脚本,分别如下:

  1. Dynamic Bone
  2. Dynamic Bone Collider

好了,我们来一个个的说明一下.

Dynamic Bone

Dynamic Bone使用起来还是比较简单的,导入Package之后,在Unity场景中选中需要计算的带骨骼的GameObject,然后呢,在这个GameObject下面添加DynamicBone组件,然后将最上层的骨骼拖入到DynamicBone组件的Root上即可。然后设置各项参数,DynamicBone就会在物体发生运动的时候自动生效。 需要注意的是: 由于DynamicBone组件会在启动时记录所有骨骼的局部坐标并且在每次Update时还原局部坐标,同时会根据所在的GameObject的移动计算骨骼的位置,所以添加DynamicBone组件的 GameObject不能位于应用DynamicBone的模型的骨骼中,就算是根骨骼也不行,如果这样的话,在计算的时候会发生抖动或者直接崩溃~~

动态添加orderer节点_Unity 3D动态骨骼插件(DynamicBone)

Dynamic Bone有四个基本属性(四个属性的取值范围都是[0, 1]),决定了其运动效果,分别如下:

  • Damping (阻尼):阻止运动的惯性运动,相当于弹簧的摩擦力。为0时简谐运动过程不会主动停止,为1时简谐运动过程不会发生;
  • Elasticity (弹性):决定回振移动强度,在简谐运动过程中作为额外的作用力将节点拉到还原位置,相当于弹簧的弹力。为0时系统形变不会主动还原,为1时形变不会发生;
  • Stiffness (刚性):限制最大振动幅度与方向,保证碰撞处理前节点不会跑到指定范围外,相当于弹簧的硬度。为0时不发挥作用,0到1时限制范围从2倍原始距离到0线性衰减;
  • Inert (惯性):限制形变幅度,在每一帧的简谐运动迭代发生前,无条件随物体整体运动拉动节点,拉动距离为Inert * 整体运动距离

其他的属性说明:

  • Update (更新频率):DynamicBone计算频率,当游戏实际帧率高于这个更新频率时,DynamicBone会在每一帧进行消极计算,会尽量保持节点形状,但不会进行简谐运动模拟;当DynamicBone更新 频率远远高于游戏帧率的时候,DynamicBone会在脚本执行时尝试追帧,但每次最多执行4次,也就是更新频率实际最高只是当前游戏帧数的4倍;
  • Radius (半径):指定每个节点与DynamicBoneCollider发生碰撞的半径,注意节点互相之间不存在碰撞关系,注意这个半径是0碰撞依然会生效;
  • Damping\Elasticity\Stiffness\Inert\Radius各属性的Distrib:指定属性随着节点深度递增发生的变化;
  • End Length\End Offset 末尾节点偏移量:指定特殊的末尾节点End Bone局部位置,详见下方的4.1. 关于EndLength和EndOffset;
  • Gravity 重力:在DynamicBone节点上施加的重力,方向是在全局坐标系中的,注意DynamicBone的重力比较特殊,只在节点运动发生时起效,会在节点运动时把节点向重力方向拉动;
  • Force 常驻力:在DynamicBone节点上施加的额外力,方向是在全局坐标系中的,注意Force与Gravity不同,是无条件生效的,会一直把节点向指定方向拉动;
  • Colliders 碰撞体列表:会与DynamicBone各节点发生碰撞的碰撞体对象,详见2.1. 关于碰撞;
  • Exclusions 排除节点列表:在设置Root节点后,DynamicBone会根据节点的GameObject的父子关系沿着子GameObject方向自动生成节点树,Exclusions中所有节点及其子孙节点都不会 生成DynamicBone节点;
  • Freeze Axis 固定轴:非None的情况下,所有节点在局部坐标系的对应的轴上在值不会发生变化;
  • DistanceDisable 距离控制开关:开启或者关闭距离控制机制,开启后如果DynamicBone所在的物体超出了参考物体的参考距离范围,DynamicBone的所有行为都会停止;
  • Reference Object 参考物体:距离控制机制的参考物体,如果为空则DynamicBone会选择场景内的主摄影机作为参考对象;
  • Distance To Object 参考距离:距离控制机制的参考距离.

Dynamic Bone Collider

DynamicBone提供了简单的碰撞功能,允许使用者禁止进入或者离开某些特定的区域,组件提供了球型和胶囊体两种区域的碰撞体。

碰撞功能的使用非常简单,只需要在骨骼可能会发生碰撞交互的GameObject上添加DynamicBoneCollider组件,并且设置以下属性即可。

动态添加orderer节点_Unity 3D动态骨骼插件(DynamicBone)
  • Center:指定区域中心与GameObject位置的偏移量;
  • Radius:区域内球形部分的半径;
  • Height:区域高度,这个值在小于2倍Radius时无效,会使区域变成球型,高于2倍Radius时生效,区域会变成胶囊体(可视化模型是两个球体);
  • Direction:胶囊体在当前GameObject局部坐标的方向,区域是球体的时候无效;
  • Bound:区域模式,Outside表示区域会作为碰撞盒与DynamicBone节点发生碰撞,阻止节点进入区域内,而Inside则会约束节点在区域内,阻止节点离开区域;然后需要将DynamicBoneCollider对象添加至与其发生碰撞交互的DynamicBone组件的Colliders属性中。
动态添加orderer节点_Unity 3D动态骨骼插件(DynamicBone)

好啦~~

今天就到这里啦~~记得评论~~点赞~~转发~~~

还有要说明一下,使用限制和缺陷:

  • 由于DynamicBone完全不发生拉伸和压缩的特性,DynamicBone并不适合模拟凝胶、橡胶等各方向形变明显的物体,而更适合模拟头发、绳子等不容易拉伸但容易形变的物体, 衣物则要看衣物材质是否容易拉伸,如果容易拉伸依然不适合用DynamicBone模拟.
  • 虽然有简单的碰撞机制,带DynamicBone组件的骨骼之间是不存在碰撞的(当然可以通过在各骨骼都设置DynamicBoneCollider组件来实现,但因为开销会很大所以不建议),所以,这意味着DynamicBone 模拟的物体在刚性为0的时候可能会发生自我穿插.
  • DynamicBone的位置更新发生在LateUpdate节点,这意味着DynamicBone会完全控制节点的位置,其计算结果会覆盖物理和动画系统输出的位置,而不能与其融合.

最后

欢迎关注Unity技术美术公众号:

Unity技术美术

更多干货

动态添加orderer节点_Unity 3D动态骨骼插件(DynamicBone)

让我知道你“在看”

动态添加orderer节点_Unity 3D动态骨骼插件(DynamicBone)