SoftBody3D
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — SoftBody3D
SoftBody3D
节点继承关系
继承链:Node -> Node3D -> MeshInstance3D -> SoftBody3D
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
SoftBody3D 是一个"软体物理"节点。普通的3D物体(RigidBody3D)是硬的,碰到墙壁会弹开。而 SoftBody3D 是软的,就像果冻、气球、布料一样,碰到东西会变形、弹动、摇晃。
简单说:它让3D物体有软绵绵的物理效果,像果冻一样可以变形。
使用频率:★ 基本用不到
节点用途
- 软体物体:气球、果冻、海绵等柔软物体
- 旗帜/布料:飘动的旗帜、窗帘
- 角色装饰:角色身上飘动的围巾、披风
- 弹性物体:弹力球、橡皮泥
使用场景
| 场景 | 说明 |
|---|---|
| 休闲游戏 | 果冻、气球等柔软物体 |
| 角色装饰 | 角色身上飘动的披风和围巾 |
| 特效 | 飘动的旗帜、布料 |
常用节点搭配
| 搭配节点 | 搭配方式 |
|---|---|
| MeshInstance3D | SoftBody3D 继承自 MeshInstance3D,自带网格显示 |
| StaticBody3D | 作为碰撞体,软体会与它碰撞变形 |
生效必备素材/资源
SoftBody3D 需要一个 Mesh 资源(网格模型)。
节点属性与信号
属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
| simulation_precision | int | 5 | SoftBody3D | 模拟精度。数值越大越精确,但越消耗性能 |
| parent_collision_ignore | bool | false | SoftBody3D | 是否忽略与父节点的碰撞 |
| collision_mask | int | 1 | SoftBody3D | 碰撞层掩码 |
| damping_coefficient | float | 0.01 | SoftBody3D | 阻尼系数。值越大,运动衰减越快 |
| drag_coefficient | float | 0.0 | SoftBody3D | 拖拽系数 |
信号
SoftBody3D 没有自己的特有信号。
常用方法
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| GetPointTransform(pointIndex) | pointIndex: int | Transform3D | 获取某个控制点的变换 |
| PinPoint(index) | index: int | void | 固定某个点,使它不能移动 |
代码示例
C
// C# - 创建一个弹跳的软体球
using Godot;
public partial class SoftBall : SoftBody3D
{
public override void _Ready()
{
// 设置物理参数
DampingCoefficient = 0.05f;
DragCoefficient = 0.1f;
SimulationPrecision = 5;
// 固定顶部的点(如果需要把气球绑在某个位置)
// PinPoint(0);
}
public override void _Process(double delta)
{
// 可以在这里施加力让软体运动
// 例如:给所有顶点施加一个向上的力模拟风吹
}
}GDScript
# GDScript - 创建一个弹跳的软体球
extends SoftBody3D
func _ready():
# 设置物理参数
damping_coefficient = 0.05
drag_coefficient = 0.1
simulation_precision = 5
# 固定顶部的点(如果需要把气球绑在某个位置)
# pin_point(0)