SoftBody3D

继承: MeshInstance3D < GeometryInstance3D < VisualInstance3D < Node3D < Node < Object

可形变的 3D 物理网格。

描述

可形变的 3D 物理网格。用于创建弹性或可形变的对象,例如布料、橡胶或其他柔性材质。

此外,SoftBody3DArea3D 中定义的风力影响(参见 Area3D.wind_source_pathArea3D.wind_force_magnitudeArea3D.wind_attenuation_factor)。

注意:使用 SoftBody3D 时建议使用 Jolt Physics,不要使用默认的 GodotPhysics3D,因为 Jolt Physics 的柔体实现更快更可靠。你可以使用 ProjectSettings.physics/3d/physics_engine 项目设置来切换物理引擎。

教程

属性

int

collision_layer

1

int

collision_mask

1

float

damping_coefficient

0.01

DisableMode

disable_mode

0

float

drag_coefficient

0.0

float

linear_stiffness

0.5

NodePath

parent_collision_ignore

NodePath("")

float

pressure_coefficient

0.0

bool

ray_pickable

true

float

shrinking_factor

0.0

int

simulation_precision

5

float

total_mass

1.0

方法

void

add_collision_exception_with(body: Node)

void

apply_central_force(force: Vector3)

void

apply_central_impulse(impulse: Vector3)

void

apply_force(point_index: int, force: Vector3)

void

apply_impulse(point_index: int, impulse: Vector3)

Array[PhysicsBody3D]

get_collision_exceptions()

bool

get_collision_layer_value(layer_number: int) const

bool

get_collision_mask_value(layer_number: int) const

RID

get_physics_rid() const

Vector3

get_point_transform(point_index: int)

bool

is_point_pinned(point_index: int) const

void

remove_collision_exception_with(body: Node)

void

set_collision_layer_value(layer_number: int, value: bool)

void

set_collision_mask_value(layer_number: int, value: bool)

void

set_point_pinned(point_index: int, pinned: bool, attachment_path: NodePath = NodePath(""), insert_at: int = -1)


枚举

enum DisableMode: 🔗

DisableMode DISABLE_MODE_REMOVE = 0

Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,从物理仿真中移除,停止与此 SoftBody3D 的所有物理交互。

当该 Node 再次被处理时,会自动重新加入到物理仿真中。

DisableMode DISABLE_MODE_KEEP_ACTIVE = 1

Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,不影响物理仿真。


属性说明

int collision_layer = 1 🔗

  • void set_collision_layer(value: int)

  • int get_collision_layer()

该 SoftBody3D 所在的物理层。碰撞对象可以存在于 32 个不同层中的一个或多个层中。另见 collision_mask

注意:只有当对象 B 位于对象 A 扫描的任意层中时,对象 A 才能检测到与对象 B 的接触。有关更多信息,请参阅文档中的《碰撞层与掩码》


int collision_mask = 1 🔗

  • void set_collision_mask(value: int)

  • int get_collision_mask()

该 SoftBody3D 扫描的物理层。碰撞对象可以扫描 32 个不同层中的一个或多个层。另见 collision_layer

注意:只有当对象 B 位于对象 A 扫描的任何层中时,对象 A 才能检测到与对象 B 的接触。有关更多信息,请参阅文档中的《碰撞层与掩码》


float damping_coefficient = 0.01 🔗

  • void set_damping_coefficient(value: float)

  • float get_damping_coefficient()

物体的阻尼系数。当施加力时,较高的值会更明显地减慢物体的速度。


DisableMode disable_mode = 0 🔗

定义 Node.process_modeNode.PROCESS_MODE_DISABLED 时的物理行为。


float drag_coefficient = 0.0 🔗

  • void set_drag_coefficient(value: float)

  • float get_drag_coefficient()

物体的阻力系数。较高的值会增加该物体的空气阻力。

注意:Godot 的默认物理实现当前未使用该值。


float linear_stiffness = 0.5 🔗

  • void set_linear_stiffness(value: float)

  • float get_linear_stiffness()

