RigidBulk¶
继承: PhysicsBulkBase < ColliderObjectBase < Item3D < Item < Object
派生: VehicleBulk
由物理模拟移动的3D物理体。
描述¶
RigidBulk实现了全3D物理。它不能被直接控制,相反,你必须对它施加力(重力、脉冲等)。),物理模拟将计算由此产生的运动、旋转、对碰撞的反应,并影响其路径中的其他物理体。
身体的行为可以通过lock_rotation、freeze和freeze_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) |
get_colliding_bodies() const |
|
get_contact_count() const |
|
get_inverse_inertia_tensor() const |
|
void |
set_axis_velocity(axis_velocity: Vector3) |
信号¶
当与另一个PhysicsBulkBase或GridMap发生碰撞时发出。要求将contact_monitor设置为true,并将max_contacts_reported设置得足够高以检测所有碰撞。如果MeshLibrary有CollisionShape3D,则检测到GridMaps。
bodyItem,如果它存在于树中,另一个PhysicsBulkBase或GridMap。
当与另一个PhysicsBulkBase或GridMap的碰撞结束时发出。要求将contact_monitor设置为true,并将max_contacts_reported设置得足够高以检测所有碰撞。如果MeshLibrary有CollisionShape3D,则检测到GridMaps。
bodyItem,如果它存在于树中,另一个PhysicsBulkBase或GridMap。
body_shape_entered(body_rid: RID, body: Item, body_shape_index: int, local_shape_index: int) 🔗
当这个RigidBody3D的Shape3D与另一个PhysicsBulkBase或GridMap的Shape3D碰撞时发出。需要将contact_monitor设置为true,并将max_contacts_reported设置得足够高以检测所有碰撞。如果MeshLibrary有CollisionShape3D,则检测到GridMap。
body_ridPhysicsServer3D使用的其他PhysicsBulkBase或MeshLibrary的ColliderObjectBase的RID。
bodyItem,如果它存在于树中,另一个PhysicsBulkBase或GridMap。
body_shape_indexPhysicsServer3D使用的其他PhysicsBulkBase或GridMap的Shape3D的索引。获取带有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与另一个PhysicsBulkBase或GridMap的Shape3D的碰撞结束时发出。要求将contact_monitor设置为true,并将max_contacts_reported设置为足够高以检测所有碰撞。如果MeshLibrary有CollisionShape3D,则检测到GridMap。
body_ridPhysicsServer3D使用的其他PhysicsBulkBase或MeshLibrary的ColliderObjectBase的RID。如果网格具有Shape3D,则检测GridMaps。
bodyItem,如果它存在于树中,另一个PhysicsBulkBase或GridMap。
body_shape_indexPhysicsServer3D使用的其他PhysicsBulkBase或GridMap的Shape3D的索引。获取带有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
在此模式下,机身的阻尼值将替换区域中设置的任何值或默认值。
属性说明¶
阻尼身体的旋转。默认情况下,身体将使用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) 🔗
RigidBody3D的旋转速度,单位为每秒弧度。
如果true,则身体在没有运动时可以进入睡眠模式。参见sleeping。
Vector3 center_of_mass = Vector3(0, 0, 0) 🔗
当center_of_mass_mode设置为CENTER_OF_MASS_MODE_CUSTOM时,身体的自定义质心相对于身体的原始位置。这是身体的平衡点,施加的力只导致线性加速度。在质心之外施加的力会导致角加速度。
当center_of_mass_mode设置为CENTER_OF_MASS_MODE_AUTO(默认值)时,会自动计算质心。
CenterOfMassMode center_of_mass_mode = 0 🔗
void set_center_of_mass_mode(value: CenterOfMassMode)
CenterOfMassMode get_center_of_mass_mode()
定义身体质心的设置方式。有关可能的值,请参阅CenterOfMassMode。
Vector3 constant_force = Vector3(0, 0, 0) 🔗
在每次物理更新期间施加的身体总的恒定位置力。
参见add_constant_force()和add_constant_central_force()。
Vector3 constant_torque = Vector3(0, 0, 0) 🔗
在每次物理更新期间施加的总恒定旋转力。
bool contact_monitor = false 🔗
如果true,RigidBody3D将在与另一个物体碰撞时发出信号。
注意:默认情况下,报告的最大联系人设置为0,这意味着不会记录任何内容,请参阅max_contacts_reported。
void set_use_continuous_collision_detection(value: bool)
bool is_using_continuous_collision_detection()
如果true,则使用连续冲突检测。
连续冲突检测试图预测移动的物体将在哪里碰撞,而不是移动它并在碰撞时纠正它的运动。连续冲突检测更精确,错过的小而快速移动的物体的影响更少。不使用连续冲突检测计算速度更快,但可能会错过小而快速移动的物体。
bool custom_integrator = false 🔗
如果true,则该物体的标准力积分(如重力或阻尼)将被禁用。除了碰撞响应,如果该虚拟方法被覆盖,则该物体将仅根据_integrate_forces()方法确定的方式移动。
设置此属性将在内部调用方法PhysicsServer3D.body_set_omit_force_integration()。
如果true,则身体被冻结。重力和力不再应用。
参见freeze_mode设置身体冻结时的行为。
对于始终处于冻结状态的身体,请改用StaticBulk或AnimatableBulk。
FreezeMode freeze_mode = 0 🔗
void set_freeze_mode(value: FreezeMode)
FreezeMode get_freeze_mode()
主体的冻结模式。可用于在启用freeze时设置主体的行为。有关可能的值,请参阅FreezeMode。
对于始终处于冻结状态的身体,请改用StaticBulk或AnimatableBulk。
这乘以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()
private RigidBulk _ball;
public override void _Ready()
{
_ball = GetNode<RigidBulk>("Ball");
}
private Vector3 GetBallInertia()
{
return PhysicsServer3D.BodyGetDirectState(_ball.GetRid()).InverseInertia.Inverse();
}
阻尼身体的运动。默认情况下,身体将使用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) 🔗
以每秒为单位的身体线速度。可以零星使用,但是不要每帧都设置这个,因为物理学可能在另一个线程中运行,并且以不同的颗粒度运行。使用_integrate_forces()作为您的过程循环,以精确控制身体状态。
如果true,则身体不能旋转。重力和力只适用于线性运动。
身体的质量。
int max_contacts_reported = 0 🔗
将记录的最大联系人数。需要将值大于0并将contact_monitor设置为true才能开始注册联系人。使用get_contact_count()检索计数或get_colliding_bodies()检索与之冲突的主体。
注:触点数与碰撞数不同,平行边之间的碰撞将产生两个触点(每端一个),平行面之间的碰撞将产生四个触点(每角一个)。
PhysicsMaterial physics_material_override 🔗
void set_physics_material_override(value: PhysicsMaterial)
PhysicsMaterial get_physics_material_override()
身体的物理材料覆盖。
如果一个材质被分配到这个属性,它将被用来代替任何其他物理材料,比如继承的材料。
如果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) 🔗
设置轴速度。给定矢量轴上的速度将设置为给定矢量长度。这对跳跃行为很有用。