简介
动态骨骼(Dynamic Bone)组件(Component)用于定义哪些骨骼节点为动态骨骼,以及配置动态骨骼的相关参数。
组件逻辑
SandMod 允许您将管理 动态骨骼(Dynamic Bone)的 游戏对象(Game Object)和骨骼树分离开。
将场景中管理动态骨骼的 游戏对象(Game Object)添加 动态骨骼(Dynamic Bone)组件(Component)。
将受物理影响的动态骨骼根节点分配给动态骨骼组件的 根节点(Root)或 根节点列表(Roots)属性中。
如果您不希望根骨骼节点中有部分子骨骼节点受动态骨骼影响,您可以将对应骨骼节点添加到 排除节点列表(Exclusions)属性中。
设置组件中各项参数。
在当前游戏项目运行时,且当物体发生运动时,动态骨骼会基于物理计算实时反馈运动效果。
【DynamicBone001.png】
创建方法
在 场景编辑器(Scene Editor)的 层级窗口(Hierarchy)中,选中管理 动态骨骼(Dynamic Bone)的 游戏对象(Game Object)。
方法一:
选中对应的游戏对象后,在 检视窗口(Inspector)窗口中用鼠标左键点击 添加组件(Add Component)> 动态骨骼(Dynamic Bone)> 动态骨骼(Dynamic Bone) 进行创建。
【DynamicBone002.png】
方法二:
选中对应的 游戏对象 后,在 菜单栏(Menu Bar)中点击 组件(Component)> 动态骨骼(Dynamic Bone)> 动态骨骼(Dynamic Bone) 进行创建。
【DynamicBone003.png】
属性
动态骨骼(Dynamic Bone)组件(Component)包含以下属性:
【DynamicBone004.png】
| 名称 | 描述 |
|---|---|
| 根节点(Root) | 需要添加物理效果的骨骼树的根节点。赋值后该骨骼节点及其所有子骨骼节点都会认为是动态骨骼,在当前游戏项目运行时,会根据物体发生的运动,物理计算做出反馈。 您可以从 层级窗口(Hierachy)将对应骨骼根节点拖入,或点击条目选框右侧的圆形图标打开选择列表选择骨骼根节点用以分配给此元素条目。 |
| 根节点列表(Roots) | |
| 元素条目(Element) | 元素条目的属性值用于设置,在多个不同根节点的骨骼树作为动态骨骼,这些动态骨骼将会应用当前动态骨骼属性设置。 · 创建元素条目:如果您需要创建元素条目,请在列表下方点击 追加(Append)按钮。 【DynamicBone005.png】 · 定义元素条目数:列表右上角可设置列表中元素条目的数量,元素条目会根据设置的数量增删,会优先删除序号更大的元素条目。 【DynamicBone006.png】 · 删除:鼠标左键点击元素条目右侧的删除按钮(x),可对元素条目进行删除。 【DynamicBone007.png】 · 赋值:您可以从 层级窗口(Hierachy)将对应骨骼根节点拖入,或点击条目选框右侧的圆形图标打开选择列表选择骨骼根节点用以分配给此元素条目。 |
| 更新频率(Update Rate) | 设置物理模拟的频率,也就是每秒进行物理模拟计算的次数。 属性值越大动态骨骼反馈越快。值得注意的是,物理模拟的计算次数,每帧不能大于 3 次,所以如果属性值设置为当前帧率的 3 倍,实际运行情况也会是以每秒进行当前帧率乘以 3 的次数进行物理模拟。 |
| 更新模式(Update Mode) | 基于 更新频率(Update Rate)属性的设置,选择动态骨骼每次更新的方式。 · 普通(Normal),拟按固定时间更新,在动态骨骼进行物理模拟计算前,按 更新频率(Update Rate)属性设置的频率读取受力数据。 · 动画物理(Animate Physics),在动态骨骼进行物理模拟计算前,与物理引擎同步读取受力数据。 · 不缩放时间(Unscaled Time),更新频率不受项目设置的 时间缩放(Time Scale)属性影响,包括代码 Time.timeScale。· 默认(Default),每帧只进行 1 次受力分析计算,并会把该次受力分析的结果同步在该帧中执行的所有更新中。 |
| 阻尼(Damping) | 设置阻止动态骨骼的惯性运动值,骨骼的移动速度在多大程度上被减慢,相当于动态骨骼节点之间的摩擦力。 属性值为 0 至 1 之间的浮点数,属性值为 0 时动态骨骼运动过程不会主动停止,为 1 时动态骨骼不会发生运动。 |
| 弹性(Elasticity) | 设置回振移动强度,在动态骨骼运动过程中,将骨骼节点拉到还原位置的作用力强度,相当于弹簧的弹力。 属性值为 0 至 1 之间的浮点数,属性值为 0 时动态骨骼的形变不会主动还原,属性值为 1 时动态骨骼不会发生形变。 |
| 刚性(Stiffness) | 限制最大振动幅度与方向,保证碰撞处理前骨骼节点不会跑到指定范围外,相当于弹簧的硬度。 属性值为 0 至 1 之间的浮点数,属性值为 0 时不对动态骨骼移动范围增加限制,属性值为 1 时动态骨骼将固定不动; |
| 惰性(Inert) | 设置限制形变的幅度。在每一帧动态骨骼的运动迭代发生前,动态骨骼无条件随物体整体运动而被拉动,拉动距离为属性值乘以整体运动距离。 属性值为 0 至 1 之间的浮点数。 |
| 摩擦力(Friction) | 设置动态骨骼与碰撞器接触时,骨骼的移动速度在多大程度上被减慢,相当于动态骨骼节点与碰撞器之间的摩擦力。其中这里的碰撞器仅指 碰撞器列表(Colliders)属性中分配的碰撞器。 |
| 半径(Radius) | 动态骨骼中每一根骨骼节点,在参与碰撞检测时,都被看作是一个球形的碰撞器,此属性设置的是,动态骨骼中所有骨骼节点球形碰撞器的半径。 下图中黄色线框表示的是,动态骨骼中骨骼节点的球形碰撞器。 ![]() |
| 尾端长度(End Length) | 如果该值不为 0,则在动态骨骼树的末尾,额外生成一个虚拟骨骼,虚拟骨骼的长度为该值乘以最后两个动态骨骼节点间的距离。关于尾端虚拟骨骼的意义和作用,请参阅 尾端虚拟骨骼 小节。 |
| 尾端偏移(End Offset) | 如果该值不为零,则在动态骨骼树的末尾,额外生成一个虚拟骨骼,偏移量基于动态骨骼的本地坐标系。关于尾端虚拟骨骼的意义和作用,请参阅 尾端虚拟骨骼 小节。 |
| 重力(Gravity) | 设置在动态骨骼节点上施加的重力,方向根据世界坐标系。值得注意的是,动态骨骼的重力比较特殊,只在动态骨骼运动发生时起效,会在动态骨骼运动时把骨骼节点向重力方向拉动。 |
| 外力(Force) | 设置在动态骨骼节点上施加的外力,方向根据世界坐标系。与重力不同的是,外力是无条件生效的,会一直把动态骨骼节点向指定方向拉动。 |
| 混合权重(Blend Weight) | 设置动态骨骼物理模拟,与该骨骼播放动画混合时所拥有的权重。 属性值为 0 至 1 之间的浮点数。属性值为 0 表示当动态骨骼同时会物理模拟和播放动画时,只会播放骨骼动画;属性值为 1 表示当动态骨骼同时会物理模拟和播放动画时,只会物理模拟。 |
| 碰撞器列表(Colliders) | |
| 元素条目(Element) | 元素条目的属性值用于设置需要与该动态骨骼进行碰撞检测的碰撞器。 · 创建元素条目:如果您需要创建元素条目,请在列表下方点击 追加(Append)按钮。 【DynamicBone009.png】 · 定义元素条目数:列表右上角可设置列表中元素条目的数量,元素条目会根据设置的数量增删,会优先删除序号更大的元素条目。 【DynamicBone010.png】 · 删除:鼠标左键点击元素条目右侧的删除按钮(x),可对元素条目进行删除。 【DynamicBone011.png】 · 赋值:您可以从 层级窗口(Hierachy)将对应绑定了 动态骨骼碰撞器(Dynamic Bone Collider)组件的骨骼节点拖入,或点击条目选框右侧的圆形图标打开选择列表选择绑定了动态骨骼碰撞器组件的骨骼节点,用以分配给此元素条目。 |
| 排除节点列表(Exclusions) | |
| 元素条目(Element) | 在设置 根节点(Root)或 根节点列表(Roots)后,动态骨骼会根据骨骼节点 游戏对象(Game Object)的层级关系,沿着根节点子集游戏对象方向自动生成动态骨骼节点树,此属性中元素条目的属性值,用于设置在动态骨骼节点树中,需要排除的动态骨骼节点。 · 创建元素条目:如果您需要创建元素条目,请在列表下方点击 追加(Append)按钮。 【DynamicBone012.png】 · 定义元素条目数:列表右上角可设置列表中元素条目的数量,元素条目会根据设置的数量增删,会优先删除序号更大的元素条目。 【DynamicBone013.png】 · 删除:鼠标左键点击元素条目右侧的删除按钮(x),可对元素条目进行删除。 【DynamicBone014.png】 · 赋值:您可以从 层级窗口(Hierachy)将需要排除的骨骼节点拖入,或点击条目选框右侧的圆形图标打开选择列表选择需要排除的骨骼节点用以分配给此元素条目。 |
| 冻结轴(Freeze Axis) | 限制动态骨骼在特定平面上移动。其中所选定的轴为对应平面的法向量。 · 不限制(None),不将动态骨骼固定在任何平面上。 · X / Y / Z,将动态骨骼固定在世界坐标 X / Y / Z 轴为法线的平面上,即动态骨骼任何骨骼节点的世界坐标位置,X / Y / Z 值与动态骨骼根节点保持一致。 |
| 距离控制开关(Distant Disable) | 开启或者关闭距离控制机制,是用于减少动态骨骼性能损耗的方式。 |
| 参考对象(Reference Object) | 用于判断动态骨骼是否进行物理模拟的参考 游戏对象(Game Object),如果属性值为空,则动态骨骼会选择场景内的主摄影机作为参考对象。 |
| 参考距离(Distance To Object) | 用于判断动态骨骼是否进行物理模拟的判断距离,单位与场景单位保持一致。 |
尾端虚拟骨骼
动态骨骼(Dynamic Bone)拥有 尾端虚拟骨骼(End Bone)机制,通过设置动态骨骼的 尾端长度(End Length)和 尾端偏移(End Offset)属性进行尾端虚拟骨骼的创建,作为骨骼树末尾节点的子节点。当两个属性都为 0 时,尾端虚拟骨骼将不存在。
一般情况下,动态骨骼末端骨骼节点,由于其下没有其他骨骼,所以该顶点只能有位置上的变化,无法实现顶点的旋转,这会导致部分情景下动态骨骼无法达到预期的效果。