值越大得到的物体约坚硬,较低的值会提高物体的弯曲能力。取值范围为 0.01.0 之间(含端点)。


NodePath parent_collision_ignore = NodePath("") 🔗

  • void set_parent_collision_ignore(value: NodePath)

  • NodePath get_parent_collision_ignore()

指向 CollisionObject3DNodePath,这个 SoftBody3D 应该避免穿过它。


float pressure_coefficient = 0.0 🔗

  • void set_pressure_coefficient(value: float)

  • float get_pressure_coefficient()

该软体的压力系数。模拟物体内部的压力积聚。较高的值会增加该效果的强度。


bool ray_pickable = true 🔗

  • void set_ray_pickable(value: bool)

  • bool is_ray_pickable()

如果为 true,则该 SoftBody3D 会响应 RayCast3D


float shrinking_factor = 0.0 🔗

  • void set_shrinking_factor(value: float)

  • float get_shrinking_factor()

缩放 SoftBody3D 的边约束的剩余长度。正值会收缩网格,负值会扩展网格。例如,值为 0.1 会将网格的边缩短 10%,而 -0.1 则会将边扩展 10%。

注意:shrinking_factor 最适用于存在钉固点的表面网格。


int simulation_precision = 5 🔗

  • void set_simulation_precision(value: int)

  • int get_simulation_precision()

增加这个值会改善模拟结果,但会影响性能。请小心使用。


float total_mass = 1.0 🔗

  • void set_total_mass(value: float)

  • float get_total_mass()

该 SoftBody3D 的质量。


方法说明

void add_collision_exception_with(body: Node) 🔗

将一个物体添加到这个物体不能碰撞的物体列表中。


void apply_central_force(force: Vector3) 🔗

将力分配并施加到所有点上。力是时间相关的,应在每次物理更新时施加。


void apply_central_impulse(impulse: Vector3) 🔗

将冲量分配并施加到所有点上。

冲量与时间无关!如果每帧都施加冲量会得到与帧率相关的力。因此只应在模拟一次性冲击时使用(否则请使用“_force”函数)。


void apply_force(point_index: int, force: Vector3) 🔗

将力施加到某个点上。力是时间相关的,应在每次物理更新时施加。


void apply_impulse(point_index: int, impulse: Vector3) 🔗

将冲量施加到某个点上。

冲量与时间无关!如果每帧都施加冲量会得到与帧率相关的力。因此只应在模拟一次性冲击时使用(否则请使用“_force”函数)。


Array[PhysicsBody3D] get_collision_exceptions() 🔗

返回该物体的碰撞例外节点数组。


bool get_collision_layer_value(layer_number: int) const 🔗

返回 collision_layer 中是否启用了指定的层,给定的 layer_number 应在 1 和 32 之间。


bool get_collision_mask_value(layer_number: int) const 🔗

返回 collision_mask 中是否启用了指定的层,给定的 layer_number 应在 1 和 32 之间。


RID get_physics_rid() const 🔗

返回 PhysicsServer3D 用于该实体的内部 RID


Vector3 get_point_transform(point_index: int) 🔗

返回表面数组中顶点的局部平移。


bool is_point_pinned(point_index: int) const 🔗

如果顶点设置为固定,则返回 true


void remove_collision_exception_with(body: Node) 🔗

将一个物体从该物体不能碰撞的物体列表中移除。


void set_collision_layer_value(layer_number: int, value: bool) 🔗

根据 value,启用或禁用 collision_layer 中指定的层,给定的 layer_number 应在 1 和 32 之间。


void set_collision_mask_value(layer_number: int, value: bool) 🔗

根据 value,启用或禁用 collision_mask 中指定的层,给定的 layer_number 应在 1 和 32 之间。


void set_point_pinned(point_index: int, pinned: bool, attachment_path: NodePath = NodePath(""), insert_at: int = -1) 🔗

设置表面顶点的固定状态。当设置为 true 时,可选的 attachment_path 可以定义一个 Node3D,该固定顶点将被附加到该节点。