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.

使用 SoftBody3D

柔体(或柔体动力学)模拟可变形物体的运动,改变形状和其他物理特性。例如,这个功能可以用于模拟布料或创建更逼真的角色。

物理引擎相关注意事项

与 GodotPhysics3D 相比,Jolt 物理系统对柔体的支持通常更加强大。你可以通过在项目设置中更改 物理引擎 > 3D > 物理引擎 选项来更换物理引擎。Godot 4.6 及更高版本创建的项目默认使用 Jolt 物理系统,但现有项目需要手动切换。

此外,physics interpolation 目前不会影响柔体。如果希望在较高帧率下柔体模拟看起来更平滑,需要增加项目设置 物理 > 通用 > 每秒物理周期数 的值,但这会带来性能开销。

基本设置

SoftBody3D 节点用于柔体模拟。与其他物理体节点(如 RigidBody3DStaticBody3D)不同,它 没有 CollisionShape3DMeshInstance3D 子节点。相反,碰撞形状由分配给该节点的网格自动生成。该网格也直接用于渲染,这意味着你无需创建任何子节点即可获得可用且可见的柔体效果。

我们将创建一个弹性立方体来演示柔体的设置。

创建一个以 Node3D 节点为根的新场景。然后,创建一个 SoftBody3D 节点。在检查器中,将 Mesh 属性设置为 BoxMesh,并增加网格的细分(subdivision)等级以用于模拟。

细分( Subdivision )等级决定变形的精度,数值越高可以实现更小、更精细的变形,但会带来性能开销。在此示例中,我们将在每个轴上将其设置为 3:

在检查器中调整 BoxMesh 属性

在检查器中调整 BoxMesh 属性

现在,设置各项参数以获得所需类型的柔体。尽量将 Simulation Precision(模拟精度) 保持在 5 以上,否则柔体可能会塌陷。

在检查器中调整 SoftBody3D 的模拟属性

在检查器中调整 SoftBody3D 的模拟属性

备注

某些参数需要谨慎处理,因为不当数值可能导致异常效果。例如,如果形状没有完全封闭且将压力(pressure)设置为大于 0.0 的值,柔体可能会像受强风吹拂的塑料袋一样飞来飞去。

运行场景以查看模拟效果。以下是示例效果:

小技巧

要改善模拟效果,可以提高 Simulation Precision。这可以显著提升效果,但会带来性能开销。

另外,你也可以增加项目设置中的 物理 > 通用 > 每秒物理周期数 的值,这也会影响柔体模拟的质量。

斗篷模拟

我们将在 Platformer3D 演示中制作一条斗篷。

备注

你可以在 GitHub资产库上下载 Platformer3D 演示。

打开 player/player.tscn 场景,在根节点下添加一个 SoftBody3D 节点,然后在其 Mesh 属性中分配一个 PlaneMesh 资源。

打开 PlaneMesh 的属性,将尺寸(Size)设置为 (0.5, 1.0),然后将 Subdivide WidthSubdivide Depth 设置为 5。调整 SoftBody3D 节点的位置和旋转,使平面看起来靠近角色的背部。最终效果应类似如下:

对 PlaneMesh 进行细分(Subdivision)并将其放置在角色的背部

对 PlaneMesh 进行细分(Subdivision)并将其放置在角色的背部

小技巧

细分会生成更多三角面片的网格,以获得更好的模拟效果。然而,较高的细分等级会影响性能。请尝试在性能与质量之间找到平衡。这取决于同时活跃的柔体模拟数量,以及相机与柔体之间的距离。

在骨架节点下添加 BoneAttachment3D 节点,然后选择 Neck(颈部)骨骼,将斗篷附加到角色骨架。

备注

BoneAttachment3D 节点用于将对象附着到骨骼(armature)的某根骨头上。附着的对象会跟随骨骼的移动。例如,角色手持的武器可以通过这种方式附着。

目前 不要 将 SoftBody3D 节点移动到 BoneAttachment3D 节点下。我们将通过配置其 pinned points 来使其跟随 BoneAttachment3D 节点。

在检查器中配置 BoneAttachment3D 节点

在检查器中配置 BoneAttachment3D 节点

要创建固定顶点(pinned points),在 SoftBody3D 节点中选择上方的顶点。在 3D 编辑器视口中,固定顶点会显示为蓝色:

在检查器中固定 SoftBody3D 的顶点

在检查器中固定 SoftBody3D 的顶点

固定顶点(pinned points)位于 SoftBody3D 的 Attachments 部分,该部分在 Collision 下方,需要先展开 Collision。为每个固定顶点选择 BoneAttachment3D 节点作为 Spatial Attachment Path。现在,固定顶点已附着到角色的颈部。

小技巧

为了更快速地分配属性,你可以将场景树面板中的 BoneAttachment3D 节点拖放到 Spatial Attachment Path 属性字段中。

请注意,你可能需要先取消选中再重新选中 SoftBody3D 节点,Attachments 部分才会显示。

在 SoftBody3D 检查器中,把 pinned points 附着到 BoneAttachment3D 节点

在 SoftBody3D 检查器中,把 pinned points 附着到 BoneAttachment3D 节点

最后一步,为避免穿透,将 CharacterBody3D 节点 Player(场景的根节点)添加到 SoftBody3D 的 Parent Collision Ignore 属性中。

在 SoftBody3D 检查器中设置碰撞例外(collision exception)

在 SoftBody3D 检查器中设置碰撞例外(collision exception)

播放场景,应该已经正确模拟了斗篷。

运行项目主场景后的最终效果

运行项目主场景后的最终效果

以上介绍了柔体模拟的基本设置。在制作游戏时,可以根据目标效果自行尝试和调整这些参数。

备注

由于背面剔除(backface culling),斗篷在某些角度下可能不会显示。为解决此问题,你可以为其分配一个新的 StandardMaterial3D,然后将其剔除模式(Cull Mode)设置为 Disabled。这样材质就会渲染平面的两面。

使用导入的网格

高级导入设置对话框中的 Save to File 选项允许你将网格保存为一个独立的资源文件,之后即可将其分配给 SoftBody3D 节点使用。

在导入用于 SoftBody3D 的网格时,你可能还需要禁用 LOD 生成功能,或调整 LOD 的生成选项。默认的导入设置会生成 LOD,并在渲染距离非常近时,仍会将彼此几乎共面的相邻面合并在一起。这种方式非常适合静态网格,但如果用于 SoftBody3D 往往并不理想,因为你通常希望这些面能够相互弯曲、独立运动,而不是被当作一个单一的平面来渲染。

详见 导入配置网格的细节级别(LOD)