专栏/Dynamic Bone ——Unity 3D动态骨骼插件

Dynamic Bone ——Unity 3D动态骨骼插件

2020年01月12日 13:18--浏览 · --喜欢 · --评论
粉丝:33.6万文章:5



铛~铛~铛~ !  兔纸我又来了~~今天呢,给大家分享一个动态骨骼插件,应该有不少小伙伴用过吧,名字叫—— Dynamic Bone,记得哦~    评论~! 点赞~! 转发~!(●'◡'●)以及收藏~


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


Dynamic Bone是一个Unity的动态骨骼插件,这个插件允许开发者指定对应的根骨骼,从而允许该骨骼的子骨骼进行物理结算,而根骨骼将不进行物理结算~~  有一点要说明哦,DynamicBone模拟的物理结算不会导致骨骼距离发生变化~~也就是说,DynamicBone并不适合模拟凝胶、橡胶等各方向形变明显的物体,这样的物理模型更加适用于模拟头发呀、绳子啊等这些不容易拉伸但容易形变的物体,运用在衣物上时,则需要看衣物材质是否容易拉伸,如果容易拉伸依然不适合用~~


这个插件内含有两个脚本,一个是Dynamic Bone,一个是Dynamic Bone Collider,好了我来一个一个的说明一下


— Dynamic Bone —

Dynamic Bone使用还是比较简单的,导入Package之后,在Unity场景中选中需要计算的带骨骼的GameObject,然后呢,在这个GameObject下面添加DynamicBone组件,然后将最上层的骨骼拖入到DynamicBone组件的Root上即可。然后设置各项参数,DynamicBone就会在物体发生运动的时候自动生效。要注意的是:

注意:因为DynamicBone组件会在启动时会记录所有骨骼的局部坐标并且在每次Update时还原局部坐标,同时会根据所在的GameObject的移动计算骨骼的位置,所以添加DynamicBone组件的 GameObject不能位于应用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局部位置;

  • Gravity 重力:在DynamicBone节点上施加的重力,方向是在全局坐标系中的,注意DynamicBone的重力比较特殊,只在节点运动发生时起效,会在节点运动时把节点向重力方向拉动;

  • Force 常驻力:在DynamicBone节点上施加的额外力,方向是在全局坐标系中的,注意Force与Gravity不同,是无条件生效的,会一直把节点向指定方向拉动;

  • Colliders 碰撞体列表:会与DynamicBone各节点发生碰撞的碰撞体对象;

  • 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组件,并且设置以下属性:


  • Center:指定区域中心与GameObject位置的偏移量;

  • Radius:区域内球形部分的半径;

  • Height:区域高度,这个值在小于2倍Radius时无效,会使区域变成球型,高于2倍Radius时生效,区域会变成胶囊体(可视化模型是两个球体);

  • Direction:胶囊体在当前GameObject局部坐标的方向,区域是球体的时候无效;

  • Bound:区域模式,Outside表示区域会作为碰撞盒与DynamicBone节点发生碰撞,阻止节点进入区域内,而Inside则会约束节点在区域内,阻止节点离开区域; 然后需要将DynamicBoneCollider对象添加至与其发生碰撞交互的DynamicBone组件的Colliders属性中。


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

还有要说明一下:


使用限制和缺陷

  • 由于DynamicBone完全不发生拉伸和压缩的特性,DynamicBone并不适合模拟凝胶、橡胶等各方向形变明显的物体,而更适合模拟头发、绳子等不容易拉伸但容易形变的物体, 衣物则要看衣物材质是否容易拉伸,如果容易拉伸依然不适合用DynamicBone模拟;

  • 虽然有简单的碰撞机制,带DynamicBone组件的骨骼之间是不存在碰撞的(当然可以通过在各骨骼都设置DynamicBoneCollider组件来实现,但因为开销会很大所以不建议),所以,这意味着DynamicBone 模拟的物体在刚性为0的时候可能会发生自我穿插;

  • DynamicBone的位置更新发生在LateUpdate节点,这意味着DynamicBone会完全控制节点的位置,其计算结果会覆盖物理和动画系统输出的位置,而不能与其融合



投诉或建议