reckfellENGINE

Aabb

Трёхмерный бокс: координаты, размеры, включение точек и пересечение границ.

На этой странице
struct AabbReckfellSharpНаследует ValueType

Ограничивающий бокс с гранями, параллельными осям координат. Position — начальная вершина, Size — полный размер, End = Position + Size. Это структура C#: присваивание копирует значение; Abs(), Grow(), Expand() и Merge() возвращают новый бокс.

Храните бокс и проверяемые точки в одной системе координат. Операция Transform3D * Aabb возвращает новый охватывающий Aabb; сам тип не хранит поворот. Для отрицательного Size сначала используйте Abs(). Для ненулевого объёма проверяйте HasVolume(), для конечности чисел — IsFinite().

Границы зависят от метода: HasPoint() включает End, Intersects() исключает простое касание обычных боксов, Intersection() сохраняет область контакта даже с нулевой толщиной. У IntersectsPlane() касание зависит от направления нормали — см. описание метода. Aabb не преобразуется в bool в C#; выбирайте явную проверку под свою задачу.

C#
using Reckfell;

public static class BoundaryExamples
{
    public static bool Validate()
    {
        var box = new Aabb(Vector3.Zero, new Vector3(2, 2, 2));
        var neighbor = new Aabb(new Vector3(2, 0, 0), new Vector3(2, 2, 2));
        bool includesEnd = box.HasPoint(box.End);             // true
        bool overlapsNeighbor = box.Intersects(neighbor);     // false
        Aabb contact = box.Intersection(neighbor);            // position (2,0,0), size (0,2,2)
        bool contactHasVolume = contact.HasVolume();          // false
        Aabb padded = box.Grow(1);                            // position (-1,-1,-1), size (4,4,4)
        return includesEnd && !overlapsNeighbor && !contactHasVolume
            && contact.Position == new Vector3(2, 0, 0)
            && contact.Size == new Vector3(0, 2, 2)
            && padded.Size == new Vector3(4, 4, 4)
            && box.Size == new Vector3(2, 2, 2);              // original unchanged
    }
}

Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.

Конструкторы4

Aabb4 перегрузки
# Aabb · 1/4
C#
public Aabb(Vector3 position, Vector3 size);

Создаёт Aabb из начальной вершины и полного размера. Координаты и размеры сохраняются напрямую; отрицательные компоненты не исправляются. Для бокса нулевого размера в начале координат используйте default(Aabb).

Параметры
ИмяТипПо умолчанию
positionVector3—
sizeVector3—
position

Начальная вершина бокса.

size

Полный размер по трём осям; для обычных операций используйте неотрицательные компоненты.

# Aabb · 2/4
C#
public Aabb(Vector3 position, float width, float height, float depth);

Создаёт Aabb из начальной вершины и полного размера. Координаты и размеры сохраняются напрямую; отрицательные компоненты не исправляются. Для бокса нулевого размера в начале координат используйте default(Aabb).

Параметры
ИмяТипПо умолчанию
positionVector3—
widthfloat—
heightfloat—
depthfloat—
position

Начальная вершина бокса.

width

Полный размер по X, не полуразмер.

height

Полный размер по Y, не полуразмер.

depth

Полный размер по Z, не полуразмер.

# Aabb · 3/4
C#
public Aabb(float x, float y, float z, Vector3 size);

Создаёт Aabb из начальной вершины и полного размера. Координаты и размеры сохраняются напрямую; отрицательные компоненты не исправляются. Для бокса нулевого размера в начале координат используйте default(Aabb).

Параметры
ИмяТипПо умолчанию
xfloat—
yfloat—
zfloat—
sizeVector3—
x

X начальной вершины.

y

Y начальной вершины.

z

Z начальной вершины.

size

Полный размер по трём осям; для обычных операций используйте неотрицательные компоненты.

# Aabb · 4/4
C#
public Aabb(float x, float y, float z, float width, float height, float depth);

Создаёт Aabb из начальной вершины и полного размера. Координаты и размеры сохраняются напрямую; отрицательные компоненты не исправляются. Для бокса нулевого размера в начале координат используйте default(Aabb).

Параметры
ИмяТипПо умолчанию
xfloat—
yfloat—
zfloat—
widthfloat—
heightfloat—
depthfloat—
x

