RigidBody3D
Успадковує: PhysicsBody3D < CollisionObject3D < Node3D < Node < Object
Успадковано від: VehicleBody3D
Тривимірне фізичне тіло, яке рухається за допомогою фізичної симуляції.
Опис
RigidBody3D реалізує повну 3D фізику. Його неможливо контролювати безпосередньо, натомість до нього потрібно застосовувати сили (гравітацію, імпульси тощо), а фізичне моделювання розрахує результуючий рух, обертання, реагуватиме на зіткнення та впливатиме на інші фізичні тіла на своєму шляху.
Поведінку тіла можна регулювати за допомогою 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. true і max_contacts_reported для виявлення всіх зіткнень. GridMap виявляються, якщо MeshLibrary має Collision Shape3Ds.
body the Node, якщо він існує в дереві, з іншого PhysicsBody3D або GridMap.
Випробувано при зіткненні з іншим PhysicsBody3D або GridMap закінчується. true і max_contacts_reported для виявлення всіх зіткнень. GridMap виявляються, якщо MeshLibrary має Collision Shape3Ds.
body the Node, якщо він існує в дереві, з іншого PhysicsBody3D або GridMap.
body_shape_entered(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 має Shape3D зі зіткненнями.
body_rid - RID іншого PhysicsBody3D або CollisionObject3D з MeshLibrary, що використовується 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 та Shape3D іншого PhysicsBody3D або GridMap. Потрібно, щоб contact_monitor було встановлено на true, а max_contacts_reported було встановлено на достатньо високе значення для виявлення всіх колізій. GridMap виявляються, якщо MeshLibrary має колізії Shape3D.
body_rid – RID іншого PhysicsBody3D або CollisionObject3D MeshLibrary, що використовується 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
Статичний режим замерзання тіла (default). Тіло не впливає на тяжіння і сили. Ви можете переміщатися тільки за допомогою коду користувача і не співвідноситься з іншими органами.
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 в radians за секунду.
Якщо 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 (значення за замовчуванням), центр маси визначається автоматично, але це не оновлює значення 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) 🔗
Загальні постійні сили обертання тіла, що застосовуються під час кожного оновлення фізики.
Див. add_constant_torque().
bool contact_monitor = false 🔗
Якщо true, RigidBody3D випромінює сигнали, коли він співає з іншим тілом.
Примітка: У зв'язку з тим, як ми використовуємо файли cookie, щоб надати вам інформацію про файли cookie.
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, щоб встановити поведінку тіла під час заморожування.
Для тіла, яке завжди заморожене, використовуйте StaticBody3D або AnimatableBody3D.
FreezeMode freeze_mode = 0 🔗
void set_freeze_mode(value: FreezeMode)
FreezeMode get_freeze_mode()
Режим заморожування тіла. Можна використовувати для встановлення поведінки тіла, коли ввімкнено freeze.
Для тіла, яке завжди заморожене, використовуйте StaticBody3D або AnimatableBody3D.
Це множиться на ProjectSettings.physics/3d/default_gravity, щоб створити силу тяжіння цього тіла. Наприклад, значення 1.0 застосовуватиме до цього тіла звичайну гравітацію, 2.0 застосовуватиме подвійну гравітацію, а 0.5 застосовуватиме половину сили тяжіння.
Vector3 inertia = Vector3(0, 0, 0) 🔗
Момент інерції тіла. Це схоже на масу, але для обертання: воно визначає, який крутний момент потрібен для обертання тіла навколо кожної осі. Момент інерції зазвичай обчислюється автоматично на основі маси та форм, але ця властивість дозволяє встановити власне значення.
Якщо встановлено значення Vector3.ZERO, інерція обчислюється автоматично (значення за замовчуванням).
Примітка. Це значення не змінюється, коли інерція обчислюється автоматично. Використовуйте PhysicsServer3D, щоб отримати обчислену інерцію.
@onready var ball = $Ball
функція 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).
Це еквівалентно використанню add_constant_force() в центрі маси тіла.
void add_constant_force(force: Vector3, position: Vector3 = Vector3(0, 0, 0)) 🔗
Додавання постійної позиціонованої сили до тіла, яка зберігає час, поки не очищається constant_force = Vector2(0, 0).
position – це зміщення з організму в глобальних координатах.
void add_constant_torque(torque: Vector3) 🔗
Додавання постійної обертальної сили без впливу положення, яка зберігає час, поки не очищається constant_torque = Vector3(0, 0).
void apply_central_force(force: Vector3) 🔗
Застосовується спрямована сила без ударного обертання. Знаряддя часу залежна і означена для кожного оновлення фізики.
Це еквівалентно використання apply_force() в центрі маси тіла.
void apply_central_impulse(impulse: Vector3) 🔗
Застосовується спрямований імпульс без впливу обертання.
Імпульс часозалежний! Нанесення імпульсу кожного кадру призведе до каркасно-залежної сили. З цієї причини слід використовувати тільки при симуляції одноразових ударів (користування функції "_сил" інакше).
Це еквівалентно використання 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)) 🔗
Застосує поміщений імпульс до тіла.
Імпульс часозалежний! Нанесення імпульсу кожного кадру призведе до каркасно-залежної сили. З цієї причини слід використовувати тільки при симуляції одноразових ударів (користування функції "_сил" інакше).
position – це зміщення з організму в глобальних координатах.
void apply_torque(torque: Vector3) 🔗
Застосовує обертальну силу, не впливаючи на положення. Сила залежить від часу та має застосовуватися під час кожного оновлення фізики.
Примітка: Для роботи потрібен inerty. Щоб мати inerty, активний CollisionShape3D має бути дочірнім елементом вузла, або ви можете вручну встановити inerty.
void apply_torque_impulse(impulse: Vector3) 🔗
Застосовує обертальний імпульс до тіла, не впливаючи на його положення.
Імпульс не залежить від часу! Застосування імпульсу кожного кадру призведе до сили, що залежить від частоти кадрів. З цієї причини його слід використовувати лише під час моделювання одноразових ударів (в іншому випадку використовуйте функції "_force").
Примітка: Для роботи цього потрібен inerty. Щоб мати inerty, активний CollisionShape3D має бути дочірнім вузлом, або ви можете вручну встановити inerty.
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) 🔗
Налаштовує швидкість осі. Швидкість в заданій векторній віссі буде встановлена в якості заданої довжини вектора. Це корисно для стрибків поведінки.