AABB

一个3D轴对齐的边界框。

描述

AABB内置Variant类型表示3D空间中的轴对齐的边界框。它由其positionsize定义,即Vector3。它经常用于快速重叠测试(参见intersects())。虽然AABB本身是轴对齐的,但它可以与Transform3D组合来表示旋转或倾斜的边界框。

它使用浮点坐标。AABB的2D对应物是Rect2。没有使用整数坐标的AABB版本。

注意:不支持size的负值。对于负大小,大多数AABB方法无法正常工作。使用abs()获取具有非负大小的等效AABB

注意:在布尔上下文中,如果positionsize都为零(等于Vector3.ZERO),则AABB的计算结果为false。否则,它总是计算为true

属性

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

运算符


属性说明

Vector3 end = Vector3(0, 0, 0) 🔗

终点。这通常是边界框右上角和背面的角,相当于位置+大小。设置此点会影响size


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

原点。这通常是边界框左下角和前方的角。


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

边界框的宽度、高度和深度从position开始。设置此值也会影响end点。

注意:建议将宽度、高度和深度设置为非负值。这是因为i3D中的大多数方法都假设position是左下角,而end是右上角。要获得非负大小的等效边界框,请使用abs()


构造函数说明

AABB AABB() 🔗

构造一个AABB,其positionsize设置为Vector3.ZERO


AABB AABB(from: AABB)

构造一个AABB作为给定AABB的副本。


AABB AABB(position: Vector3, size: Vector3)

通过positionsize构造AABB


方法说明

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为负值时使用此方法,因为i3D中的大多数其他方法假设size的组件大于0


bool encloses(with: AABB) const 🔗

如果这个边界框完全包围with框,则返回true。两个框的边缘都包括在内。

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 🔗

返回边界框的中心点。这与位置+(size/2.0)相同。


Vector3 get_endpoint(idx: int) const 🔗

返回组成此边界框的8个顶点中的一个的位置。0idxposition相同,7idxend相同。


Vector3 get_longest_axis() const 🔗

返回此边界框size的最长归一化轴,形式为Vector3Vector3.RIGHTVector3.UPVector3.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_XVector3.AXIS_YVector3.AXIS_Z)。

有关示例,请参见get_longest_axis()


float get_longest_axis_size() const 🔗

返回此边界框的size的最长维度。

有关示例,请参见get_longest_axis()


Vector3 get_shortest_axis() const 🔗

返回此边界框size的最短归一化轴,形式为Vector3Vector3.RIGHTVector3.UPVector3.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_XVector3.AXIS_YVector3.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 🔗

如果边界框包含给定的point,则返回true。按照惯例,正好在右侧、顶部和正面的点不包括**。

注意:此方法对于sizeAABB不可靠。首先使用abs()获取有效的边界框。


bool has_surface() const 🔗

如果此边界框具有表面或长度,即size的至少一个组件大于0,则返回true。否则,返回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 🔗

如果此边界框与boxwith重叠,则返回true始终排除两个框的边缘。


bool intersects_plane(plane: Plane) const 🔗

如果此边界框位于给定plane的两侧,则返回true


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 🔗

如果此边界框和aabb近似相等,则返回true,方法是在positionsize上调用Vector3.is_equal_approx()


bool is_finite() const 🔗

如果此边界框的值是有限的,则通过在positionsize上调用Vector3.is_finite()返回true


AABB merge(with: AABB) const 🔗

返回一个AABB,它将此边界框和with包围在边缘周围。另请参阅encloses()


运算符说明

bool operator !=(right: AABB) 🔗

如果两个边界框的positionsize不相等,则返回true

注:由于浮点精度误差,考虑改用is_equal_approx(),这样更可靠。


AABB operator *(right: Transform3D) 🔗

假设变换基是正交的(即旋转/反射很好,缩放/倾斜不好),将AABB与给定的Transform3D变换矩阵进行逆变换(相乘)。

aabb*转换等价于transform. inverse()*aabb。请参阅Transform3D.inverse()

用于通过仿射变换的逆变换(例如缩放)变换。可以使用affine_inverse()*aabb代替。参见Transform3D.affine_inverse()


bool operator ==(right: AABB) 🔗

如果边界框的positionsize分别完全相等,则返回true

注:由于浮点精度误差,考虑改用is_equal_approx(),这样更可靠。