X начальной вершины.

y

Y начальной вершины.

z

Z начальной вершины.

width

Полный размер по X, не полуразмер.

height

Полный размер по Y, не полуразмер.

depth

Полный размер по Z, не полуразмер.

Свойства4

EndСвойство
# End
C#
public Vector3 End { get; set; }

Конечная вершина: Position + Size. Присваивание меняет только Size на value - Position; Position остаётся прежней. Значение меньше Position может создать отрицательный размер.

PositionСвойство
# Position
C#
public Vector3 Position { get; set; }

Начальная вершина бокса. Присваивание сохраняет Size и переносит End на ту же величину. Это координаты выбранной системы отсчёта, не автоматически мировая позиция объекта.

SizeСвойство
# Size
C#
public Vector3 Size { get; set; }

Полный размер по осям, а не полуразмеры: End = Position + Size. Присваивание не меняет Position и не нормализует отрицательные компоненты. Перед методами границ с отрицательным Size используйте Abs().

VolumeСвойство
# Volume
C#
public float Volume { get; }

Вычисляет Size.X * Size.Y * Size.Z без нормализации и проверки знаков. Результат может быть отрицательным; две отрицательные компоненты дают положительное произведение. Для проверки положительных размеров используйте HasVolume().

Методы30

AbsAabb
# Abs
C#
public Aabb Abs();

Возвращает эквивалентный бокс с неотрицательным Size: Position становится покомпонентным минимумом прежних Position и End. Нулевой размер остаётся нулевым. Исходное значение не меняется.

Возвращает Aabb

Нормализованная копия бокса.

Enclosesbool
# Encloses
C#
public bool Encloses(Aabb with);

Проверяет полное включение with по всем трём осям. Границы включены: бокс включает самого себя и меньший бокс, касающийся его граней. Предполагается неотрицательный Size у обоих боксов.

Параметры
ИмяТипПо умолчанию
withAabb—
with

Бокс в той же системе координат; при отрицательном Size сначала вызовите Abs().

Возвращает bool

true, если Position и End другого бокса находятся внутри включённых границ этого бокса.

Equals2 перегрузки
# Equals · 1/2
C#
public bool Equals(Aabb other);

Сравнивает все компоненты Position и Size точно, без допуска и нормализации. Боксы с одинаковым геометрическим объёмом, но разными Position/Size, не равны. +0 и -0 сравниваются равными; NaN-компонента делает сравнение с копией false.

Параметры
ИмяТипПо умолчанию
otherAabb—
other

Другой Aabb для точного сравнения.

Возвращает bool

true при точном равенстве обоих полей бокса.

# Equals · 2/2
C#
public override bool Equals(object? obj);

Если obj — упакованный Aabb, сравнивает все компоненты Position и Size точно, без допуска и нормализации. Боксы с одинаковым геометрическим объёмом, но разными Position/Size, не равны. +0 и -0 сравниваются равными; NaN-компонента делает сравнение с копией false. Для null и другого типа возвращает false.

Параметры
ИмяТипПо умолчанию
objobject—
obj

Объект для сравнения; допускается null.

Возвращает bool

true при точном равенстве обоих полей бокса.

ExpandAabb
# Expand
C#
public Aabb Expand(Vector3 point);

Возвращает минимальную копию бокса, включающую прежние границы и point. Точка внутри или на границе не изменяет результат. Чтобы сохранить расширение, присвойте результат переменной; исходный Aabb не меняется.

Параметры
ИмяТипПо умолчанию
pointVector3—
point

Точка в системе координат бокса.

Возвращает Aabb

Расширенный бокс.

GetCenterVector3
# GetCenter
C#
public Vector3 GetCenter();

Вычисляет Position + Size * 0.5f. Возвращает координаты центра в той же системе координат; не применяет Transform3D объекта.

Возвращает Vector3

Середина между Position и End.

GetEndpointVector3
# GetEndpoint
C#
public Vector3 GetEndpoint(int idx);

Возвращает одну из восьми вершин. Бит 0 индекса выбирает End.Z, бит 1 — End.Y, бит 2 — End.X; при сброшенном бите используется Position соответствующей оси. Индекс 0 возвращает Position, индекс 7 — End. В C# индекс вне 0..7 вызывает ArgumentOutOfRangeException.

