Plane
使用黑塞范式的平面。
描述
代表归一化的平面方程。normal 是平面的法线(归一化的 a、b、c),而 d 是原点到平面的距离(沿“法线”方向)。平面的“上方”是平面朝向法线方向的一面。
教程
属性
| ||
| ||
| ||
| ||
|
构造函数
Plane() | |
方法
distance_to(point: Vector3) const | |
get_center() const | |
intersect_3(b: Plane, c: Plane) const | |
intersects_ray(from: Vector3, dir: Vector3) const | |
intersects_segment(from: Vector3, to: Vector3) const | |
is_equal_approx(to_plane: Plane) const | |
is_finite() const | |
is_point_over(point: Vector3) const | |
normalized() const | |
运算符
operator !=(right: Plane) | |
operator *(right: Transform3D) | |
operator ==(right: Plane) | |
常量
PLANE_YZ = Plane(1, 0, 0, 0)
🔗
在 Y 轴和 Z 轴上延伸的平面(法向量指向 +X)。
PLANE_XZ = Plane(0, 1, 0, 0)
🔗
在 X 轴和 Z 轴上延伸的平面(法向量朝向 +Y)。
PLANE_XY = Plane(0, 0, 1, 0)
🔗
在 X 轴和 Y 轴上延伸的平面(法向量朝向 +Z)。
属性说明
从原点到平面的距离,按照 normal 取值(根据其方向和长度)。原点与平面的实际绝对距离可以通过 abs(d) / normal.length()
计算(如果 normal 长度为零,则该 Plane 表示的不是有效平面)。
在平面 ax + by + cz = d
的标量方程中,这是 d
,而 (a, b, c)
坐标由 normal 属性表示。
Vector3 normal = Vector3(0, 0, 0)
🔗
该平面的法线,通常为单位向量。不应该为零向量,因为 normal 为零的 Plane 代表的不是有效平面。
在平面 ax + by + cz = d
的标量方程中,这是向量 (a, b, c)
,其中 d
是 d 属性。
平面法向量 normal 的 X 分量。
平面法向量 normal 的 Y 分量。
平面法向量 normal 的 Z 分量。
构造函数说明
构造默认初始化的 Plane,所有分量都设置为 0
。
构造给定 Plane 的副本。
Plane Plane(a: float, b: float, c: float, d: float)
根据四个参数创建一个平面。产生的平面的 normal 的三个分量是 a
、b
和 c
,且该平面与原点的距离为 d
。
根据法向量创建一个平面。该平面将与原点相交。
该平面的 normal
必须是一个单位向量。
Plane Plane(normal: Vector3, d: float)
根据法向量和平面与原点的距离创建一个平面。
平面的 normal
必须是一个单位向量。
Plane Plane(normal: Vector3, point: Vector3)
从法向量和平面上的一个点创建一个平面。
平面的 normal
必须是一个单位向量。
Plane Plane(point1: Vector3, point2: Vector3, point3: Vector3)
根据顺时针顺序给出的三个点创建一个平面。
方法说明
float distance_to(point: Vector3) const 🔗
返回从该平面到位置 point
的最短距离。如果该点在平面上方,则距离将为正。如果在下方,则距离将为负。
返回平面的中心。
bool has_point(point: Vector3, tolerance: float = 1e-05) const 🔗
如果 point
在该平面内,则返回 true
。比较将使用一个自定义的最小 tolerance
阈值。
Variant intersect_3(b: Plane, c: Plane) const 🔗
返回 b
、c
、该平面这三个平面的交点。如果没有找到交点,则返回 null
。
Variant intersects_ray(from: Vector3, dir: Vector3) const 🔗
返回由位置 from
和方向法线 dir
组成的射线与该平面的交点。如果没有找到交点,则返回 null
。
Variant intersects_segment(from: Vector3, to: Vector3) const 🔗
返回从位置 from
到位置 to
的线段与该平面的交点。如果没有找到交点,则返回 null
。
bool is_equal_approx(to_plane: Plane) const 🔗
如果该平面和 to_plane
近似相等,则返回 true
,判断近似相等的方法是通过在每个分量上运行 @GlobalScope.is_equal_approx。
如果该平面是有限的,则返回 true
,判断方法是在每个分量上调用 @GlobalScope.is_finite。
bool is_point_over(point: Vector3) const 🔗
如果 point
位于平面上方,则返回 true
。
返回该平面归一化 normal 后的副本(法线成为单位向量)。如果 normal 无法归一化(长度为零),则返回 Plane(0, 0, 0, 0)
。
Vector3 project(point: Vector3) const 🔗
返回 point
在该平面中的正交投影。
运算符说明
bool operator !=(right: Plane) 🔗
如果平面不相等,则返回 true
。
注意:由于浮点数精度误差,请考虑改用 is_equal_approx,会更可靠。
Plane operator *(right: Transform3D) 🔗
将 Plane 逆向变换(乘以)给定的 Transform3D 变换矩阵。
plane * transform
相当于 transform.affine_inverse() * plane
。请参阅 Transform3D.affine_inverse。
bool operator ==(right: Plane) 🔗
如果平面完全相等,则返回 true
。
注意:由于浮点数精度误差,请考虑改用 is_equal_approx,会更可靠。
返回与 +
不存在时相同的值。单目 +
没有作用,但有时可以使你的代码更具可读性。
返回该 Plane 的负值。和写 Plane(-p.normal, -p.d)
相同。该操作翻转了法线向量的方向,也翻转了距离值,得到的 Plane 位于同一个位置,但是朝向相反的方向。