最为常见的就是女性角色衣物的抖动,因为末端骨骼节点无法旋转导致抖动非常僵硬。
此时,您可以通过配置动态骨骼的 尾端长度(End Length)和 尾端偏移(End Offset)属性,进行尾端虚拟骨骼的创建,使末端动态骨骼节点拥有旋转信息,让动态骨骼的运动符合预期的效果。

通过对尾端虚拟骨骼的调整,可以让角色衣物的抖动更自然。
避免穿模
动态骨骼(Dynamic Bone)在物体运动期间,有时会与原模型的 网格(Mesh)产生交集,导致出现穿模的情况。

图中移动人物模型时,动态骨骼控制的头发偶尔会穿过人物的身体,造成穿模。
此时您可以在可能会因穿模影响显示效果的地方添加 动态骨骼碰撞器(Dynamic Bone Collider)组件(Component),并调整碰撞器至近似于该网格形状。调整和添加动态骨骼碰撞器的方法请参阅 动态骨骼碰撞器组件 章节。

图中为了防止头发穿过人物身体,在人物身体上添加了形状近似于人物体型的动态骨骼碰撞器。
为了区分该动态骨骼仅会与哪些动态骨骼碰撞器发生碰撞效果,需要将挂载了动态骨骼碰撞器的 游戏对象(Game Object)分配到动态骨骼组件的 碰撞器列表(Colliders)中。

此时动态骨骼就会与对应的动态骨骼碰撞器发生碰撞,避免造成穿模。

处理后,移动人物时,头发也不会穿模进入人物身体内。

