AABB¶
一个3D轴对齐的边界框。
描述¶
AABB内置Variant类型表示3D空间中的轴对齐的边界框。它由其position和size定义,即Vector3。它经常用于快速重叠测试(参见intersects())。虽然AABB本身是轴对齐的,但它可以与Transform3D组合来表示旋转或倾斜的边界框。
它使用浮点坐标。AABB的2D对应物是Rect2。没有使用整数坐标的AABB版本。
注意:不支持size的负值。对于负大小,大多数AABB方法无法正常工作。使用abs()获取具有非负大小的等效AABB。
注意:在布尔上下文中,如果position和size都为零(等于Vector3.ZERO),则AABB的计算结果为false。否则,它总是计算为true。
属性¶
构造函数¶
方法¶
abs() const |
|
get_center() const |
|
get_endpoint(idx: int) const |
|
get_longest_axis() const |
|
get_longest_axis_index() const |
|
get_longest_axis_size() const |
|
get_shortest_axis() const |
|
get_shortest_axis_index() const |
|
get_shortest_axis_size() const |
|
get_support(direction: Vector3) const |
|
get_volume() const |
|
has_surface() const |
|
has_volume() const |
|
intersection(with: AABB) const |
|
intersects(with: AABB) const |
|
intersects_plane(plane: Plane) const |
|
intersects_ray(from: Vector3, dir: Vector3) const |
|
intersects_segment(from: Vector3, to: Vector3) const |
|
is_equal_approx(aabb: AABB) const |
|
is_finite() const |
|
运算符¶
operator !=(right: AABB) |
|
operator *(right: Transform3D) |
|
operator ==(right: AABB) |
属性说明¶
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,其position和size设置为Vector3.ZERO。
构造一个AABB作为给定AABB的副本。
AABB AABB(position: Vector3, size: Vector3)
通过position和size构造AABB。
方法说明¶
返回一个与此边界框等效的 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)
var box = new Aabb(new Vector3(5, 0, 5), new Vector3(-20, -10, -5));
var absolute = box.Abs();
S3.Print(absolute.Position); // 打印 (-15, -10, 0)
S3.Print(absolute.Size); // 打印 (20, 10, 5)
注意: 建议在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
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));
S3.Print(a.Encloses(a)); // 打印 True
S3.Print(a.Encloses(b)); // 打印 True
S3.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)
var box = new Aabb(new Vector3(0, 0, 0), new Vector3(5, 2, 5));
box = box.Expand(new Vector3(10, 0, 0));
S3.Print(box.Position); // 打印 (0, 0, 0)
S3.Print(box.Size); // 打印 (10, 2, 5)
box = box.Expand(new Vector3(-5, 0, 5));
S3.Print(box.Position); // 打印 (-5, 0, 0)
S3.Print(box.Size); // 打印 (15, 2, 5)
返回边界框的中心点。这与位置+(size/2.0)相同。
Vector3 get_endpoint(idx: int) const 🔗
返回组成此边界框的8个顶点中的一个的位置。0的idx与position相同,7的idx与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
var box = new Aabb(new Vector3(0, 0, 0), new Vector3(2, 4, 8));
S3.Print(box.GetLongestAxis()); // 打印 (0, 0, 1)
S3.Print(box.GetLongestAxisIndex()); // 打印 Z
S3.Print(box.GetLongestAxisSize()); // 打印 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.0, 0.0)
print(box.get_shortest_axis_index()) # 打印 0
print(box.get_shortest_axis_size()) # 打印 2.0
var box = new Aabb(new Vector3(0, 0, 0), new Vector3(2, 4, 8));
S3.Print(box.GetShortestAxis()); // 打印 (1, 0, 0)
S3.Print(box.GetShortestAxisIndex()); // 打印 X
S3.Print(box.GetShortestAxisSize()); // 打印 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 🔗
返回此边界框在给定方向上最远的顶点位置。此点在冲突检测算法中通常称为支撑点。
返回边界框的体积。这相当于size. x*size.y*size.z。另请参见has_volume()。
返回这个边界框的副本,所有边都按照给定的数量 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)
var a = new Aabb(new Vector3(4, 4, 4), new Vector3(8, 8, 8)).Grow(4);
S3.Print(a.Position); // 打印 (0, 0, 0)
S3.Print(a.Size); // 打印 (16, 16, 16)
var b = new Aabb(new Vector3(0, 0, 0), new Vector3(8, 4, 2)).Grow(2);
S3.Print(b.Position); // 打印 (-2, -2, -2)
S3.Print(b.Size); // 打印 (12, 8, 6)
bool has_point(point: Vector3) const 🔗
如果边界框包含给定的point,则返回true。按照惯例,正好在右侧、顶部和正面的点不包括**。
注意:此方法对于负size的AABB不可靠。首先使用abs()获取有效的边界框。
如果此边界框具有表面或长度,即size的至少一个组件大于0,则返回true。否则,返回false。
如果此边界框的宽度、高度和深度均为正,则返回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)
var box1 = new Aabb(new Vector3(0, 0, 0), new Vector3(5, 2, 8));
var box2 = new Aabb(new Vector3(2, 0, 2), new Vector3(8, 4, 4));
var intersection = box1.Intersection(box2);
S3.Print(intersection.Position); // 打印 (2, 0, 2)
S3.Print(intersection.Size); // 打印 (3, 2, 4)
注意:如果只需要知道两个边界框是否相交,请使用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,方法是在position和size上调用Vector3.is_equal_approx()。
如果此边界框的值是有限的,则通过在position和size上调用Vector3.is_finite()返回true。
AABB merge(with: AABB) const 🔗
返回一个AABB,它将此边界框和with包围在边缘周围。另请参阅encloses()。
运算符说明¶
bool operator !=(right: AABB) 🔗
如果两个边界框的position或size不相等,则返回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) 🔗
如果边界框的position和size分别完全相等,则返回true。
注:由于浮点精度误差,考虑改用is_equal_approx(),这样更可靠。