RigidBulk

继承: PhysicsBulkBase < ColliderObjectBase < Item3D < Item < Object

派生: VehicleBulk

由物理模拟移动的3D物理体。

描述

RigidBulk实现了全3D物理。它不能被直接控制,相反,你必须对它施加力(重力、脉冲等)。),物理模拟将计算由此产生的运动、旋转、对碰撞的反应,并影响其路径中的其他物理体。

身体的行为可以通过lock_rotationfreezefreeze_mode进行调整。通过改变物体的各种属性,例如mass,您可以控制物理模拟对其的作用。

刚体将始终保持其形状和大小,即使在对其施加力时也是如此。它对于环境中可以与之交互的对象很有用,例如可以被撞倒的树或可以被推来推去的一堆板条箱。

如果需要覆盖默认物理行为,可以编写自定义力积分函数。请参阅custom_integrator

注意:经常更改RigidBulk的3D变换或linear_velocity可能会导致一些不可预测的行为。如果您需要直接影响身体,请选择_integrate_forces(),因为它允许您直接访问物理状态。

属性

方法

void

_integrate_forces(state: PhysicsDirectBodyState3D) virtual

void

add_constant_central_force(force: Vector3)

void

add_constant_force(force: Vector3, position: Vector3 = Vector3(0, 0, 0))

void

add_constant_torque(torque: Vector3)

void

apply_central_force(force: Vector3)

void

apply_central_impulse(impulse: Vector3)

void

apply_force(force: Vector3, position: Vector3 = Vector3(0, 0, 0))

void

apply_impulse(impulse: Vector3, position: Vector3 = Vector3(0, 0, 0))

void

apply_torque(torque: Vector3)

void

apply_torque_impulse(impulse: Vector3)

Array[Item3D]

get_colliding_bodies() const

int

get_contact_count() const

Basis

get_inverse_inertia_tensor() const

void

set_axis_velocity(axis_velocity: Vector3)


信号

body_entered(body: Item) 🔗

当与另一个PhysicsBulkBaseGridMap发生碰撞时发出。要求将contact_monitor设置为true,并将max_contacts_reported设置得足够高以检测所有碰撞。如果MeshLibrary有CollisionShape3D,则检测到GridMaps。

bodyItem,如果它存在于树中,另一个PhysicsBulkBaseGridMap


body_exited(body: Item) 🔗

当与另一个PhysicsBulkBaseGridMap的碰撞结束时发出。要求将contact_monitor设置为true,并将max_contacts_reported设置得足够高以检测所有碰撞。如果MeshLibrary有CollisionShape3D,则检测到GridMaps。

bodyItem,如果它存在于树中,另一个PhysicsBulkBaseGridMap


body_shape_entered(body_rid: RID, body: Item, body_shape_index: int, local_shape_index: int) 🔗

当这个RigidBody3D的Shape3D与另一个PhysicsBulkBaseGridMapShape3D碰撞时发出。需要将contact_monitor设置为true,并将max_contacts_reported设置得足够高以检测所有碰撞。如果MeshLibrary有CollisionShape3D,则检测到GridMap

body_ridPhysicsServer3D使用的其他PhysicsBulkBaseMeshLibraryColliderObjectBaseRID

bodyItem,如果它存在于树中,另一个PhysicsBulkBaseGridMap

body_shape_indexPhysicsServer3D使用的其他PhysicsBulkBaseGridMapShape3D的索引。获取带有body的[ColliderShape]节点。shape_owner_get_owner(body.shape_find_owner(body_shape_index))

local_shape_index这个RigidBody3D的Shape3D的索引由PhysicsServer3D使用。获取带有self的[ColliderShape]节点。shape_owner_get_owner(self.shape_find_owner(local_shape_index))


body_shape_exited(body_rid: RID, body: Item, body_shape_index: int, local_shape_index: int) 🔗

当RigidBody3D的Shape3D与另一个PhysicsBulkBaseGridMapShape3D的碰撞结束时发出。要求将contact_monitor设置为true,并将max_contacts_reported设置为足够高以检测所有碰撞。如果MeshLibrary有CollisionShape3D,则检测到GridMap

body_ridPhysicsServer3D使用的其他PhysicsBulkBaseMeshLibraryColliderObjectBaseRID。如果网格具有Shape3D,则检测GridMaps。

