Oleg Alexandrov

RigidBody

Назад

Наследует: PhysicsBody < CollisionObject < Spatial < Node < Object

Унаследовано: VehicleBody

Физическое тело, положение которого определяется с помощью физического моделирования в 3D-пространстве.

Описание

Это узел, который реализует полную 3D-физику. Это означает, что вы не управляете RigidBody напрямую. Вместо этого вы можете применить к нему силы (гравитацию, импульсы и т. д.), а физическое моделирование рассчитает результирующее движение, столкновение, отскок, вращение и т. д.

RigidBody имеет 4 mode:

Примечание: Не меняйте положение RigidBody каждый кадр или очень часто. Спорадические изменения работают нормально, но физика работает с другой степенью детализации (фиксированная Гц), чем обычный рендеринг (обратный вызов процесса) и, возможно, даже в отдельном потоке, поэтому изменение этого из цикла процесса может привести к странному поведению. Если вам нужно напрямую повлиять на состояние тела, используйте _integrate_forces, который позволяет вам напрямую получить доступ к физическому состоянию.

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

С Bullet physics (по умолчанию) центром масс является центр RigidBody3D. В GodotPhysics центр масс - это среднее CollisionShape центров формы столкновения.

Свойства

Тип Свойство По умолчанию
float angular_damp -1.0
Vector3 angular_velocity Vector3( 0, 0, 0 )
bool axis_lock_angular_x false
bool axis_lock_angular_y false
bool axis_lock_angular_z false
bool axis_lock_linear_x false
bool axis_lock_linear_y false
bool axis_lock_linear_z false
float bounce  
bool can_sleep true
bool contact_monitor false
int contacts_reported 0
bool continuous_cd false
bool custom_integrator false
float friction  
float gravity_scale 1.0
float linear_damp -1.0
Vector3 linear_velocity Vector3( 0, 0, 0 )
float mass 1.0
Mode mode 0
PhysicsMaterial physics_material_override  
bool sleeping false
float weight 9.8

Методы

Тип Метод
void _integrate_forces ( PhysicsDirectBodyState state ) virtual
void add_central_force ( Vector3 force )
void add_force ( Vector3 force, Vector3 position )
void add_torque ( Vector3 torque )
void apply_central_impulse ( Vector3 impulse )
void apply_impulse ( Vector3 position, Vector3 impulse )
void apply_torque_impulse ( Vector3 impulse )
bool get_axis_lock ( BodyAxis axis ) const
Array get_colliding_bodies ( ) const
Basis get_inverse_inertia_tensor ( )
void set_axis_lock ( BodyAxis axis, bool lock )
void set_axis_velocity ( Vector3 axis_velocity )

Сигналы

body_entered ( Node body )

Излучается при столкновении с другим PhysicsBody или GridMap. Требуется, чтобы contact_monitor был установлен в trueзначение и contacts_reported был установлен достаточно высоко, чтобы обнаружить все столкновения. GridMap обнаруживаются, если MeshLibrary имеет Shape столкновения.

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


body_exited ( Node body )

Испускается, когда заканчивается столкновение с другим PhysicsBody или GridMap. Требуется, чтобы contact_monitor был установлен в trueзначение и contacts_reported был установлен достаточно высоко, чтобы обнаружить все столкновения. GridMap обнаруживаются, если MeshLibrary имеет Shape столкновения.

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


body_shape_entered ( RID body_rid, Node body, int body_shape_index, int local_shape_index )

Испускается, когда одна из Shapes этого твердого тела сталкивается с другой PhysicsBody или GridMap фигурой. Требуется, чтобы contact_monitor был установлен в true значение и contacts_reported был установлен достаточно высоко, чтобы обнаружить все столкновения. GridMap обнаруживаются, если MeshLibrary имеет Shape столкновения.

