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.
Посібники
Властивості
|
||
|
||
|
Конструктори
AABB() |
|
Методи
abs() const |
|
get_center() const |
|
get_endpoint(idx: int) const |
|
get_longest_axis() const |
|
get_longest_axis_index() const |
|
get_longest_axis_size() const |
|
get_shortest_axis() const |
|
get_shortest_axis_index() const |
|
get_shortest_axis_size() const |
|
get_support(direction: Vector3) const |
|
get_volume() const |
|
has_surface() const |
|
has_volume() const |
|
intersection(with: AABB) const |
|
intersects(with: AABB) const |
|
intersects_plane(plane: Plane) const |
|
intersects_ray(from: Vector3, dir: Vector3) const |
|
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)
Повертає центральну точку обмежувальної рамки. Це те саме, що позиція + (розмір / 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(), який є більш надійним.