Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
AABB
Тривимірна обмежувальна рамка, вирівняна по осі.
Опис
Вбудований тип Variant AABB представляє вирівняну по осях обмежувальну рамку у 3D-просторі. Вона визначається своїми position та size, які є Vector3. Вона часто використовується для швидких перевірок перекриття (див. intersects()). Хоча сам AABB вирівняний по осях, його можна поєднати з Transform3D для представлення повернутої або нахиленої обмежувальної рамки.
Він використовує координати з плаваючою комою. Двовимірним аналогом AABB є Rect2. Немає версії AABB, яка використовує цілочисельні координати.
Примітка: Від'ємні значення для size не підтримуються. З від'ємним розміром більшість методів AABB працюють неправильно. Використовуйте abs(), щоб отримати еквівалентний AABB з невід'ємним розміром.
Примітка: У булевому контексті значення AABB повертає значення false, якщо обидва значення position та size дорівнюють нулю (дорівнюють Vector3.ZERO). В іншому випадку значення завжди повертає значення true.
Примітка
Існують значні відмінності при використанні цього API із С#. Більше інформації: ref:doc_c_sharp_differences.
Посібники
Властивості
Vector3 |
|
|
Vector3 |
|
|
Vector3 |
|
Конструктори
AABB() |
|
AABB(position: Vector3, size: Vector3) |
Методи
abs() const |
|
expand(to_point: Vector3) const |
|
Vector3 |
get_center() const |
Vector3 |
get_endpoint(idx: int) const |
Vector3 |
get_longest_axis() const |
get_longest_axis_index() const |
|
get_longest_axis_size() const |
|
Vector3 |
get_shortest_axis() const |
get_shortest_axis_index() const |
|
get_shortest_axis_size() const |
|
Vector3 |
get_support(direction: Vector3) const |
get_volume() const |
|
has_point(point: Vector3) const |
|
has_surface() const |
|
has_volume() const |
|
intersection(with: AABB) const |
|
intersects(with: AABB) const |
|
intersects_plane(plane: Plane) const |
|
Variant |
intersects_ray(from: Vector3, dir: Vector3) const |
Variant |
intersects_segment(from: Vector3, to: Vector3) const |
is_equal_approx(aabb: AABB) const |
|
is_finite() const |
|
Оператори
operator !=(right: AABB) |
|
operator *(right: Transform3D) |
|
operator ==(right: AABB) |
Описи властивостей
Vector3 end = Vector3(0, 0, 0) 🔗
Кінцева точка. Зазвичай це кут у верхньому правому куті та задній частині рамки, що еквівалентно позиція + розмір. Встановлення цієї точки впливає на size.
Vector3 position = Vector3(0, 0, 0) 🔗
Початкова точка. Зазвичай це кут нижнього лівого та переднього кута обмежувальної рамки.
Vector3 size = Vector3(0, 0, 0) 🔗
Ширина, висота та глибина обмежувальної рамки, починаючи з position. Встановлення цього значення також впливає на точку end.
Примітка: Рекомендується встановлювати невід’ємні значення ширини, висоти та глибини. Це пояснюється тим, що більшість методів у Godot припускають, що position — це нижній лівий задній кут, а end — верхній правий передній кут. Щоб отримати еквівалентну обмежувальну рамку з невід’ємним розміром, використовуйте abs().
Описи конструкторів
Створює AABB зі значеннями position і sizr установленими на Vector3.ZERO.
Створює AABB як копію заданого AABB.
AABB AABB(position: Vector3, size: Vector3)
Створює AABB за position і size.
Описи методів
Повертає AABB, еквівалентний цій обмежувальній рамці, з її шириною, висотою та глибиною, зміненими на невід’ємні значення.
змінна коробка = AABB(Вектор3(5, 0, 5), Вектор3(-20, -10, -5))
var absolute = box.abs()
print(absolute.position) # Друк (-15.0, -10.0, 0.0)
print(absolute.size) # Друк (20.0, 10.0, 5.0)
var box = new Aabb(new Vector3(5, 0, 5), new Vector3(-20, -10, -5));
var absolute = box.Abs();
GD.Print(absolute.Position); // Виводить (-15, -10, 0)
GD.Print(absolute.Size); // Друк (20, 10, 5)
Примітка: Рекомендується використовувати цей метод, коли size є від’ємним, оскільки більшість інших методів у Godot припускають, що компоненти size більші за 0.
bool encloses(with: AABB) const 🔗
Повертає true, якщо ця обмежувальна рамка повністю охоплює рамку with. Краї обох коробок включені.
[gdscript]
var a = AABB(Vector3(0, 0, 0), Vector3(4, 4, 4))
var b = AABB(Vector3(1, 1, 1), Vector3(3, 3, 3))
var c = AABB(Vector3(2, 2, 2), Vector3(8, 8, 8))
print(a.encloses(a)) # Виводить true
print(a.encloses(b)) # Виводить true
print(a.encloses(c)) # Виводить false
[/gdscript]
[csharp]
var a = new Aabb(new Vector3(0, 0, 0), new Vector3(4, 4, 4));
var b = new Aabb(new Vector3(1, 1, 1), new Vector3(3, 3, 3));
var c = new Aabb(new Vector3(2, 2, 2), new Vector3(8, 8, 8));
GD.Print(a.Encloses(a)); // Виводить True
GD.Print(a.Encloses(b)); // Виводить True
GD.Print(a.Encloses(c)); // Виводить False
[/csharp][/codeblocks]
AABB expand(to_point: Vector3) const 🔗
Повертає копію цієї обмежувальної рамки, розширену для вирівнювання країв із заданим to_point, якщо необхідно.
var box = AABB(Vector3(0, 0, 0), Vector3(5, 2, 5))
box = box.expand(Vector3(10, 0, 0))
print(box.position) # Друкує (0.0, 0.0, 0.0)
print(box.size) # Друк (10.0, 2.0, 5.0)
box = box.expand(Vector3(-5, 0, 5))
print(box.position) # Друк (-5.0, 0.0, 0.0)
print(box.size) # Друк (15.0, 2.0, 5.0)
var box = new Aabb(new Vector3(0, 0, 0), new Vector3(5, 2, 5));
box = box.Expand(new Vector3(10, 0, 0));
GD.Print(box.Position); // Виводить (0, 0, 0)
GD.Print(box.Size); // Друк (10, 2, 5)
box = box.Expand(new Vector3(-5, 0, 5));
GD.Print(box.Position); // Друкує (-5, 0, 0)
GD.Print(box.Size); // Друк (15, 2, 5)
Vector3 get_center() const 🔗
Повертає центральну точку обмежувальної рамки. Це те саме, що позиція + (розмір / 2.0).
Vector3 get_endpoint(idx: int) const 🔗
Повертає позицію однієї з 8 вершин, що складають цю обмежувальну рамку. З idx, що дорівнює 0, це те саме, що й position, а idx, що дорівнює 7 end, те саме, що й end.
Vector3 get_longest_axis() const 🔗
Повертає найдовшу нормалізовану вісь size цієї обмежувальної рамки як Vector3 (Vector3.RIGHT, Vector3.UP або Vector3.BACK).
var box = AABB(Vector3(0, 0, 0), Vector3(2, 4, 8))
print(box.get_longest_axis()) # Друк (0, 0, 1)
print(box.get_longest_axis_index()) # Друкує 2
print(box.get_longest_axis_size()) # Друкує 8
var box = new Aabb(new Vector3(0, 0, 0), new Vector3(2, 4, 8));
GD.Print(box.GetLongestAxis()); // Виводить (0, 0, 1)
GD.Print(box.GetLongestAxisIndex()); // Друкує 2
GD.Print(box.GetLongestAxisSize()); // Друкує 8
Дивіться також get_longest_axis_index() і get_longest_axis_size().
int get_longest_axis_index() const 🔗
Повертає індекс до найдовшої осі size цієї обмежувальної рамки (див. Vector3.AXIS_X, Vector3.AXIS_Y і Vector3.AXIS_Z).
Для прикладу див. get_longest_axis().
float get_longest_axis_size() const 🔗
Повертає найдовший розміри size цього обмежувального прямокутника.
Для прикладу див. get_longest_axis().
Vector3 get_shortest_axis() const 🔗
Повертає найкоротшу нормалізовану вісь size цієї обмежувальної рамки як Vector3 (Vector3.RIGHT, Vector3.UP або Vector3.BACK).
var box = AABB(Vector3(0, 0, 0), Vector3(2, 4, 8))
print(box.get_shortest_axis()) # Друк (1, 0, 0)
print(box.get_shortest_axis_index()) # Виводить 0
print(box.get_shortest_axis_size()) # Друкує 2
var box = new Aabb(new Vector3(0, 0, 0), new Vector3(2, 4, 8));
GD.Print(box.GetShortestAxis()); // Виводить (1, 0, 0)
GD.Print(box.GetShortestAxisIndex()); // Виводить 0
GD.Print(box.GetShortestAxisSize()); // Друкує 2
Дивіться також get_shortest_axis_index() і get_shortest_axis_size().
int get_shortest_axis_index() const 🔗
Повертає індекс до найкоротшої осі size цієї обмежувальної рамки (див. Vector3.AXIS_X, Vector3.AXIS_Y і Vector3.AXIS_Z).
Для прикладу див. get_shortest_axis().
float get_shortest_axis_size() const 🔗
Повертає найкоротший розмір size цієї обмежувальної рамки.
Для прикладу див. get_shortest_axis().
Vector3 get_support(direction: Vector3) const 🔗
Повертає позицію вершини цієї обмежувальної рамки, яка знаходиться найдальше в заданому напрямку. Ця точка широко відома як опорна точка в алгоритмах виявлення зіткнень.
Повертає об’єм обмежувальної рамки. Це еквівалентно size.x * size.y * size.z. Дивіться також has_volume().
Повертає копію цієї обмежувальної рамки, розширену з усіх боків на задану величину by. Натомість від’ємне значення зменшує коробку.
var a = AABB(Vector3(4, 4, 4), Vector3(8, 8, 8)).grow(4)
print(a.position) # Друк (0, 0, 0)
print(a.size) # Відбитки (16, 16, 16)
var b = AABB(Vector3(0, 0, 0), Vector3(8, 4, 2)).grow(2)
print(b.position) # Друк (-2, -2, -2)
print(b.size) # Відбитки (12, 8, 6)
var a = new Aabb(new Vector3(4, 4, 4), new Vector3(8, 8, 8)).Grow(4);
GD.Print(a.Position); // Виводить (0, 0, 0)
GD.Print(a.Size); // Друк (16, 16, 16)
var b = new Aabb(new Vector3(0, 0, 0), new Vector3(8, 4, 2)).Grow(2);
GD.Print(b.Position); // Друк (-2, -2, -2)
GD.Print(b.Size); // Друкує (12, 8, 6)
bool has_point(point: Vector3) const 🔗
Повертає true, якщо обмежувальна рамка містить задану point. Згідно з умовами, точки праворуч, зверху та спереду не включені.
Примітка: Цей метод не є надійним для AABB з негативним size. Спочатку використовуйте abs(), щоб отримати дійсну обмежувальну рамку.
Повертає true, якщо ця обмежувальна рамка має поверхню або довжину, тобто принаймні один компонент size більший за 0. В іншому випадку повертає false.
Повертає true, якщо ширина, висота та глибина обмежувальної рамки додатні. Дивіться також get_volume().
AABB intersection(with: AABB) const 🔗
Повертає перетин між цією обмежувальною рамкою та with. Якщо поля не перетинаються, повертає порожній AABB. Якщо рамки перетинаються на краю, повертає плоский AABB без обсягу (див. has_surface() і has_volume()).
var box1 = AABB(Vector3(0, 0, 0), Vector3(5, 2, 8))
var box2 = AABB(Vector3(2, 0, 2), Vector3(8, 4, 4))
var intersection = box1.intersection(box2)
print(intersection.position) # Вивести (2, 0, 2)
print(intersection.size) # Друк (3, 2, 4)
var box1 = new Aabb(новий Vector3(0, 0, 0), new Vector3(5, 2, 8));
var box2 = new Aabb(новий Vector3(2, 0, 2), new Vector3(8, 4, 4));
var intersection = box1.Intersection(box2);
GD.Print(intersection.position); // Виводить (2, 0, 2)
GD.Print(intersection.size); // Друкує (3, 2, 4)
Примітка: Якщо вам потрібно лише знати, чи перетинаються дві обмежувальні рамки, замість цього використовуйте intersects().
bool intersects(with: AABB) const 🔗
Повертає true, якщо ця обмежувальна рамка накладається на рамку with. Краї обох полів завжди виключаються.
bool intersects_plane(plane: Plane) const 🔗
Повертає true, якщо ця обмежувальна рамка знаходиться по обидва боки заданої plane.
Variant intersects_ray(from: Vector3, dir: Vector3) const 🔗
Повертає першу точку перетину цієї обмежувальної рамки та заданого променя як Vector3. Якщо перетину не відбувається, повертає null.
Промінь починається в
from, звернений доdirі тягнеться до нескінченності.
Variant intersects_segment(from: Vector3, to: Vector3) const 🔗
Повертає першу точку перетину цієї обмежувальної рамки та заданого сегмента як Vector3. Якщо перетину не відбувається, повертає null.
Сегмент починається в
fromі закінчується вto.
bool is_equal_approx(aabb: AABB) const 🔗
Повертає true, якщо ця обмежувальна рамка та aabb приблизно однакові, шляхом виклику Vector3.is_equal_approx() для position і size.
Повертає true, якщо значення цієї обмежувальної рамки скінченні, шляхом виклику Vector3.is_finite() для position і size.
AABB merge(with: AABB) const 🔗
Повертає AABB, який охоплює як цю обмежувальну рамку, так і with по краях. Дивіться також encloses().
Описи операторів
bool operator !=(right: AABB) 🔗
Повертає true, якщо position або size обох обмежувальних рамок не однакові.
Примітка: Через помилки точності з плаваючою комою, краще використати is_equal_approx(), який є більш надійним.
AABB operator *(right: Transform3D) 🔗
Зворотно перетворює (множить) AABB на задану матрицю перетворення Transform3D за припущенням, що базис перетворення є ортонормальним (тобто обертання/відображення є правильним, масштабування/перекіс – ні).
aabb * transform еквівалентний transform.inverse() * aabb. Див. Transform3D.inverse().
Для перетворення шляхом зворотного до афінного перетворення (наприклад, із масштабуванням) замість нього можна використовувати
transform.affine_inverse() * aabb. Див. Transform3D.affine_inverse().
bool operator ==(right: AABB) 🔗
Повертає true, якщо position і size обмежувальних рамок точно рівні, відповідно.
Примітка: Через похибки точності обчислень з плаваючою комою, розгляньте можливість використання is_equal_approx(), який є більш надійним.