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.

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