Geometry3D
Наследует: Object
Предоставляет методы для некоторых распространенных трехмерных геометрических операций.
Описание
Предоставляет набор вспомогательных функций для создания геометрических фигур, вычисления пересечений между фигурами и обработки различных других геометрических операций в 3D.
Методы
Описания метода
Array[Plane] build_box_planes(extents: Vector3) 🔗
Возвращает массив с 6 Plane, которые описывают стороны коробки с центром в начале координат. Размер коробки определяется extends, который представляет один (положительный) угол коробки (т. е. половину ее фактического размера).
Array[Plane] build_capsule_planes(radius: float, height: float, sides: int, lats: int, axis: Axis = 2) 🔗
Возвращает массив Plane, тесно ограничивающих граненую капсулу с центром в начале координат с радиусом radius и высотой height. Параметр sides определяет, сколько плоскостей будет сгенерировано для боковой части капсулы, тогда как lats задает количество широтных шагов внизу и вверху капсулы. Параметр axis описывает ось, вдоль которой ориентирована капсула (0 для X, 1 для Y, 2 для Z).
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) 🔗
Возвращает 3D-точку на 3D-сегменте (s1, s2), которая находится ближе всего к point. Возвращаемая точка всегда будет находиться внутри указанного сегмента.
Vector3 get_closest_point_to_segment_uncapped(point: Vector3, s1: Vector3, s2: Vector3) 🔗
Возвращает 3D-точку на 3D-линии, определенной (s1, s2), которая находится ближе всего к point. Возвращаемая точка может находиться внутри сегмента (s1, s2) или за его пределами, т. е. где-то на линии, выходящей из сегмента.
PackedVector3Array get_closest_points_between_segments(p1: Vector3, p2: Vector3, q1: Vector3, q2: Vector3) 🔗
Учитывая два 3D-сегмента (p1, p2) и (q1, q2), находит те две точки на двух сегментах, которые находятся ближе всего друг к другу. Возвращает PackedVector3Array, который содержит эту точку на (p1, p2), а также сопутствующую точку на (q1, 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) 🔗
Проверяет, пересекает ли 3D-луч, начинающийся в from с направлением dir, с треугольником, заданным a, b и c. Если да, возвращает точку пересечения как Vector3. Если пересечения не происходит, возвращает null.
PackedVector3Array segment_intersects_convex(from: Vector3, to: Vector3, planes: Array[Plane]) 🔗
Учитывая выпуклую оболочку, определенную через Plane-ы в массиве planes, проверяет, пересекается ли сегмент (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) сферу, расположенную в spheric_position и имеющую радиус spheric_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) 🔗
Тетраэдрализует объем, заданный дискретным набором points в трехмерном пространстве, гарантируя, что ни одна точка не лежит внутри описанной сферы любого полученного тетраэдра. Метод возвращает PackedInt32Array, где каждый тетраэдр состоит из четырех последовательных индексов точек в массиве points (что приводит к массиву с n * 4 элементами, где n — количество найденных тетраэдров). Если тетраэдрализация не удалась, возвращается пустой PackedInt32Array.