PhysBones
PhysBones 是一组组件,让你可以为化身和世界中的物体添加次级运动,使你能够为头发、尾巴、耳朵、衣物、线缆、植物等添加运动效果!善用这些组件能让你的化身看起来更加生动真实,让世界更具沉浸感。
关于如何在化身上使用 PhysBones 的示例可以在 Avatars SDK 中找到。要访问它,请从 Unity 窗口顶部菜单栏进入 VRChat SDK\Samples,然后为你的平台选择相应的示例化身。
VRCPhysBone
定义一组需要使用 PhysBones 进行动画的骨骼链。这些可用于模拟软体和次级运动,如头发、尾巴、松软的耳朵等!它有许多配置选项,可以通过多种方式进行设置。
此外,你和他人都可以与 PhysBones 进行交互!你可以抓取 PhysBones 来移动它们,并在抓住 PhysBone 时扣动扳机来"固定"它并保持位置。你也可以在配置中禁用这些功能,不允许固定、不允许抓取,或者完全不允许碰撞。对于附着在你化身上的 PhysBones,如果你的交互设置允许,其他人也可以抓取和固定你的 PhysBones!
虽然不是为此设计的,但在我们实现自己的 Cloth 组件之前,PhysBones 也可以作为一个不错的布料替代品。

版本
你可以直接在组件上选择要使用的 VRCPhysBone 组件版本。默认情况下,创建新组件时会选择最新版本。现有的 PhysBone 将继续使用其以前的版本,除非手动更新并重新上传。
版本 1.0:
- VRCPhysBone 组件的基础版本。
版本 1.1:
- Squishy Bones 更新,允许骨骼因运动而挤压和改变长度。
- 重力现在作为一个比例,决定骨骼在静止时旋转的程度。需要正的 Pull 值才能使骨骼沿重力方向移动。
- 刚度现在作为一个比例,使骨骼保持在其先前的方向上。
变换
Root Transform - 此组件开始的变换。如果留空,则假定从该游戏对象开始。
Ignore Transforms - 不应受此组件影响的忽略变换列表。被忽略的变换会自动包含该变换的所有子级。
Ignore Other Phys Bones - 启用后,PhysBone 会忽略场景层级中自身下方的其他 PhysBone 及其受影响的变换。此选项默认启用,禁用以外的行为可能不受支持。
Endpoint Position - 用于在骨骼链的每个端点处创建额外骨骼的向量。仅当值为非零时使用。通常你会希望沿 +Y 方向增加,这指向骨骼的"上方"。
Multi-Child Type - 当存在多个骨骼链时根骨骼的行为。有三种模式:
如果设置为 Ignore,根骨骼将不会移动,并忽略物理效果。适用于化身头发等场景,因为你可以使用一个 PhysBone 组件在根部影响所有头发骨骼!
如果设置为 First,根骨骼将与层级中的第一个骨骼链形成一个连续的链条。其他每个链仍然有效,但它们将从各自链中的第一个骨骼开始,而不是像第一个链那样从根部开始。
如果设置为 Average,根骨骼的运动将是所有其他链的平均值。这意味着每个链的基部将能够移动。
如果你使用单个根骨骼,或一个根骨骼带有多个子级(但没有孙级),你必须定义端点位置!
例如,如果你将 PhysBone 组件放在以下任何 RootBone 上,你必须定义一个 Endpoint Position 才能使 PhysBones 正常工作。这与 Dynamic Bones 不同!
单骨骼
RootBone
多子级,单根
RootBoneChildBone1ChildBone2ChildBone3ChildBone4
你也可以通过在每个 ChildBone 之后添加"末端骨骼"来解决此问题,但这涉及编辑骨架。
力
Integration Type 定义了用于模拟受此组件影响的任何变换运动的数学方法。根据你的 选择,"力"部分中的可用选项将发生变化。你可以在两种类型之间选择:
Simplified(简化)是一种更稳定的方法,感觉稍慢且对外部冲量和力的反应较弱,但更易于配置。Advanced(高级)稳定性较差,但允许更复杂的配置,并且往往对外部冲量和力的反应更灵敏。 在默认设置下,这两种模式的表现相当类似,但调整设置并进行测试将很快揭示它们的不同之处。
以下大多数(如果不是全部)选项都允许通过按滑块旁边的 C 按钮来使用曲线。曲线允许你沿骨骼链长度调整数值,并实现骨骼链内非常复杂的设置!
事实上,大多数 PhysBones 设置都允许使用曲线!学会使用它们,你的 PhysBones 将会看起来惊人!

