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

end

Vector3(0, 0, 0)

Vector3

position

Vector3(0, 0, 0)

Vector3

size

Vector3(0, 0, 0)

Конструктори

AABB

AABB()

AABB

AABB(from: AABB)

AABB

AABB(position: Vector3, size: Vector3)

Методи

AABB

abs() const

bool

encloses(with: AABB) const

AABB

expand(to_point: Vector3) const

Vector3

get_center() const

Vector3

get_endpoint(idx: int) const

Vector3

get_longest_axis() const

int

get_longest_axis_index() const

float

get_longest_axis_size() const

Vector3

get_shortest_axis() const

int

get_shortest_axis_index() const

float

get_shortest_axis_size() const

Vector3

get_support(direction: Vector3) const

float

get_volume() const

AABB

grow(by: float) const

bool

has_point(point: Vector3) const

bool

has_surface() const

bool

has_volume() const

AABB

intersection(with: AABB) const

bool

intersects(with: AABB) const

bool

intersects_plane(plane: Plane) const

Variant

intersects_ray(from: Vector3, dir: Vector3) const

Variant

intersects_segment(from: Vector3, to: Vector3) const

bool

is_equal_approx(aabb: AABB) const

bool

is_finite() const

AABB

merge(with: AABB) const

Оператори

bool

operator !=(right: AABB)

AABB

operator *(right: Transform3D)

bool

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

Створює AABB зі значеннями position і sizr установленими на Vector3.ZERO.


AABB AABB(from: AABB)

Створює AABB як копію заданого AABB.


AABB AABB(position: Vector3, size: Vector3)

Створює AABB за position і size.


Описи методів

AABB abs() const 🔗

Повертає 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)

Примітка: Рекомендується використовувати цей метод, коли 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)

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

Дивіться також 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

Дивіться також 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 🔗

Повертає позицію вершини цієї обмежувальної рамки, яка знаходиться найдальше в заданому напрямку. Ця точка широко відома як опорна точка в алгоритмах виявлення зіткнень.


float get_volume() const 🔗

Повертає об’єм обмежувальної рамки. Це еквівалентно size.x * size.y * size.z. Дивіться також has_volume().


AABB grow(by: float) const 🔗

Повертає копію цієї обмежувальної рамки, розширену з усіх боків на задану величину 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)

bool has_point(point: Vector3) const 🔗

Повертає true, якщо обмежувальна рамка містить задану point. Згідно з умовами, точки праворуч, зверху та спереду не включені.

Примітка: Цей метод не є надійним для AABB з негативним size. Спочатку використовуйте abs(), щоб отримати дійсну обмежувальну рамку.


bool has_surface() const 🔗

Повертає true, якщо ця обмежувальна рамка має поверхню або довжину, тобто принаймні один компонент size більший за 0. В іншому випадку повертає false.


bool has_volume() const 🔗

Повертає 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)

Примітка: Якщо вам потрібно лише знати, чи перетинаються дві обмежувальні рамки, замість цього використовуйте 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.


bool is_finite() const 🔗

Повертає 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(), який є більш надійним.