Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
使用 SoftBody3D
柔体(或柔体动力学)模拟可变形物体的运动,改变形状和其他物理特性。例如,这个功能可以用于模拟布料或创建更逼真的角色。
物理引擎相关注意事项
与 GodotPhysics3D 相比,Jolt 物理系统对柔体的支持通常更加强大。你可以通过在项目设置中更改 物理引擎 > 3D > 物理引擎 选项来更换物理引擎。Godot 4.6 及更高版本创建的项目默认使用 Jolt 物理系统,但现有项目需要手动切换。
此外,physics interpolation 目前不会影响柔体。如果希望在较高帧率下柔体模拟看起来更平滑,需要增加项目设置 物理 > 通用 > 每秒物理周期数 的值,但这会带来性能开销。
基本设置
SoftBody3D 节点用于柔体模拟。与其他物理体节点(如 RigidBody3D 或 StaticBody3D)不同,它 没有 CollisionShape3D 或 MeshInstance3D 子节点。相反,碰撞形状由分配给该节点的网格自动生成。该网格也直接用于渲染,这意味着你无需创建任何子节点即可获得可用且可见的柔体效果。
我们将创建一个弹性立方体来演示柔体的设置。
创建一个以 Node3D 节点为根的新场景。然后,创建一个 SoftBody3D 节点。在检查器中,将 Mesh 属性设置为 BoxMesh,并增加网格的细分(subdivision)等级以用于模拟。
细分( Subdivision )等级决定变形的精度,数值越高可以实现更小、更精细的变形,但会带来性能开销。在此示例中,我们将在每个轴上将其设置为 3:
在检查器中调整 BoxMesh 属性
现在,设置各项参数以获得所需类型的柔体。尽量将 Simulation Precision(模拟精度) 保持在 5 以上,否则柔体可能会塌陷。
在检查器中调整 SoftBody3D 的模拟属性
备注
某些参数需要谨慎处理,因为不当数值可能导致异常效果。例如,如果形状没有完全封闭且将压力(pressure)设置为大于 0.0 的值,柔体可能会像受强风吹拂的塑料袋一样飞来飞去。
运行场景以查看模拟效果。以下是示例效果:
小技巧
要改善模拟效果,可以提高 Simulation Precision。这可以显著提升效果,但会带来性能开销。
另外,你也可以增加项目设置中的 物理 > 通用 > 每秒物理周期数 的值,这也会影响柔体模拟的质量。
斗篷模拟
我们将在 Platformer3D 演示中制作一条斗篷。
打开 player/player.tscn 场景,在根节点下添加一个 SoftBody3D 节点,然后在其 Mesh 属性中分配一个 PlaneMesh 资源。
打开 PlaneMesh 的属性,将尺寸(Size)设置为 (0.5, 1.0),然后将 Subdivide Width 和 Subdivide Depth 设置为 5。调整 SoftBody3D 节点的位置和旋转,使平面看起来靠近角色的背部。最终效果应类似如下:
对 PlaneMesh 进行细分(Subdivision)并将其放置在角色的背部
小技巧
细分会生成更多三角面片的网格,以获得更好的模拟效果。然而,较高的细分等级会影响性能。请尝试在性能与质量之间找到平衡。这取决于同时活跃的柔体模拟数量,以及相机与柔体之间的距离。
在骨架节点下添加 BoneAttachment3D 节点,然后选择 Neck(颈部)骨骼,将斗篷附加到角色骨架。
备注
BoneAttachment3D 节点用于将对象附着到骨骼(armature)的某根骨头上。附着的对象会跟随骨骼的移动。例如,角色手持的武器可以通过这种方式附着。
目前 不要 将 SoftBody3D 节点移动到 BoneAttachment3D 节点下。我们将通过配置其 pinned points 来使其跟随 BoneAttachment3D 节点。
在检查器中配置 BoneAttachment3D 节点
要创建固定顶点(pinned points),在 SoftBody3D 节点中选择上方的顶点。在 3D 编辑器视口中,固定顶点会显示为蓝色:
在检查器中固定 SoftBody3D 的顶点
固定顶点(pinned points)位于 SoftBody3D 的 Attachments 部分,该部分在 Collision 下方,需要先展开 Collision。为每个固定顶点选择 BoneAttachment3D 节点作为 Spatial Attachment Path。现在,固定顶点已附着到角色的颈部。
小技巧
为了更快速地分配属性,你可以将场景树面板中的 BoneAttachment3D 节点拖放到 Spatial Attachment Path 属性字段中。
请注意,你可能需要先取消选中再重新选中 SoftBody3D 节点,Attachments 部分才会显示。
在 SoftBody3D 检查器中,把 pinned points 附着到 BoneAttachment3D 节点
最后一步,为避免穿透,将 CharacterBody3D 节点 Player(场景的根节点)添加到 SoftBody3D 的 Parent Collision Ignore 属性中。
在 SoftBody3D 检查器中设置碰撞例外(collision exception)
播放场景,应该已经正确模拟了斗篷。
运行项目主场景后的最终效果
以上介绍了柔体模拟的基本设置。在制作游戏时,可以根据目标效果自行尝试和调整这些参数。
备注
由于背面剔除(backface culling),斗篷在某些角度下可能不会显示。为解决此问题,你可以为其分配一个新的 StandardMaterial3D,然后将其剔除模式(Cull Mode)设置为 Disabled。这样材质就会渲染平面的两面。
使用导入的网格
高级导入设置对话框中的 Save to File 选项允许你将网格保存为一个独立的资源文件,之后即可将其分配给 SoftBody3D 节点使用。
在导入用于 SoftBody3D 的网格时,你可能还需要禁用 LOD 生成功能,或调整 LOD 的生成选项。默认的导入设置会生成 LOD,并在渲染距离非常近时,仍会将彼此几乎共面的相邻面合并在一起。这种方式非常适合静态网格,但如果用于 SoftBody3D 往往并不理想,因为你通常希望这些面能够相互弯曲、独立运动,而不是被当作一个单一的平面来渲染。
详见 导入配置 和 网格的细节级别(LOD)。