Pull(拉力) - 用于将骨骼恢复到其静止位置的力的大小。
Spring(弹簧) - 骨骼在尝试到达其静止位置时的摆动量。仅在 Simplified 积分类型中可用。
Momentum(动量) - 骨骼在尝试到达其静止位置时的摆动量。仅在 Advanced 积分类型中可用。尽管描述相同,但效果与 Spring 略有不同。
Stiffness(刚度) - 骨骼试图保持在其静止位置的程度。仅在 Advanced 积分类型中可用。
Gravity(重力) - 施加到骨骼上的重力大小。正值将骨骼向下拉,负值向上拉。
Gravity Falloff(重力衰减) - 仅在 Gravity 非零时可用。它控制在静止位置时减少多少重力。值为 1.0 意味着在静止位置时重力完全不影响骨骼。这允许你在骨骼从初始位置旋转时产生重力效果,而不影响骨骼的静止状态。
使用 Gravity Falloff 参数的一种方式是,如果你的化身头发建模为在正常站立时已处于你想要的姿势,你可以使用 1.0 的重力衰减。这样,当你只是站在那里时,重力不会影响你,你的头发将保持在建模位置。如果你的头发建模为 45 度笔直向外,并且你希望它受到足够重力影响以形成漂亮的曲线(但不是完全笔直向外或完全笔直向下),滑块允许你进行调整,使用 0.5-0.8 使其在静止姿势时只受到一部分重力。
Immobile Type(不动类型)改变了 Immobile 的工作方式。
如果设置为 All Motion(所有运动),Immobile 会减少从根变换的父级计算出的任何运动。这是新 PhysBones 和转换后的 Dynamic Bones 的默认模式。在此模式下,所有在场景空间或游玩空间中的 PhysBone 运动都将被 Immobile 因子减弱。
如果设置为 World (Experimental)(世界(实验性)),Immobile 仅抵消来自场景根变换参考的位置运动。通过动画或 IK 的运动仍然正常影响骨骼。此模式未来可能会更改!
在你使用的化身的上下文中,这意味着在游玩空间中移动仍然会正常影响你的 PhysBones 运动,但 locomotion(推动摇杆移动)的运动将被 Immobile 因子减弱。
限制
设置限制允许你限制 PhysBone 链可以移动的范围。这对于避免化身上头发穿模到头内等情况非常有用,并且比碰撞体性能高得多!
此外,在配置限制选项时,当你选中 PhysBone 链时,场景视图中将显示这些限制的可视化效果。这在微调限制时非常有用!
Limit Type(限制类型)有几种模式。它们都允许以 Pitch(俯仰)、Yaw(偏航)和 Roll(滚转)来调整 Rotation——也就是分别沿 X、Y 和 Z 轴。
None(无)
None 表示此骨骼链上未启用限制。没有配置选项。
Angle(角度)

Angle 表示骨骼链将被限制在某个 Max Angle(最大角度)内,以 Rotation 定义的轴为中心。在场景视图中显示为锥体。
Hinge(铰链)

Hinge 表示骨骼链将被限制在由 Rotation 定义的平面上的某个 Max Angle 内。在场景视图中显示为一个圆形的切片,类似于披萨或馅饼。
Polar(极坐标)

