Geometry3D
继承: Object
提供常见 3D 几何运算的方法。
描述
为创建几何形状,计算形状之间的交集,以及处理 3D 中的各种其他几何操作提供了一组辅助函数。
方法
方法说明
Array[Plane] build_box_planes(extents: Vector3) 🔗
返回一个包含 6 个 Plane 的数组,这些 Plane 描述以原点为中心的盒子的边。盒子大小由 extents
定义,它代表盒子的一个(正)角(即实际大小的一半)。
Array[Plane] build_capsule_planes(radius: float, height: float, sides: int, lats: int, axis: Vector3.Axis = 2) 🔗
返回一个 Plane 的数组,这些 Plane 紧密围绕着以原点为中心的多面胶囊,该胶囊半径为 radius
、高度为 height
。参数 sides
定义了将为胶囊的侧面部分生成多少个平面,而 lats
给出了胶囊底部和顶部的纬向步数。参数 axis
描述了胶囊的方向轴(0 代表 X,1 代表 Y,2 代表 Z)。
Array[Plane] build_cylinder_planes(radius: float, height: float, sides: int, axis: Vector3.Axis = 2) 🔗
返回一组 Plane,这些 Plane 紧密围绕着以原点为中心的多面圆柱体,该圆柱体半径为 radius
、高度为 height
。参数 sides
定义了将为圆柱体的圆形部分生成多少个平面。参数 axis
描述了圆柱体的方向轴(0 代表 X,1 代表 Y,2 代表 Z)。
PackedVector3Array clip_polygon(points: PackedVector3Array, plane: Plane) 🔗
将 points
中的点所定义的多边形,裁剪该 plane
并返回该裁剪后的多边形的点。
PackedVector3Array compute_convex_mesh_points(planes: Array[Plane]) 🔗
计算并返回由一组 planes
定义的凸形状的所有顶点。
Vector3 get_closest_point_to_segment(point: Vector3, s1: Vector3, s2: Vector3) 🔗
返回 3D 线段 (s1
, s2
) 上与 point
最近的 3D 点。返回的点始终在指定的线段内部。
Vector3 get_closest_point_to_segment_uncapped(point: Vector3, s1: Vector3, s2: Vector3) 🔗
返回直线上与 point
最近的 3D 点,该直线由 (s1
, s2
) 定义。返回的点可能在线段 (s1
, s2
) 上,也可能不在,即位于线段的延长线上。
PackedVector3Array get_closest_points_between_segments(p1: Vector3, p2: Vector3, q1: Vector3, q2: Vector3) 🔗
给定两个 3D 线段 (p1
, p2
) 和 (q1
, q2
),找出这两个线段见距离最近的两个点。返回 PackedVector3Array,包含 (p1
, q1
) 和 (p2
, q2
) 上的点。
Vector3 get_triangle_barycentric_coords(point: Vector3, a: Vector3, b: Vector3, c: Vector3) 🔗
返回一个 Vector3,其中包含基于 3D 位置(point
)与三角形不同顶点(a
、b
和 c
)的接近程度的权重。这对于在三角形中不同顶点的数据之间进行插值非常有用。一个示例用例是使用它在网格上平滑旋转,而不是仅仅依赖于面法线。
Variant ray_intersects_triangle(from: Vector3, dir: Vector3, a: Vector3, b: Vector3, c: Vector3) 🔗
测试起始于 from
、方向为 dir
的 3D 射线是否与 a
、b
、c
构成的三角形相交。如果相交则返回交点 Vector3。如果不相交则返回 null
。
PackedVector3Array segment_intersects_convex(from: Vector3, to: Vector3, planes: Array[Plane]) 🔗
给定一个通过数组 planes
中的 Plane 定义的凸面体,测试线段(from
,to
)是否与该面体相交。如果找到交点,则返回一个 PackedVector3Array,其中包含交点和凸面体的法线。否则,返回一个空数组。
PackedVector3Array segment_intersects_cylinder(from: Vector3, to: Vector3, height: float, radius: float) 🔗
检查线段(from
,to
)是否与以原点为中心且高度为 height
、半径为 radius
的圆柱相交。如果不相交,则返回一个空的 PackedVector3Array。如果相交,则返回的数组包含交点和圆柱体在交点处的法线。
PackedVector3Array segment_intersects_sphere(from: Vector3, to: Vector3, sphere_position: Vector3, sphere_radius: float) 🔗
检查线段(from
,to
)是否与球心位于 sphere_position
且半径为 sphere_radius
的球体相交。如果不相交,则返回一个空的 PackedVector3Array。如果相交,则返回一个 PackedVector3Array,其中包含交点和球体在交点处的法线。
Variant segment_intersects_triangle(from: Vector3, to: Vector3, a: Vector3, b: Vector3, c: Vector3) 🔗
测试线段(from
,to
)是否与三角形 a
、b
、c
相交。如果相交,则将交点作为 Vector3 返回。如果不相交,则返回 null
。
PackedInt32Array tetrahedralize_delaunay(points: PackedVector3Array) 🔗
对 3D 空间中由离散的 points
集指定的区域进行四面体化,确保没有点位于任何生成的四面体的外接球内。该方法返回一个 PackedInt32Array,其中每个四面体由 points
中的四个连续点的索引组成(即返回的数组将具有 n * 4
个元素,其中 n
是找到的四面体的数量)。如果四面体化没有成功,则返回一个空的 PackedInt32Array。