Параметры
ИмяТипПо умолчанию
idxint—
idx

Индекс вершины от 0 до 7 включительно.

Возвращает Vector3

Координаты вершины в системе координат бокса.

GetHashCodeint
# GetHashCode
C#
public override int GetHashCode();

Возвращает HashCode.Combine(Position, Size) для хеш-коллекций C#. Точно равные боксы имеют одинаковый хеш, но совпадение хеша не доказывает равенство. Dictionary<Aabb, T> использует точный Equals(), а не IsEqualApprox(). Не сохраняйте этот хеш как идентификатор ресурса или стабильную контрольную сумму между запусками.

Возвращает int

Хеш-код текущих Position и Size.

GetLongestAxisVector3
# GetLongestAxis
C#
public Vector3 GetLongestAxis();

Возвращает положительный единичный вектор оси с большей компонентой Size: (1, 0, 0), (0, 1, 0) или (0, 0, 1). При равенстве приоритет X, затем Y, затем Z. Выбор основан на исходных знаковых значениях, не на модулях; для отрицательных размеров сначала используйте Abs(). Это ось бокса, не направление с учётом поворота объекта.

Возвращает Vector3

Положительный единичный вектор выбранной оси.

GetLongestAxisIndexVector3.Axis
# GetLongestAxisIndex
C#
public Vector3.Axis GetLongestAxisIndex();

Выбирает наибольшую компоненту Size и возвращает соответствующий Vector3.Axis. При равенстве приоритет X, затем Y, затем Z. Сравнивает исходные знаковые значения, не модули; отрицательные размеры сначала нормализуйте через Abs().

Возвращает Vector3.Axis

Vector3.Axis.X, Vector3.Axis.Y или Vector3.Axis.Z.

GetLongestAxisSizefloat
# GetLongestAxisSize
C#
public float GetLongestAxisSize();

Возвращает наибольшую компоненту Size без изменения знака. Это полный размер по выбранной оси, не полуразмер и не длина диагонали. Transform3D объекта не применяется.

Возвращает float

Максимум из Size.X, Size.Y и Size.Z.

GetShortestAxisVector3
# GetShortestAxis
C#
public Vector3 GetShortestAxis();

Возвращает положительный единичный вектор оси с меньшей компонентой Size: (1, 0, 0), (0, 1, 0) или (0, 0, 1). При равенстве приоритет X, затем Y, затем Z. Выбор основан на исходных знаковых значениях, не на модулях; для отрицательных размеров сначала используйте Abs(). Это ось бокса, не направление с учётом поворота объекта.

Возвращает Vector3

Положительный единичный вектор выбранной оси.

GetShortestAxisIndexVector3.Axis
# GetShortestAxisIndex
C#
public Vector3.Axis GetShortestAxisIndex();

Выбирает наименьшую компоненту Size и возвращает соответствующий Vector3.Axis. При равенстве приоритет X, затем Y, затем Z. Сравнивает исходные знаковые значения, не модули; отрицательные размеры сначала нормализуйте через Abs().

Возвращает Vector3.Axis

Vector3.Axis.X, Vector3.Axis.Y или Vector3.Axis.Z.

GetShortestAxisSizefloat
# GetShortestAxisSize
C#
public float GetShortestAxisSize();

Возвращает наименьшую компоненту Size без изменения знака. Это полный размер по выбранной оси, не полуразмер и не длина диагонали. Transform3D объекта не применяется.

Возвращает float

Минимум из Size.X, Size.Y и Size.Z.

GetSupportVector3
# GetSupport
C#
public Vector3 GetSupport(Vector3 dir);

Выбирает вершину, наиболее удалённую в направлении dir, для бокса с неотрицательным Size. Для положительной компоненты dir берёт соответствующую компоненту End, иначе — Position. Нормализация направления не нужна. При нулевой компоненте несколько вершин равноценны; dir == Vector3.Zero возвращает Position.

Параметры
ИмяТипПо умолчанию
dirVector3—
dir

Направление в системе координат бокса; длина не влияет на выбор при неизменных знаках.

Возвращает Vector3

Координаты выбранной вершины.

GrowAabb
# Grow
C#
public Aabb Grow(float by);

