RigidBody3D
Наследует: PhysicsBody3D < CollisionObject3D < Node3D < Node < Object
Наследуется от: VehicleBody3D
Трехмерное физическое тело, которое движется посредством физической симуляции.
Описание
RigidBody3D реализует полноценную трёхмерную физику. Им нельзя управлять напрямую, вместо этого необходимо прикладывать к нему силы (гравитацию, импульсы и т. д.), а физическая симуляция вычисляет результирующее движение, вращение, реагирует на столкновения и влияет на другие физические тела на своём пути.
Поведение тела можно настроить с помощью lock_rotation, freeze и freeze_mode. Изменяя различные свойства объекта, такие как mass, можно управлять тем, как на него воздействует физическая симуляция.
Твёрдое тело всегда сохраняет свою форму и размер, даже при приложении к нему сил. Это полезно для объектов, с которыми можно взаимодействовать в окружающей среде, например, для дерева, которое можно опрокинуть, или для штабеля ящиков, которые можно толкать.
Если вам нужно напрямую воздействовать на тело, предпочтительнее _integrate_forces(), поскольку он позволяет напрямую получать доступ к физическому состоянию.
Если вам нужно переопределить физическое поведение по умолчанию, вы можете написать собственную функцию интегрирования сил. См. custom_integrator.
Примечание: Изменение 3D-преобразования или linear_velocity объекта RigidBody3D очень часто может привести к непредсказуемому поведению. Это также происходит, когда RigidBody3D является потомком постоянно движущегося узла, например, другого RigidBody3D, поскольку это приведёт к установке его глобального преобразования при каждом перемещении его предка.
Обучающие материалы
Свойства
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Методы
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) |
Сигналы
Вызывается при столкновении с другим PhysicsBody3D или GridMap. Требуется, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. GridMap обнаруживаются, если MeshLibrary имеет Collision Shape3D.
body Node, если он существует в дереве, другого PhysicsBody3D или GridMap.
Выдается, когда заканчивается столкновение с другим PhysicsBody3D или GridMap. Требует, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. GridMap обнаруживаются, если MeshLibrary имеет Collision Shape3D.
body Node, если он существует в дереве, другого PhysicsBody3D или GridMap.
body_shape_entered(body_rid: RID, body: Node, body_shape_index: int, local_shape_index: int) 🔗
Выдается, когда один из Shape3D-ов этого RigidBody3D сталкивается с Shape3D-ов другого PhysicsBody3D или GridMap. Требует, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. GridMap-ов обнаруживаются, если MeshLibrary имеет Collision Shape3D-ов.
body_rid RID другого PhysicsBody3D или MeshLibrary CollisionObject3D, используемого PhysicsServer3D.
body Node, если он существует в дереве, другого PhysicsBody3D или GridMap.
body_shape_index индекс Shape3D другого PhysicsBody3D или GridMap, используемого PhysicsServer3D. Получите узел CollisionShape3D с помощью body.shape_owner_get_owner(body.shape_find_owner(body_shape_index)).
local_shape_index индекс Shape3D этого RigidBody3D, используемого PhysicsServer3D. Получите узел CollisionShape3D с помощью self.shape_owner_get_owner(self.shape_find_owner(local_shape_index)).
body_shape_exited(body_rid: RID, body: Node, body_shape_index: int, local_shape_index: int) 🔗
Выдается, когда заканчивается столкновение между одним из Shape3D-ов этого RigidBody3D и другим PhysicsBody3D или Shape3D-ов GridMap. Требует, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. GridMap-ы обнаруживаются, если MeshLibrary имеет Collision Shape3D-ов.
body_rid RID других PhysicsBody3D или MeshLibrary CollisionObject3D, используемых PhysicsServer3D. GridMap-ы обнаруживаются, если у сеток есть Shape3D-ы.
body Node, если он существует в дереве, другого PhysicsBody3D или GridMap.
body_shape_index индекс Shape3D другого PhysicsBody3D или GridMap, используемого PhysicsServer3D. Получите узел CollisionShape3D с помощью body.shape_owner_get_owner(body.shape_find_owner(body_shape_index)).
local_shape_index индекс Shape3D этого RigidBody3D, используемого PhysicsServer3D. Получите узел CollisionShape3D с помощью self.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 или любое переопределение значения, заданное Area3D, в котором находится тело. В зависимости от angular_damp_mode вы можете задать angular_damp для добавления или замены значения демпфирования тела.
Подробнее о демпфировании см. в ProjectSettings.physics/3d/default_angular_damp.
DampMode angular_damp_mode = 0 🔗
Определяет, как применяется angular_damp.
Vector3 angular_velocity = Vector3(0, 0, 0) 🔗
Скорость вращения RigidBody3D в радианах в секунду.
Если true, тело может войти в режим сна, когда нет движения. Смотрите sleep.
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 (значение по умолчанию), центр масс определяется автоматически, но это не приводит к обновлению значения center_of_mass.
CenterOfMassMode center_of_mass_mode = 0 🔗
void set_center_of_mass_mode(value: CenterOfMassMode)
CenterOfMassMode get_center_of_mass_mode()
Определяет способ установки центра массы тела.
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() внутренне.
If true, the body is frozen. Gravity and forces are not applied anymore.
See freeze_mode to set the body's behavior when frozen.
Note: For a body that is always frozen, use StaticBody3D or AnimatableBody3D instead.
FreezeMode freeze_mode = 0 🔗
void set_freeze_mode(value: FreezeMode)
FreezeMode get_freeze_mode()
The body's freeze mode. Determines the body's behavior when freeze is true.
Note: For a body that is always frozen, use StaticBody3D or AnimatableBody3D instead.
Это умножается на ProjectSettings.physics/3d/default_gravity, чтобы получить гравитацию этого тела. Например, значение 1.0 применит нормальную гравитацию, 2.0 применит двойную гравитацию, а 0.5 применит половину гравитации к этому телу.
Vector3 inertia = Vector3(0, 0, 0) 🔗
Момент инерции тела. Это похоже на массу, но для вращения: он определяет, какой крутящий момент требуется для вращения тела по каждой оси. Момент инерции обычно вычисляется автоматически из массы и форм, но это свойство позволяет вам задать пользовательское значение.
Если установлено значение Vector3.ZERO, инерция вычисляется автоматически (значение по умолчанию).
Примечание: Это значение не изменяется при автоматическом вычислении инерции. Используйте PhysicsServer3D, чтобы получить вычисленную инерцию.
@onready var ball = $Ball
func get_ball_inertia():
return PhysicsServer3D.body_get_direct_state(ball.get_rid()).inverse_inertia.inverse()
private RigidBody3D _ball;
public override void _Ready()
{
_ball = GetNode<RigidBody3D>("Ball");
}
private Vector3 GetBallInertia()
{
return PhysicsServer3D.BodyGetDirectState(_ball.GetRid()).InverseInertia.Inverse();
}
Демпфирует движение тела. По умолчанию тело будет использовать настройку проекта ProjectSettings.physics/3d/default_linear_damp или любое переопределение значения, заданное Area3D, в котором находится тело. В зависимости от linear_damp_mode вы можете задать linear_damp для добавления или замены значения демпфирования тела.
Подробнее о демпфировании см. в ProjectSettings.physics/3d/default_linear_damp.
DampMode linear_damp_mode = 0 🔗
Определяет, как применяется linear_damp.
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, активный CollisionShape3D должен быть дочерним элементом узла, или вы можете вручную задать inertia.
void apply_torque_impulse(impulse: Vector3) 🔗
Применяет вращательный импульс к телу, не влияя на положение.
Импульс не зависит от времени! Применение импульса в каждом кадре приведет к силе, зависящей от частоты кадров. По этой причине его следует использовать только при моделировании одноразовых ударов (в противном случае используйте функции "_force").
Примечание: для работы требуется inertia. Чтобы иметь inertia, активный CollisionShape3D должен быть дочерним элементом узла, или вы можете вручную задать inertia.
Array[Node3D] 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 🔗
Возвращает обратный базис тензора инерции. Используется для расчета углового ускорения, возникающего в результате крутящего момента, приложенного к RigidBody3D.
void set_axis_velocity(axis_velocity: Vector3) 🔗
Устанавливает скорость оси. Скорость в данной векторной оси будет установлена как заданная длина вектора. Это полезно для поведения прыжка.