AABB
3D 轴对齐边界框。
描述
AABB 由一个位置、一个大小和若干实用函数组成。通常用于快速重叠测试。
它使用浮点坐标。AABB 的 2D 对应物为 Rect2。
不支持负的 size,并且不适用于大多数方法。使用 abs 获得具有正尺寸的 AABB。
注意:与 Rect2 不同,AABB 没有使用整数坐标的变体。
备注
通过 C# 使用这个 API 时有显著的不同。详见 C# API 与 GDScript 的差异。
教程
属性
| ||
| ||
|
构造函数
AABB ( ) | |
方法
abs ( ) const | |
get_center ( ) const | |
get_endpoint ( int idx ) 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 ( Vector3 dir ) const | |
get_volume ( ) const | |
has_surface ( ) const | |
has_volume ( ) const | |
intersection ( AABB with ) const | |
intersects ( AABB with ) const | |
intersects_plane ( Plane plane ) const | |
intersects_ray ( Vector3 from, Vector3 dir ) const | |
intersects_segment ( Vector3 from, Vector3 to ) const | |
is_equal_approx ( AABB aabb ) const | |
is_finite ( ) const | |
操作符
operator != ( AABB right ) | |
operator * ( Transform3D right ) | |
operator == ( AABB right ) |
属性说明
Vector3 end = Vector3(0, 0, 0)
终点角。通过 position + size
计算而来。设置该值会修改大小。
Vector3 position = Vector3(0, 0, 0)
起点角。通常比 end 小。
Vector3 size = Vector3(0, 0, 0)
从 position 到 end 的大小。通常所有分量都是正数。
如果大小为负,可以用 abs 修正。
构造函数说明
AABB AABB ( )
默认构造 AABB,position 和 size 均为默认值(零)。
构造给定 AABB 的副本。
AABB AABB ( Vector3 position, Vector3 size )
从一个位置和大小构造 AABB 。
方法说明
AABB abs ( ) const
返回等价的 AABB,其原点被修正至最负数的角落,大小被修正为正数。
bool encloses ( AABB with ) const
该 AABB 完全包含另一个时,返回 true
。
AABB expand ( Vector3 to_point ) const
返回该 AABB 的副本,该副本扩展至包含给出的点。
例子:
GDScriptC#
# 位置 (-3, 2, 0),大小 (1, 1, 1)
var box = AABB(Vector3(-3, 2, 0), Vector3(1, 1, 1))
# 位置 (-3, -1, 0),大小 (3, 4, 2),包含原来的 AABB 和 Vector3(0, -1, 2)
var box2 = box.expand(Vector3(0, -1, 2))
// 位置 (-3, 2, 0),大小 (1, 1, 1)
var box = new Aabb(new Vector3(-3, 2, 0), new Vector3(1, 1, 1));
// 位置 (-3, -1, 0),大小 (3, 4, 2),包含原来的 AABB 和 Vector3(0, -1, 2)
var box2 = box.Expand(new Vector3(0, -1, 2));
Vector3 get_center ( ) const
返回该 AABB 的中心点,等于 position + (size / 2)。
Vector3 get_endpoint ( int idx ) const
获取该 AABB 的 8 个端点的位置。
Vector3 get_longest_axis ( ) const
返回该 AABB 归一化后的最长轴。
int get_longest_axis_index ( ) const
返回该 AABB 最长轴的索引(根据 Vector3 的 AXIS_*
常量)。
float get_longest_axis_size ( ) const
返回该 AABB 最长轴的标量长度。
Vector3 get_shortest_axis ( ) const
返回该 AABB 归一化后的最短轴。
int get_shortest_axis_index ( ) const
返回该 AABB 最短轴的索引(根据 Vector3::AXIS* 常量)。
float get_shortest_axis_size ( ) const
返回该 AABB 最短轴的标量长度。
Vector3 get_support ( Vector3 dir ) const
返回指定方向上最远的 AABB 顶点。该点通常称为碰撞检测算法的支撑点。
float get_volume ( ) const
返回该 AABB 的体积。
返回 AABB 的副本,该副本向所有方向增长了给定数量的单位。
bool has_point ( Vector3 point ) const
如果 AABB 包含点,则返回 true
。AABB 表面上的点被视为包括在内,但浮点精度误差可能会影响此类检测的准确性。
注意:这种方法对于具有负尺寸的 AABB 是不可靠的。使用 abs 获得一个正尺寸的等效 AABB 在检查是否包含点。
bool has_surface ( ) const
如果 AABB 具有表面或长度,则返回 true
;如果 AABB 为空(size 的所有分量为零或负),则返回 false
。
bool has_volume ( ) const
如果 AABB 有体积,则返回 true
;如果 AABB 是扁平的、空的或具有负的 size,则返回 false
。
AABB intersection ( AABB with ) const
返回两个 AABB 的交叠区域。失败时返回空的 AABB(大小为 (0, 0, 0)
)。
bool intersects ( AABB with ) const
该 AABB 与另一个交叠时,返回 true
。
bool intersects_plane ( Plane plane ) const
该 AABB 同时位于指定平面的两边时,返回 true
。
Variant intersects_ray ( Vector3 from, Vector3 dir ) const
返回给定的射线与该 AABB 的交点,如果不相交则返回 null
。射线无限长。
Variant intersects_segment ( Vector3 from, Vector3 to ) const
如果没有交点,则返回 null
,否则返回 from
和 to
与此 AABB 的交点。
bool is_equal_approx ( AABB aabb ) const
如果该 AABB 和 aabb
近似相等,则返回 true
,通过在每个分量上调用 @GlobalScope.is_equal_approx。
bool is_finite ( ) const
如果该 AABB 是有限的,则返回 true
,方法是在每个分量上调用 @GlobalScope.is_finite。
AABB merge ( AABB with ) const
返回同时包含该 AABB 和 with
的更大的 AABB。
操作符说明
bool operator != ( AABB right )
如果 AABB 不相等,则返回 true
。
注意:由于浮点数精度误差,请考虑改用 is_equal_approx,会更可靠。
AABB operator * ( Transform3D right )
假设该变换的基是正交的(即旋转/反射可以,缩放/倾斜则不行),将 AABB 逆向变换(乘以)给定的 Transform3D 变换矩阵。
aabb * transform
相当于 transform.inverse() * aabb
。见 Transform3D.inverse。
对于通过仿射变换的逆进行的变换(例如,缩放),可以使用 transform.affine_inverse() * aabb
代替。见 Transform3D.affine_inverse。
bool operator == ( AABB right )
如果 AABB 完全相等,则返回 true
。
注意:由于浮点数精度误差,请考虑改用 is_equal_approx,会更可靠。
© 版权所有 2014-present Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0). Revision b1c660f7
.
Built with Sphinx using a theme provided by Read the Docs.