Возвращает копию с Position - Vector3.One * by и Size + Vector3.One * (2 * by). Отрицательное by уменьшает бокс. Ограничения снизу нет: чрезмерное уменьшение создаёт отрицательный Size; метод не зажимает его до нуля.

Параметры
ИмяТипПо умолчанию
byfloat—
by

Отступ с каждой из шести сторон в единицах координат бокса; не полный прирост размера.

Возвращает Aabb

Новый бокс; исходный не меняется.

HasPointbool
# HasPoint
C#
public bool HasPoint(Vector3 point);

Для конечных координат: Проверяет Position <= point <= End по каждой оси. Все шесть граней, рёбра и вершины включены, в том числе End. Для отрицательного Size сначала используйте Abs(). Это проверка координат бокса, а не попадания в геометрию меша. Метод не отбрасывает NaN автоматически и может вернуть true для такой точки. Проверяйте IsFinite() у прямоугольника или бокса и у входной точки отдельно.

Параметры
ИмяТипПо умолчанию
pointVector3—
point

Точка в той же системе координат, что Position и Size.

Возвращает bool

true, если точка внутри бокса или на его границе.

HasSurfacebool
# HasSurface
C#
public bool HasSurface();

Возвращает true, если хотя бы одна компонента Size больше нуля. Несмотря на название, отрезок с Size = (2, 0, 0) тоже даёт true. Метод не вычисляет площадь поверхности и не проверяет корректность остальных компонент.

Возвращает bool

Size.X > 0 || Size.Y > 0 || Size.Z > 0.

HasVolumebool
# HasVolume
C#
public bool HasVolume();

Возвращает true, только если все три компоненты Size положительны. Плоский бокс, отрезок и точка дают false. Используйте эту проверку вместо Volume > 0: произведение двух отрицательных размеров тоже может быть положительным.

Возвращает bool

Size.X > 0 && Size.Y > 0 && Size.Z > 0.

IntersectionAabb
# Intersection
C#
public Aabb Intersection(Aabb with);

Вычисляет общий бокс для двух боксов с неотрицательным Size. Касание сохраняется: общая грань даёт одну нулевую компоненту Size, общее ребро — две, вершина — три. При раздельных боксах возвращает default(Aabb), то есть нулевой бокс в начале координат. Поэтому один результат default не позволяет отличить отсутствие пересечения от контакта в начале координат.

Параметры
ИмяТипПо умолчанию
withAabb—
with

Другой бокс в той же системе координат с неотрицательным Size.

Возвращает Aabb

Общая область, включая вырожденный контакт, либо default(Aabb) при отсутствии общей области.

Intersectsbool
# Intersects
C#
public bool Intersects(Aabb with);

Сравнивает интервалы по трём осям строгими неравенствами. Для обычных боксов с положительным Size касание только гранью, ребром или вершиной даёт false. Метод не проверяет HasVolume(): вырожденный бокс внутри другого может дать true. Для требования ненулевого объёма у обоих боксов отдельно проверьте HasVolume().

Параметры
ИмяТипПо умолчанию
withAabb—
with

Другой бокс в той же системе координат. Перед проверкой нормализуйте отрицательный Size через Abs().

Возвращает bool

true, если ни по одной оси не выполнено разделение или равенство противоположных границ.

IntersectsPlanebool
# IntersectsPlane
C#
public bool IntersectsPlane(Plane plane);

Проверяет расстояния восьми вершин до plane. Возвращает true, если есть хотя бы одна вершина с DistanceTo > 0 и хотя бы одна с DistanceTo <= 0. При строгом пересечении это обычный тест плоскости и бокса. При одном касании результат зависит от направления нормали: нулевое расстояние относится только к неположительной стороне. Не используйте метод как симметричную проверку касания с допуском.

Параметры
ИмяТипПо умолчанию
planePlane—
plane

Плоскость в системе координат бокса. Метод не добавляет допуск к DistanceTo.

Возвращает bool

true при наличии вершин в обеих указанных группах расстояний.

IntersectsSegmentbool
# IntersectsSegment
C#
public bool IntersectsSegment(Vector3 from, Vector3 to);

Проверяет конечный отрезок от from до to, включая оба конца и границу бокса. Касание грани считается пересечением. Если from == to, результат соответствует включению этой точки в бокс. Предполагается неотрицательный Size. Метод возвращает только bool, без точки попадания, нормали или расстояния.