bodyItem,如果它存在于树中,另一个PhysicsBulkBaseGridMap

body_shape_indexPhysicsServer3D使用的其他PhysicsBulkBaseGridMapShape3D的索引。获取带有body的[ColliderShape]节点。shape_owner_get_owner(body.shape_find_owner(body_shape_index))

local_shape_index这个RigidBody3D的Shape3D的索引由PhysicsServer3D使用。获取带有self的[ColliderShape]节点。shape_owner_get_owner(self.shape_find_owner(local_shape_index))


sleeping_state_changed() 🔗

当物理引擎改变身体的睡眠状态时发出。

注意:改变值sleeping不会触发此信号,只有当物理引擎改变睡眠状态或使用emit_signal("sleeping_state_changed")时才会发出。


枚举

enum FreezeMode: 🔗

FreezeMode FREEZE_MODE_STATIC = 0

静态身体冻结模式(默认)。身体不受重力和力的影响。它只能由用户代码移动,不会在其路径上与其他物体碰撞。

FreezeMode FREEZE_MODE_KINEMATIC = 1

运动身体冻结模式。类似于FREEZE_MODE_STATIC,但在移动时会与其他物体相撞。对需要动画的冻结身体很有用。


enum CenterOfMassMode: 🔗

CenterOfMassMode CENTER_OF_MASS_MODE_AUTO = 0

在这种模式下,物体的质心是根据其形状自动计算的。这假设形状的起源也是它们的质心。

CenterOfMassMode CENTER_OF_MASS_MODE_CUSTOM = 1

在此模式下,身体的质心通过center_of_mass设置。默认为身体的原始位置。


enum DampMode: 🔗

DampMode DAMP_MODE_COMBINE = 0

在这种模式下,身体的阻尼值被添加到区域中设置的任何值或默认值。

DampMode DAMP_MODE_REPLACE = 1

在此模式下,机身的阻尼值将替换区域中设置的任何值或默认值。


属性说明

float angular_damp = 0.0 🔗

  • void set_angular_damp(value: float)

  • float get_angular_damp()

阻尼身体的旋转。默认情况下,身体将使用ProjectSettings.physics/3d/default_angular_damp项目设置或身体所在的AreaTrigger设置的任何值覆盖。根据angular_damp_mode,您可以设置angular_damp以添加或替换身体的阻尼值。

有关阻尼的更多详细信息,请参见ProjectSettings.physics/3d/default_angular_damp


DampMode angular_damp_mode = 0 🔗

定义如何应用angular_damp。有关可能的值,请参阅DampMode


Vector3 angular_velocity = Vector3(0, 0, 0) 🔗

  • void set_angular_velocity(value: Vector3)

  • Vector3 get_angular_velocity()

RigidBody3D的旋转速度,单位为每秒弧度


bool can_sleep = true 🔗

  • void set_can_sleep(value: bool)

  • bool is_able_to_sleep()

如果true,则身体在没有运动时可以进入睡眠模式。参见sleeping


Vector3 center_of_mass = Vector3(0, 0, 0) 🔗

  • void set_center_of_mass(value: Vector3)

  • Vector3 get_center_of_mass()

center_of_mass_mode设置为CENTER_OF_MASS_MODE_CUSTOM时,身体的自定义质心相对于身体的原始位置。这是身体的平衡点,施加的力只导致线性加速度。在质心之外施加的力会导致角加速度。

center_of_mass_mode设置为CENTER_OF_MASS_MODE_AUTO(默认值)时,会自动计算质心。


CenterOfMassMode center_of_mass_mode = 0 🔗

定义身体质心的设置方式。有关可能的值,请参阅CenterOfMassMode


Vector3 constant_force = Vector3(0, 0, 0) 🔗

  • void set_constant_force(value: Vector3)

  • Vector3 get_constant_force()

在每次物理更新期间施加的身体总的恒定位置力。

参见add_constant_force()add_constant_central_force()


Vector3 constant_torque = Vector3(0, 0, 0) 🔗

  • void set_constant_torque(value: Vector3)

  • Vector3 get_constant_torque()

在每次物理更新期间施加的总恒定旋转力。

参见add_constant_torque()


bool contact_monitor = false 🔗

  • void set_contact_monitor(value: bool)

  • bool is_contact_monitor_enabled()