Polar 稍微复杂一些。如果你拿一个 Hinge 并使其在 Yaw 方向上扫过一定量,你会得到极坐标 Polar 下的球体片段。你可以配置 Max Pitch 和 Max Yaw 来调整片段的大小,并使用 Rotation 来定义该片段在球体上的位置。Polar 的可视化效果特别有帮助。
不要过度使用 Polar 限制,因为它们有非零的性能成本。使用大量(粗略估计:超过 64 个)可能会导致一些问题。如果你的 Max Pitch 和 Max Yaw 值相似或相同,使用 Angle 限制就足够了,并且性能成本更低。
碰撞
Radius(半径) - 每个骨骼周围的碰撞半径,单位为米。用于碰撞和抓取。
Allow Collision(允许碰撞) - 允许与此组件上指定的碰撞体之外的碰撞体发生碰撞。
Colliders(碰撞体) - 与此骨骼链特定碰撞的碰撞体列表。
Allow Collision 有三个可用选项:
如果设置为 True,此 PhysBone 将与全局碰撞体发生碰撞。这包括每个玩家化身定义的手部碰撞体,以及化身上或世界中任何自定义的全局碰撞体。
如果设置为 False,此 PhysBone 将仅与 Colliders 列表中列出的碰撞体发生碰撞。
如果设置为 Other(其他),你将获得更多选项来控制碰撞行为,基于这是化身还是世界。对于化身上的 PhysBone,你可以过滤为此化身和其他化身/世界上的碰撞体。对于世界中的 PhysBone,你可以设置它是否能够响应世界、化身、物品或这三者混合中的碰撞体。
拉伸与挤压
Stretch Motion(拉伸运动) - 运动影响骨骼拉伸/挤压的程度。值为零意味着骨骼仅在抓取或碰撞时才会拉伸/挤压。
Max Stretch(最大拉伸) - 骨骼可以拉伸的最大量。该值是原始骨骼长度的倍数。注意:最大边界
Max Squish(最大挤压) - 骨骼可以收缩的最大量。该值是原始骨骼长度的倍数。
抓取与固定
Allow Grabbing(允许抓取) - 允 许玩家抓取骨骼。在化身上,你可以选择在穿戴该化身的用户和其他用户之间进行过滤。
Allow Posing(允许固定) - 允许玩家在抓取后固定骨骼。在化身上,你可以选择在穿戴该化身的用户和其他用户之间进行过滤。
Grab Movement(抓取运动) - 控制被抓取的骨骼如何移动。值为零时,骨骼使用拉力和弹簧到达抓取位置。值为一时,骨骼立即移动到抓取位置。
Snap To Hand(吸附到手) - 当骨骼被抓取时,它将吸附到抓取它的骨骼上。
选项
Parameter(参数) - 仅适用于化身 PhysBones 的选项(参见世界中的 PhysBone Udon 访问了解如何从世界中的 PhysBone 获取此数据)。这是一个前缀,用于向化身控制器提供多个参数。例如,在以下项目中,将 Parameter 设置为 Tail 会将 {parameter} 替换为 Tail。
一旦 Parameter 设置为任何值,以下参数将在你的化身动画控制器上设置:
-
{parameter}_IsGrabbed[Bool] - 骨骼当前是否被抓取 -
{parameter}_IsPosed[Bool] - 骨骼被抓取后是否被固定 -
{parameter}_Angle[Float] - 范围 0.0-1.0。末端骨骼与其原始静止位置之间归一化的 180 度角度。换句话说,如果你将骨骼完全旋转到与其起始方向相反的方向,此参数的值将为 1.0。 -
{parameter}_Stretch[Float] - 范围 0.0-1.0。骨骼接近其最大拉伸长度的程度。 -
{parameter}_Squish[Float] - 范围 0.0-1.0。骨骼接近其最大挤压长度的程度。
Is Animated(已设置动画) - 允许骨骼变换被动画化。每帧骨骼静止位置将根据动画内容进行更新。必须启用此选项,PhysBone 链中的任何骨骼(包括根骨骼!)才能响应应用于其上的动画。
Reset When Disabled(禁用时重置) - 当此组件被禁用时,骨骼将自动重置到其默认位置。
Gizmos
这些设置控制 PhysBone 在 Unity 编辑器场景视图中的显示方式。它们对你的 PhysBone 行为没有影响。
Show Gizmos(显示 Gizmos) - 是否在场景视图中显示此组件的 Gizmos。如果看不到它们,请确保场景视图本身也已启用 Gizmos。
Bone Opacity(骨骼不透明度) - 设置表示骨骼本身的 Gizmos 的不透明度。
Limit Opacity(限制不透明度) - 设置表示应用于骨骼的运动限制的 Gizmos 的不透明度。
重要提示、使用技巧等
不要让约束(Constraint)和 PhysBone 组件影响同一个游戏对象,因为这会导致执行顺序问题。
应将约束应用于父级游戏对象。你仍然可以将约束的源变换设置为原始游戏对象。
化身 PhysBones 在 Meta Quest 上存在硬性限制。 这是为了防止在 Meta Quest 设备上性能下降,这些设备的 CPU 资源通常已经较低。
你可以将这些限制视为 最低显示性能等级 文档中描述的 Quest 的 Very Poor 限制。
此硬性限制不适用于世界,但如果你的世界在移动设备上可用,仍应考虑限制 PhysBones 的数量,以避免导致性能问题而将玩家挤出你的世界。
每个组件的限制
单个 PhysBone 组件一次不能影响超过 256 个变换。 这包括根骨骼以及所有子级。这也影响化身上的 Dynamic Bone 转换!
但是,你应尽量避免一开始就有那么多变换需要动画。尝试将链中的骨骼向上合并到其直接父级。社区创建的工具如 Cat's Blender Plugin 可以为你完成此操作。
更改 PhysBone 属性
PhysBone 属性如 Spring、Pull、Stiffness 等是在初始化时设置的。
在化身上,这些值旨在保持恒定,并且不能被动画化。但是 ,如果你对 PhysBone 组件的属性进行动画,然后将该组件关闭再打开,你_可能_会得到你想要的行为。请注意,这不是动画化这些属性的受支持方法,并且在未来的更改中将不受支持。(换句话说,它可能会出问题,如果出了问题,我们不会尝试修复它。)
在世界中,你可以通过 Udon 脚本来更改 PhysBone 的属性,但仍应尽量限制这样做的频率。更多信息请参见世界中的 PhysBone Udon 访问。
人形骨骼
不要将人形骨骼设置为 PhysBone 根骨骼。 也就是说,不要将 Hip、Spine、Chest、Upper Chest、Neck、Head 或任何肢体骨骼设置为根骨骼。这会导致重大问题。
相反,应复制你想用作根的骨骼,然后将所有要动画化的子骨骼重新父级到新的复制根。这应在 Blender 中完成。社区创建的工具如 Cat's Blender Plugin 可以为你完成此操作。
PhysBone 旋转
与 Dynamic Bones 不同,PhysBone 链的根骨骼允许旋转。 但它不能平移。这可能会在某些设置下产生一些后果——请自行尝试以了解其行为。
PhysBone AV3 参数
当影响 AV3 化身参数时,