Параметры
ИмяТипПо умолчанию
fromVector3—
toVector3—
from

Начальная точка отрезка в системе координат бокса.

to

Конечная точка отрезка, а не вектор направления.

Возвращает bool

true, если хотя бы одна точка конечного отрезка принадлежит боксу.

IsEqualApproxbool
# IsEqualApprox
C#
public bool IsEqualApprox(Aabb other);

Покомпонентно сравнивает Position и Size через Mathf.IsEqualApprox(). В текущей float-SDK точное равенство принимается сразу; иначе требуется abs(a - b) < max(0.000001, 0.000001 * abs(a)), где a — компонента этого бокса. Допуск не задаётся параметром и растёт с величиной первого значения. На границе допуска порядок операндов может менять результат; проверка также не транзитивна. Не используйте её как равенство ключей Dictionary или вместо проверки конечности: одинаковые бесконечности проходят точное сравнение, NaN — нет.

Параметры
ИмяТипПо умолчанию
otherAabb—
other

Бокс для сравнения; его компоненты являются вторыми операндами проверки допуска.

Возвращает bool

true, если все шесть сравнений компонентов проходят.

IsFinitebool
# IsFinite
C#
public bool IsFinite();

Проверяет все шесть компонент Position и Size на NaN и бесконечность. Отрицательный или нулевой размер сам по себе даёт true: это проверка конечности чисел, а не пригодности бокса для конкретного алгоритма.

Возвращает bool

true, если все компоненты Position и Size конечны.

MergeAabb
# Merge
C#
public Aabb Merge(Aabb with);

Возвращает минимальный Aabb, включающий оба исходных бокса. Это охватывающий прямоугольный объём: свободное пространство между раздельными боксами тоже входит в результат. Оба бокса должны находиться в одной системе координат и иметь неотрицательный Size. Исходные значения не меняются.

Параметры
ИмяТипПо умолчанию
withAabb—
with

Бокс, границы которого нужно включить.

Возвращает Aabb

Новый охватывающий бокс.

ToString2 перегрузки
# ToString · 1/2
C#
public override string ToString();

Формирует строку Position.ToString(format) + ", " + Size.ToString(format): например, (1.25, -2.5, 3), (1, 1, 1). Координаты используют InvariantCulture: десятичная точка не зависит от языка системы. Это диагностическая строка, не формат JSON или сохранения игры. Эквивалентен ToString(null).

Возвращает string

Строка с координатами Position и Size.

# ToString · 2/2
C#
public string ToString(string? format);

Формирует строку Position.ToString(format) + ", " + Size.ToString(format): например, (1.25, -2.5, 3), (1, 1, 1). Координаты используют InvariantCulture: десятичная точка не зависит от языка системы. Это диагностическая строка, не формат JSON или сохранения игры. Формат применяется ко всем шести числам; F2 округляет вывод до двух знаков, не изменяя бокс. Неподдерживаемый числовой формат может вызвать FormatException.

Параметры
ИмяТипПо умолчанию
formatstring—
format

Числовой формат .NET, например "F2". null выбирает формат по умолчанию.

Возвращает string

Строка с координатами Position и Size.

op_Equalitybool
# op_Equality
C#
public static bool operator ==(Aabb left, Aabb right);

Точное сравнение Equals(right). Сравнивает компоненты Position и Size, без допуска, Abs() или проверки перекрытия. +0 и -0 равны. При NaN в компоненте равенство с копией false, а неравенство true.

Параметры
ИмяТипПо умолчанию
leftAabb—
rightAabb—
left

Левый бокс.

right

Правый бокс.

Возвращает bool

true при точном равенстве.

op_Inequalitybool
# op_Inequality
C#
public static bool operator !=(Aabb left, Aabb right);

Отрицание точного сравнения Equals(right). Сравнивает компоненты Position и Size, без допуска, Abs() или проверки перекрытия. +0 и -0 равны. При NaN в компоненте равенство с копией false, а неравенство true.

Параметры
ИмяТипПо умолчанию
leftAabb—
rightAabb—
left

Левый бокс.

right

Правый бокс.

Возвращает bool

true при неравенстве.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.