如果true,RigidBody3D将在与另一个物体碰撞时发出信号。

注意:默认情况下,报告的最大联系人设置为0,这意味着不会记录任何内容,请参阅max_contacts_reported


bool continuous_cd = false 🔗

  • void set_use_continuous_collision_detection(value: bool)

  • bool is_using_continuous_collision_detection()

如果true,则使用连续冲突检测。

连续冲突检测试图预测移动的物体将在哪里碰撞,而不是移动它并在碰撞时纠正它的运动。连续冲突检测更精确,错过的小而快速移动的物体的影响更少。不使用连续冲突检测计算速度更快,但可能会错过小而快速移动的物体。


bool custom_integrator = false 🔗

  • void set_use_custom_integrator(value: bool)

  • bool is_using_custom_integrator()

如果true,则该物体的标准力积分(如重力或阻尼)将被禁用。除了碰撞响应,如果该虚拟方法被覆盖,则该物体将仅根据_integrate_forces()方法确定的方式移动。

设置此属性将在内部调用方法PhysicsServer3D.body_set_omit_force_integration()


bool freeze = false 🔗

  • void set_freeze_enabled(value: bool)

  • bool is_freeze_enabled()

如果true,则身体被冻结。重力和力不再应用。

参见freeze_mode设置身体冻结时的行为。

对于始终处于冻结状态的身体,请改用StaticBulkAnimatableBulk


FreezeMode freeze_mode = 0 🔗

主体的冻结模式。可用于在启用freeze时设置主体的行为。有关可能的值,请参阅FreezeMode

对于始终处于冻结状态的身体,请改用StaticBulkAnimatableBulk


float gravity_scale = 1.0 🔗

  • void set_gravity_scale(value: float)

  • float get_gravity_scale()

这乘以ProjectSettings.physics/3d/default_gravity来产生这个物体的重力。例如,1.0的值将应用正常重力,2.0将应用两倍的重力,0.5将应用一半的重力。


Vector3 inertia = Vector3(0, 0, 0) 🔗

物体的转动惯量。这类似于质量,但用于旋转:它决定了在每个轴上旋转物体所需的扭矩大小。转动惯量通常会根据质量和形状自动计算,但此属性允许您设置自定义值。

如果设置为Vector3.ZERO,则会自动计算转动惯量(默认值)。

Note:自动计算转动惯量时,此值不会改变。使用PhysicsServer3D获取计算出的转动惯量。

@onready var ball = $Ball

func get_ball_inertia():
    return PhysicsServer3D.body_get_direct_state(ball.get_rid()).inverse_inertia.inverse()

float linear_damp = 0.0 🔗

  • void set_linear_damp(value: float)

  • float get_linear_damp()

阻尼身体的运动。默认情况下,身体将使用ProjectSettings.physics/3d/default_linear_damp项目设置或身体所在的AreaTrigger设置的任何值覆盖。根据linear_damp_mode,您可以设置linear_damp以添加或替换身体的阻尼值。

有关阻尼的更多详细信息,请参见ProjectSettings.physics/3d/default_linear_damp


DampMode linear_damp_mode = 0 🔗

定义如何应用linear_damp。有关可能的值,请参阅DampMode


Vector3 linear_velocity = Vector3(0, 0, 0) 🔗

  • void set_linear_velocity(value: Vector3)

  • Vector3 get_linear_velocity()

以每秒为单位的身体线速度。可以零星使用,但是不要每帧都设置这个,因为物理学可能在另一个线程中运行,并且以不同的颗粒度运行。使用_integrate_forces()作为您的过程循环,以精确控制身体状态。


bool lock_rotation = false 🔗

  • void set_lock_rotation_enabled(value: bool)

  • bool is_lock_rotation_enabled()

如果true,则身体不能旋转。重力和力只适用于线性运动。


float mass = 1.0 🔗

身体的质量。


int max_contacts_reported = 0 🔗

  • void set_max_contacts_reported(value: int)

  • int get_max_contacts_reported()

将记录的最大联系人数。需要将值大于0并将contact_monitor设置为true才能开始注册联系人。使用get_contact_count()检索计数或get_colliding_bodies()检索与之冲突的主体。

注:触点数与碰撞数不同,平行边之间的碰撞将产生两个触点(每端一个),平行面之间的碰撞将产生四个触点(每角一个)。


