RigidBody3D

Наследует: PhysicsBody3D < CollisionObject3D < Node3D < Node < Object

Наследуется от: VehicleBody3D

Трехмерное физическое тело, которое движется посредством физической симуляции.

Описание

RigidBody3D реализует полноценную трёхмерную физику. Им нельзя управлять напрямую, вместо этого необходимо прикладывать к нему силы (гравитацию, импульсы и т. д.), а физическая симуляция вычисляет результирующее движение, вращение, реагирует на столкновения и влияет на другие физические тела на своём пути.

Поведение тела можно настроить с помощью lock_rotation, freeze и freeze_mode. Изменяя различные свойства объекта, такие как mass, можно управлять тем, как на него воздействует физическая симуляция.

Твёрдое тело всегда сохраняет свою форму и размер, даже при приложении к нему сил. Это полезно для объектов, с которыми можно взаимодействовать в окружающей среде, например, для дерева, которое можно опрокинуть, или для штабеля ящиков, которые можно толкать.

Если вам нужно напрямую воздействовать на тело, предпочтительнее _integrate_forces(), поскольку он позволяет напрямую получать доступ к физическому состоянию.

Если вам нужно переопределить физическое поведение по умолчанию, вы можете написать собственную функцию интегрирования сил. См. custom_integrator.

Примечание: Изменение 3D-преобразования или linear_velocity объекта RigidBody3D очень часто может привести к непредсказуемому поведению. Это также происходит, когда RigidBody3D является потомком постоянно движущегося узла, например, другого RigidBody3D, поскольку это приведёт к установке его глобального преобразования при каждом перемещении его предка.

Обучающие материалы

Свойства

float

angular_damp

0.0

DampMode

angular_damp_mode

0

Vector3

angular_velocity

Vector3(0, 0, 0)

bool

can_sleep

true

Vector3

center_of_mass

Vector3(0, 0, 0)

CenterOfMassMode

center_of_mass_mode

0

Vector3

constant_force

Vector3(0, 0, 0)

Vector3

constant_torque

Vector3(0, 0, 0)

bool

contact_monitor

false

bool

continuous_cd

false

bool

custom_integrator

false

bool

freeze

false

FreezeMode

freeze_mode

0

float

gravity_scale

1.0

Vector3

inertia

Vector3(0, 0, 0)

float

linear_damp

0.0

DampMode

linear_damp_mode

0

Vector3

linear_velocity

Vector3(0, 0, 0)

bool

lock_rotation

false

float

mass

1.0

int

max_contacts_reported

0

PhysicsMaterial

physics_material_override

bool

sleeping

false

Методы

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[Node3D]

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: Node) 🔗

Вызывается при столкновении с другим PhysicsBody3D или GridMap. Требуется, чтобы contact_monitor был установлен на true, а max_contacts_reported был установлен достаточно высоким для обнаружения всех столкновений. GridMap обнаруживаются, если MeshLibrary имеет Collision Shape3D.

body Node, если он существует в дереве, другого PhysicsBody3D или GridMap.


body_exited(body: Node) 🔗

Выдается, когда заканчивается столкновение с другим 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

В этом режиме значение демпфирования тела заменяет любое значение, заданное в областях, или значение по умолчанию.


Описания свойств

float angular_damp = 0.0 🔗

  • void set_angular_damp(value: float)

  • float get_angular_damp()

Демпфирует вращение тела. По умолчанию тело будет использовать настройку проекта 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) 🔗

  • 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, тело может войти в режим сна, когда нет движения. Смотрите sleep.


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 (значение по умолчанию), центр масс определяется автоматически, но это не приводит к обновлению значения center_of_mass.


CenterOfMassMode center_of_mass_mode = 0 🔗

Определяет способ установки центра массы тела.


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()

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 🔗

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.


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, инерция вычисляется автоматически (значение по умолчанию).

Примечание: Это значение не изменяется при автоматическом вычислении инерции. Используйте 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 или любое переопределение значения, заданное 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) 🔗

  • 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, активный 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) 🔗

Устанавливает скорость оси. Скорость в данной векторной оси будет установлена как заданная длина вектора. Это полезно для поведения прыжка.