AABB

Ограничивающая рамка, выровненная по трехмерным осям.

Описание

Встроенный тип Variant AABB представляет собой ограничивающий прямоугольник, выровненный по осям, в трёхмерном пространстве. Он определяется параметрами position и size, которые равны Vector3. Он часто используется для быстрых тестов на перекрытие (см. intersects()). Хотя сам AABB выровнен по осям, его можно комбинировать с Transform3D для представления повёрнутого или наклонённого ограничивающего прямоугольника.

Он использует координаты с плавающей точкой. 2D аналогом AABB является Rect2. Версии AABB с целочисленными координатами не существует.

Примечание: Отрицательные значения size не поддерживаются. При отрицательном размере большинство методов AABB работают некорректно. Используйте abs() для получения эквивалентного AABB с неотрицательным размером.

Примечание: В булевом контексте AABB вычисляется как false, если и position, и size равны нулю (равны Vector3.ZERO). В противном случае он всегда вычисляется как true.

Примечание

Существуют заметные различия при использовании данного API с C#. Подробнее см. API различия C# и GDScript.

Обучающие материалы

Свойства

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

Конечная точка. Обычно это угол сверху справа и сзади ограничивающего прямоугольника, и эквивалентно position + size. Установка этой точки влияет на size.


Vector3 position = Vector3(0, 0, 0) 🔗

Начальная точка. Обычно это нижний левый угол спереди ограничивающей рамки.


Vector3 size = Vector3(0, 0, 0) 🔗

Ширина, высота и глубина ограничивающего прямоугольника, начиная с position. Установка этого значения также влияет на точку end.

Примечание: Рекомендуется устанавливать ширину, высоту и глубину на неотрицательные значения. Это связано с тем, что большинство методов в Godot предполагают, что position — это нижний левый передний угол, а end — это верхний правый задний угол. Чтобы получить эквивалентный ограничивающий прямоугольник с неотрицательным размером, используйте abs().


Описания конструктора

AABB AABB() 🔗

Создает AABB с его position и size, установленными на Vector3.ZERO.


AABB AABB(from: AABB)

Создает AABB как копию заданного AABB.


AABB AABB(position: Vector3, size: Vector3)

Создает AABB по position и size.


Описания метода

AABB abs() const 🔗

Возвращает эквивалент AABB для данного ограничивающего прямоугольника, ширина, высота и глубина которого изменены так, чтобы они были неотрицательными значениями.

var box = AABB(Vector3(5, 0, 5), Vector3(-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. Края обоих прямоугольников включены.

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

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 🔗

Возвращает центральную точку ограничивающего прямоугольника. Это то же самое, что и position + (size / 2.0).


Vector3 get_endpoint(idx: int) const 🔗

Возвращает положение одной из 8 вершин, составляющих этот ограничивающий параллелепипед. Если idx равен 0, это то же самое, что и position, а если idx равен 7, это то же самое, что и 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, 0.0, 1.0)
print(box.get_longest_axis_index()) # Выводит 2
print(box.get_longest_axis_size())  # Выводит 8.0

См. также 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.0, 0.0)
print(box.get_shortest_axis_index()) # Выводит 0
print(box.get_shortest_axis_size())  # Выводит 2.0

См. также 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.0, 0.0)
print(a.size)     # Выводит (16.0, 16.0, 16.0)

var b = AABB(Vector3(0, 0, 0), Vector3(8, 4, 2)).grow(2)
print(b.position) # Выводит (-2.0, -2.0, -2.0)
print(b.size)     # Выводит (12.0, 8.0, 6.0)

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, 0.0, 2.0)
print(intersection.size)     # Выводит (3.0, 2.0, 4.0)

Примечание: Если вам нужно только узнать, пересекаются ли два ограничивающих прямоугольника, используйте вместо этого 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 по краям. См. также encludes().


Описания оператора

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(), который более надежен.