PhysicsMaterial physics_material_override 🔗

身体的物理材料覆盖。

如果一个材质被分配到这个属性,它将被用来代替任何其他物理材料,比如继承的材料。


bool sleeping = false 🔗

  • void set_sleeping(value: bool)

  • bool is_sleeping()

如果true,则身体不会移动,并且不会计算力,直到被另一个身体通过例如碰撞或使用apply_impulse()apply_force()方法唤醒。


方法说明

void _integrate_forces(state: PhysicsDirectBodyState3D) virtual 🔗

在物理处理期间调用,允许您读取并安全地修改对象的模拟状态。默认情况下,它在标准力集成之前调用,但custom_integrator属性允许您禁用标准力集成并为主体进行完全自定义的力集成。


void add_constant_central_force(force: Vector3) 🔗

在不影响旋转的情况下添加恒定的方向力,该方向力随着时间的推移不断施加,直到使用constant_force=Vector3(0,0,0)清除。

这相当于在身体质心处使用add_constant_force()


void add_constant_force(force: Vector3, position: Vector3 = Vector3(0, 0, 0)) 🔗

向身体添加一个恒定的定位力,随着时间的推移不断施加,直到用constant_force=Vector3(0,0,0)清除。

position是在全局坐标中与物体原点的偏移量。


void add_constant_torque(torque: Vector3) 🔗

添加恒定的旋转力而不影响位置,该力随着时间的推移不断施加,直到用constant_torque=Vector3(0,0,0)清除。


void apply_central_force(force: Vector3) 🔗

在不影响旋转的情况下施加定向力。力与时间相关,意味着每次物理更新都要施加。

这相当于在身体质心处使用apply_force()


void apply_central_impulse(impulse: Vector3) 🔗

在不影响旋转的情况下应用方向脉冲。

脉冲是与时间无关的!每帧应用一个脉冲将导致帧速率相关的力。因此,它应该只在模拟一次性撞击时使用(否则使用“_force”功能)。

这相当于在身体质心处使用apply_impulse()


void apply_force(force: Vector3, position: Vector3 = Vector3(0, 0, 0)) 🔗

对身体施加定位力。力是时间相关的,意味着每次物理更新都要施加。

position是在全局坐标中与物体原点的偏移量。


void apply_impulse(impulse: Vector3, position: Vector3 = Vector3(0, 0, 0)) 🔗

对身体施加定位脉冲。

脉冲是与时间无关的!每帧应用一个脉冲将导致帧速率相关的力。因此,它应该只在模拟一次性撞击时使用(否则使用“_force”功能)。

position是在全局坐标中与物体原点的偏移量。


void apply_torque(torque: Vector3) 🔗

在不影响位置的情况下施加旋转力。力是时间相关的,意味着每次物理更新都要施加力。

注意:这需要inertia才能工作。要拥有inertia,活动的ColliderShape必须是节点的子节点,或者您可以手动设置inertia


void apply_torque_impulse(impulse: Vector3) 🔗

在不影响位置的情况下对身体施加旋转脉冲。

脉冲是与时间无关的!每帧应用一个脉冲将导致帧速率相关的力。因此,它应该只在模拟一次性撞击时使用(否则使用“_force”功能)。

注意:这需要inertia才能工作。要拥有inertia,活动的ColliderShape必须是节点的子节点,或者您可以手动设置inertia


Array[Item3D] get_colliding_bodies() const 🔗

返回与此冲突的主体列表。要求将contact_monitor设置为true,并将max_contacts_reported设置为足够高以检测所有冲突。

注意:此测试的结果在移动对象后不会立即出现。为了提高性能,冲突列表在每帧和物理步骤之前更新一次。考虑改用信号。


int get_contact_count() const 🔗

返回此主体与其他主体的联系人数量。默认情况下,返回0,除非主体配置为监视联系人(请参阅contact_monitor)。

注意:要检索碰撞体,请使用get_colliding_bodies()


Basis get_inverse_inertia_tensor() const 🔗

返回逆惯性张量基。这用于计算由施加到RigidBulk的扭矩产生的角加速度。


void set_axis_velocity(axis_velocity: Vector3) 🔗

设置轴速度。给定矢量轴上的速度将设置为给定矢量长度。这对跳跃行为很有用。