three.js ConvexHull

2023-02-16 17:51 更新

一个凸包类。由 Dirk Gregorius 实施 Quickhull 算法。 2014 年 3 月,游戏开发者大会:Implementing QuickHull.

构造函数

ConvexHull()

创建一个新的 ConvexHull 实例。

属性

.assigned : VertexList

此顶点列表包含分配给面的所有顶点。默认是一个空的顶点列表。

.faces : Array

凸包的生成面。默认为空数组。

.newFaces : Array

该数组保存单次迭代中生成的面孔。默认为空数组。

.tolerance : Float

用于内部比较操作的 epsilon 值。该值的计算取决于几何体的大小。默认为 -1。

.unassigned : VertexList

此顶点列表包含所有未分配给面的顶点。默认是一个空的顶点列表。

.vertices : Array

给定几何数据(顶点数组)的内部表示。

方法

.addAdjoiningFace ( eyeVertex : VertexNode, horizonEdge : HalfEdge ) : HalfEdge

eyeVertex - 添加到船体的顶点。

horizonEdge - 地平线的单一边缘。

按照 CCW 顺序创建一个顶点为“eyeVertex.point”、“horizo​​nEdge.tail”和“horizo​​nEdge.head”的面。所有半边都是按 CCW 顺序创建的,因此面始终指向船体外部

.addNewFaces ( eyeVertex : VertexNode, horizonEdge : HalfEdge ) : this

eyeVertex - 添加到船体的顶点。

horizon - 形成地平线的一组半边。

向船体添加“horizo​​n.length”面,每个面都将与地平线相对的面和左侧/右侧的面链接。

.addVertexToFace ( vertex : VertexNode, face : Face ) : this

vertex - 要添加的顶点。

face - 目标面。

将顶点添加到“已分配”顶点列表并将其分配给给定的面。

.addVertexToHull ( eyeVertex : VertexNode ) : this

eyeVertex - 添加到船体的顶点。

使用以下算法将顶点添加到船体

  • 计算“地平线”,它是一连串的半边。对于属于该组的边,它必须是连接可以看到“eyeVertex”的面和看不到“eyeVertex”的面的边。

  • 所有可以看到“eyeVertex”的面都将其可见顶点从分配的顶点列表中删除。

  • 使用“地平线”和“eyeVertex”的每条边创建一组新面孔。每个面都与相对的地平线面和左/右面相连。

  • 如果可能,将从所有可见面中移除的顶点分配给新面。

.cleanup () : this

在计算凸包后清理内部属性。

.compute () : this

开始执行快速外壳算法。

.computeExtremes () : Object

计算将用于计算初始外壳的极值(最小/最大向量)。

.computeHorizon ( eyePoint : Vector3, crossEdge : HalfEdge, face : Face, horizon : Array ) : this

eyePoint - 点的 3D 坐标。

crossEdge - 用于跳转到当前面的边。

face - 当前正在测试的人脸。

horizon - 按 CCW 顺序构成地平线一部分的边。

计算 CCW 顺序的半边链,称为“地平线”。对于要成为地平线一部分的边缘,它必须连接可以看到“eyePoint”的面和看不到“eyePoint”的面。

.computeInitialHull () : this

计算初始单纯形,将所有候选点分配给其面,以形成船体的一部分。

.containsPoint ( point : Vector3 ) : this

point - 3D 空间中的一个点。

如果给定点在此凸包内,则返回 true。

.deleteFaceVertices ( face : Face, absorbingFace : Face ) : this

face - 给定的脸。

absorbingFace - 尝试吸收第一个面的顶点的可选面。

删除“脸”能够看到的所有可见顶点。

  • 如果 'absorbingFace' 不存在,那么所有移除的顶点将被添加到 'unassigned' 顶点列表中。

  • 如果 'absorbingFace' 存在,则此方法将分配可以看到 'absorbingFace' 的 'face' 的所有顶点。

  • 如果顶点看不到“absorbingFace”,它会被添加到“未分配”顶点列表中。

.intersectRay ( ray : Ray, target : Vector3 ) : Vector3

ray - 给定的射线。

target - 表示交点的目标向量。

使用此凸包执行射线相交测试。如果未找到交集,则返回 null。

.intersectsRay ( ray : Ray ) : Boolean

ray - 给定的射线。

如果给定射线与此凸包相交,则返回 true。

.makeEmpty () : this

使这个凸包为空。

.nextVertexToAdd () : VertexNode

查找下一个顶点以使用当前外壳创建面。

  • 让初始面成为“已分配”顶点列表中存在的第一个面。

  • 如果面不存在则返回,因为没有剩余的顶点。

  • 否则,对于面看到的每个顶点,找到离它最远的那个。

.reindexFaces () : this

从内部面孔列表中删除不活动(例如已删除)的面孔。

.removeAllVerticesFromFace ( face : Face ) : VertexNode

face - 给定的脸。

删除给定面能够看到的所有可见顶点,这些顶点存储在“已分配”顶点列表中。

.removeVertexFromFace ( vertex : VertexNode, face : Face ) : this

vertex - 要移除的顶点。

face - 目标脸。

从“分配的”顶点列表和给定的面中删除一个顶点。它还确保从“面”到它在“已分配”中看到的第一个顶点的链接在删除后正确链接。

.resolveUnassignedPoints ( newFaces : Array ) : this

newFaces - 一系列新面孔。

将未分配列表中的尽可能多的顶点重新分配给新面。

.setFromObject ( object : Object3D ) : this

object - Object3D 来计算的凸包。

计算 Object3D(包括其子项)的凸包,考虑对象及其子项的世界变换。

.setFromPoints ( points : Array ) : this

points - 生成的凸包将包含的 Vector3 数组。

计算给定点数组的凸包。

源码

examples/jsm/math/ConvexHull.js


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号