body_rid избавление от другого [объекта](physicsbody.md physicsBody или MeshLibrary CollisionObject, используемого PhysicsServer.

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

body_shape_index индекс формы другого [физического](physicsbody.md тела или GridMap, используемого физическим сервером. Получить узел body.shape_owner_get_owner(body_shape_index) CollisionShape.

local_shape_index индекс формы этого твердого тела, используемый сервером PhysicsServer. Получить узел self.shape_owner_get_owner(local_shape_index) CollisionShape.

Примечание: Физика пули не может определить индекс формы при использовании ConcavePolygonShape. Не используйте несколько CollisionShape при использовании ConcavePolygonShape с физикой пули, если вам нужны индексы формы.


body_shape_exited ( RID body_rid, Node body, int body_shape_index, int local_shape_index )

Испускается, когда заканчивается столкновение между одной из форм s этого твердоготела и другой формой s physicsBody или GridMap. Требуется , чтобы contact_monitor был установлен в trueзначение и contacts_reported был установлен достаточно высоко, чтобы обнаружить все столкновения. GridMap обнаруживаются, если MeshLibrary имеет форму столкновения.

body_rid избавление от другого [объекта](physicsbody.md physicsBody или MeshLibrary CollisionObject , используемого PhysicsServer. GridMaps обнаруживаются, если сетки имеют форму.

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

body_shape_index индекс формы другого физического тела или GridMap, используемого физическим сервером. Получить узел body.shape_owner_get_owner(body_shape_index) CollisionShape.

local_shape_index индекс формы этого твердого тела, используемый сервером PhysicsServer. Получить узел self.shape_owner_get_owner(local_shape_index) CollisionShape.

Примечание: Физика пули не может определить индекс формы при использовании ConcavePolygonShape. Не используйте несколько CollisionShape при использовании ConcavePolygonShape с физикой пули, если вам нужны индексы формы.


sleeping_state_changed ( )

Излучается, когда физический движок изменяет состояние сна тела.

Примечание: Изменение значения Sleeping не вызовет этот сигнал. Он излучается только в том случае, если спящее состояние изменяется физическим движком или emit_signal("sleeping_state_changed") используется.

Перечисления

режим перечисления:

MODE_RIGID = 0 - Режим жесткого тела. Это “естественное” состояние твердого тела. Он подвержен воздействию сил и может перемещаться, вращаться и зависеть от кода пользователя.

MODE_STATIC = 1 - Статический режим. Тело ведет себя как статическоетело и может перемещаться только по пользовательскому коду.

MODE_CHARACTER = 2 - Режим тела персонажа. Это ведет себя как твердое тело, но не может вращаться.

MODE_KINEMATIC = 3 - Режим кинематического тела. Тело ведет себя как кинематическоетело и может двигаться только по пользовательскому коду.

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

float angular_damp

По умолчанию -1.0
Setter set_angular_damp(value)
Getter get_angular_damp()

Гасит вращательные силы RigidBody.

См. ProjectSettings.physics/3d/default_angular_damp для получения более подробной информации о демпфировании.


Vector3 angular_velocity

По умолчанию Vector3( 0, 0, 0 )
Setter set_angular_velocity(value)
Getter get_angular_velocity()

Скорость вращения тела в формате axis-angle. Величина вектора-это скорость вращения в радианах в секунду.


bool axis_lock_angular_x

По умолчанию false
Setter set_axis_lock(value)
Getter get_axis_lock()

Зафиксируйте вращение корпуса по оси X.


bool axis_lock_angular_y

По умолчанию false
Setter set_axis_lock(value)
Getter get_axis_lock()

Зафиксируйте вращение корпуса по оси Y.


bool axis_lock_angular_z

По умолчанию false
Setter set_axis_lock(value)
Getter get_axis_lock()

Зафиксируйте вращение тела по оси Z.


bool axis_lock_linear_x

По умолчанию false
Setter set_axis_lock(value)
Getter get_axis_lock()

Зафиксируйте движение тела по оси X.


bool axis_lock_linear_y

По умолчанию false
Setter set_axis_lock(value)
Getter get_axis_lock()

Зафиксируйте движение тела по оси Y.


bool axis_lock_linear_z

По умолчанию false
Setter set_axis_lock(value)
Getter get_axis_lock()

Зафиксируйте движение тела по оси Z.


float bounce

По умолчанию 0.0
Setter set_bounce(value)
Getter get_bounce()

Упругость тела. Значения варьируются от 0 (no bounce) до 1 (full bounciness). Устарело, используйте PhysicsMaterial.bounce вместо этого через physics_material_override.


bool can_sleep

По умолчанию true
Setter set_can_sleep(value)
Getter is_able_to_sleep()

Если trueтело может войти в спящий режим, когда нет движения. См. sleeping.

Примечание: RigidBody3D никогда не войдет в спящий режим автоматически, если его mode MODE_CHARACTER. Его все еще можно перевести в спящий режим вручную, установив его mode свойство на true.


bool contact_monitor

По умолчанию false
Setter set_contact_monitor(value)
Getter is_contact_monitor_enabled()

Если true, то RigidBody будет излучать сигналы при столкновении с другим RigidBody. См. также contacts_reported.


int contacts_reported

По умолчанию 0
Setter set_max_contacts_reported(value)
Getter get_max_contacts_reported()

Максимальное количество контактов, которые будут записаны. Требуется, чтобы contact_monitor был установлен в true.

Примечание: Количество контактов отличается от количества столкновений. Столкновения между параллельными ребрами приведут к двум контактам (по одному на каждом конце), а столкновения между параллельными гранями приведут к четырем контактам (по одному на каждом углу).


bool continuous_cd

По умолчанию false
Setter set_use_continuous_collision_detection(value)
Getter is_using_continuous_collision_detection()

Если trueиспользуется непрерывное обнаружение столкновений. Continuous collision detection пытается предсказать, где столкнется движущееся тело, вместо того, чтобы перемещать его и корректировать его движение, если оно столкнулось. Непрерывное обнаружение столкновений является более точным и пропускает меньше ударов маленькими, быстро движущимися объектами. Не используя непрерывное обнаружение столкновений быстрее вычислять, но может пропустить небольшие, быстро движущиеся объекты.


bool custom_integrator

По умолчанию false
Setter set_use_custom_integrator(value)
Getter is_using_custom_integrator()

Если значение true, интеграция внутренних сил будет отключена (например, гравитация или трение воздуха) для этого тела. Помимо реакции на столкновение, тело будет перемещаться только так, как определено функцией _integrate_forces, если она определена.


float friction

По умолчанию 1.0
Setter set_friction(value)
Getter get_friction()

Трение кузова, от 0 (без трения) до 1 (максимальное трение).

Устарело, используйте PhysicsMaterial.friction вместо этого через physics_material_override.


float gravity_scale

По умолчанию 1.0
Setter set_gravity_scale(value)
Getter get_gravity_scale()

Это умножается на глобальную настройку 3D gravity, найденную в Project > Project Settings > Physics > 3d для создания гравитации RigidBody. Например, значение 1 будет нормальной гравитацией, 2 будет применять двойную гравитацию, а 0.5 будет применять половину гравитации к этому объекту.


float linear_damp

По умолчанию -1.0
Setter set_linear_damp(value)
Getter get_linear_damp()

Линейная влажность тела. Не может быть меньше -1.0. Если это значение отличается от -1.0, любая линейная влажность, полученная из мира или областей, будет переопределена.

См. ProjectSettings.physics/3d/default_linear_damp для получения более подробной информации о демпфировании.


Vector3 linear_velocity

По умолчанию Vector3( 0, 0, 0 )
Setter set_linear_velocity(value)
Getter get_linear_velocity()

Линейная скорость тела в единицах в секунду. Может использоваться спорадически, но не устанавливайте это каждый кадр , потому что физика может работать в другом потоке и работать с другой степенью детализации. Используйте _integrate_forces в качестве технологического цикла для точного контроля состояния тела.


float mass

По умолчанию 1.0
Setter set_mass(value)
Getter get_mass()

Масса тела.


Mode mode

По умолчанию 0
Setter set_mode(value)
Getter get_mode()

Возможные значения см. Mode.


PhysicsMaterial physics_material_override

По умолчанию null
Setter set_physics_material_override(value)
Getter get_physics_material_override()

Переопределение физического материала для тела. Если материалу присвоено это свойство, он будет использоваться вместо любого другого физического материала, например унаследованного.


bool sleeping

По умолчанию false
Setter set_sleeping(value)
Getter is_sleeping()

Если trueтело не будет двигаться и не будет вычислять силы, пока его не разбудит другое тело, например, при столкновении, или с помощью методов apply_impulse или add_force.


float weight

По умолчанию 9.8
Setter set_weight(value)
Getter get_weight()

Вес тела, основанный на его массе и глобальной 3D-гравитации. Глобальные значения задаются в Project > Project Settings > Physics > 3d.

Описание метода

void _integrate_forces ( PhysicsDirectBodyState state ) virtual

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


void add_central_force ( Vector3 force )

Добавляет постоянную направленную силу (т. е. Ускорение), не влияя на вращение. Это эквивалентно add_force(force, Vector3(0,0,0)).


void add_force ( Vector3 force, Vector3 position )

Добавляет постоянную направленную силу (т. е. Ускорение). Позиция использует вращение глобальной системы координат, но центрируется в начале координат объекта.


void add_torque ( Vector3 torque )

Добавляет постоянную вращательную силу (т. е. двигатель), не влияя на положение.


void apply_central_impulse ( Vector3 impulse )

Применяет направленный импульс, не влияя на вращение. Это эквивалентно apply_impulse(Vector3(0,0,0), impulse).


void apply_impulse ( Vector3 position, Vector3 impulse )

Прикладывает позиционированный импульс к корпусу. Импульс не зависит от времени! Применение импульса к каждому кадру приведет к силе, зависящей от частоты кадров. По этой причине его следует использовать только при моделировании одноразовых воздействий. Позиция использует вращение глобальной системы координат, но центрируется в начале координат объекта.


void apply_torque_impulse ( Vector3 impulse )

Применяет импульс крутящего момента, который будет зависеть от массы и формы тела. Это будет вращать тело вокруг impulseпереданного вектора.


bool get_axis_lock ( BodyAxis axis ) const

Возвращаетtrue, если заданная линейная или вращательная ось заблокирована.


Array get_colliding_bodies ( ) const

Возвращает список тел, сталкивающихся с этим. Требуется, чтобы contact_monitor был установлен в true значение и contacts_reported был установлен достаточно высоко, чтобы обнаружить все столкновения.

Примечание: Результат этого теста не сразу после перемещения объектов. Для производительности список столкновений обновляется один раз за кадр и перед шагом физики. Вместо этого рассмотрите возможность использования сигналов.


Basis get_inverse_inertia_tensor ( )

Возвращает базис обратного тензора инерции. Это используется для расчета углового ускорения, возникающего в результате крутящего момента, приложенного к жесткому телу.


void set_axis_lock ( BodyAxis axis, bool lock )

Фиксирует указанную линейную или вращательную ось.


void set_axis_velocity ( Vector3 axis_velocity )

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

Назад