three.js ConvexHull
一个凸包类。由 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”、“horizonEdge.tail”和“horizonEdge.head”的面。所有半边都是按 CCW 顺序创建的,因此面始终指向船体外部
.addNewFaces ( eyeVertex : VertexNode, horizonEdge : HalfEdge ) : this
eyeVertex - 添加到船体的顶点。
horizon - 形成地平线的一组半边。
向船体添加“horizon.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
更多建议: