Geometry3D

继承: Object

为一些常见的3D几何操作提供方法。

描述

提供一组辅助函数来创建几何形态、计算形状之间的交叉点以及处理3D中的各种其他几何操作。

方法


方法说明

Array[Plane] build_box_planes(extents: Vector3) 🔗

返回一个包含6个Plane的数组,该数组描述以原点为中心的盒子的侧面。盒子大小由extents定义,它表示盒子的一个(正)角(即其实际大小的一半)。


Array[Plane] build_capsule_planes(radius: float, height: float, sides: int, lats: int, axis: Axis = 2) 🔗

返回以半径radius和高度height为中心的刻面胶囊紧密包围的Plane数组。参数sides定义胶囊侧面部分将生成多少个平面,而lats给出胶囊底部和顶部的纬度步数。参数axis描述胶囊定向的轴(X为0,Y为1,Z为2)。


Array[Plane] build_cylinder_planes(radius: float, height: float, sides: int, axis: Axis = 2) 🔗

返回一个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) 🔗

返回最接近point的3D段(s1s2)上的3D点。返回的点将始终在指定的段内。


Vector3 get_closest_point_to_segment_uncapped(point: Vector3, s1: Vector3, s2: Vector3) 🔗

返回由(s1s2)定义的最接近point的3D线上的3D点。返回的点可以在段(s1s2)内部,也可以在段外部,即在从段延伸的线上的某个地方。


PackedVector3Array get_closest_points_between_segments(p1: Vector3, p2: Vector3, q1: Vector3, q2: Vector3) 🔗

给定两个3D段(p1p2)和(q1q2),找到两个段上最接近的两个点。返回一个PackedVector3Array,其中包含(p1p2)上的这个点以及(q1q2)上的伴随点。


Vector3 get_triangle_barycentric_coords(point: Vector3, a: Vector3, b: Vector3, c: Vector3) 🔗

返回一个Vector3,其中包含基于3D位置(point)与三角形不同顶点(abc)的接近程度的权重。这对于在三角形中不同顶点的数据之间进行插值很有用。一个示例用例是使用它在网格上平滑旋转,而不是仅仅依赖面法线。

下面是重心坐标的更详细说明。


Variant ray_intersects_triangle(from: Vector3, dir: Vector3, a: Vector3, b: Vector3, c: Vector3) 🔗

测试从from开始,方向为dir的3D射线是否与abc指定的三角形相交。如果是,则返回交叉点为Vector3。如果没有发生交集,则返回null


PackedVector3Array segment_intersects_convex(from: Vector3, to: Vector3, planes: Array[Plane]) 🔗

给定一个通过数组planes中的Plane定义的凸包,测试段(fromto)是否与该外壳相交。如果找到交集,则返回一个PackedVector3Array,其中包含交叉点和外壳的法线。否则,返回一个空数组。


PackedVector3Array segment_intersects_cylinder(from: Vector3, to: Vector3, height: float, radius: float) 🔗

检查段(fromto)是否与圆柱体与以原点为中心并具有半径radius的高度height相交。如果否,则返回一个空的PackedVector3Array。如果发生交集,则返回的数组包含交叉点和圆柱体在交叉点的法线。


PackedVector3Array segment_intersects_sphere(from: Vector3, to: Vector3, sphere_position: Vector3, sphere_radius: float) 🔗

检查段(fromto)是否与位于sphere_position并具有半径sphere_radius的球体相交。如果否,则返回一个空的PackedVector3Array。如果是,则返回一个PackedVector3Array,其中包含交叉点和球体在交叉点的法线。


Variant segment_intersects_triangle(from: Vector3, to: Vector3, a: Vector3, b: Vector3, c: Vector3) 🔗

测试段(fromto)是否与三角形abc相交。如果是,则返回交叉点为Vector3。如果没有发生交集,则返回null


PackedInt32Array tetrahedralize_delaunay(points: PackedVector3Array) 🔗

将三维空间中由一组离散的points指定的体积四面体化,确保没有点位于任何生成的四面体的圆周内。该方法返回一个PackedInt32Array,其中每个四面体由points数组中的四个连续点索引组成(生成一个具有n*4元素的数组,其中n是找到的四面体的数量)。如果四面体化不成功,则返回一个空的PackedInt32Array