three.js ConvexHull

2023-02-16 17:51 更新

一個凸包類。由 Dirk Gregorius 實施 Quickhull 算法。 2014 年 3 月,游戲開發(fā)者大會:Implementing QuickHull.

構(gòu)造函數(shù)

ConvexHull()

創(chuàng)建一個新的 ConvexHull 實例。

屬性

.assigned : VertexList

此頂點列表包含分配給面的所有頂點。默認是一個空的頂點列表。

.faces : Array

凸包的生成面。默認為空數(shù)組。

.newFaces : Array

該數(shù)組保存單次迭代中生成的面孔。默認為空數(shù)組。

.tolerance : Float

用于內(nèi)部比較操作的 epsilon 值。該值的計算取決于幾何體的大小。默認為 -1。

.unassigned : VertexList

此頂點列表包含所有未分配給面的頂點。默認是一個空的頂點列表。

.vertices : Array

給定幾何數(shù)據(jù)(頂點數(shù)組)的內(nèi)部表示。

方法

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

eyeVertex - 添加到船體的頂點。

horizonEdge - 地平線的單一邊緣。

按照 CCW 順序創(chuàng)建一個頂點為“eyeVertex.point”、“horizo??nEdge.tail”和“horizo??nEdge.head”的面。所有半邊都是按 CCW 順序創(chuàng)建的,因此面始終指向船體外部

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

eyeVertex - 添加到船體的頂點。

horizon - 形成地平線的一組半邊。

向船體添加“horizo??n.length”面,每個面都將與地平線相對的面和左側(cè)/右側(cè)的面鏈接。

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

vertex - 要添加的頂點。

face - 目標面。

將頂點添加到“已分配”頂點列表并將其分配給給定的面。

.addVertexToHull ( eyeVertex : VertexNode ) : this

eyeVertex - 添加到船體的頂點。

使用以下算法將頂點添加到船體

  • 計算“地平線”,它是一連串的半邊。對于屬于該組的邊,它必須是連接可以看到“eyeVertex”的面和看不到“eyeVertex”的面的邊。

  • 所有可以看到“eyeVertex”的面都將其可見頂點從分配的頂點列表中刪除。

  • 使用“地平線”和“eyeVertex”的每條邊創(chuàng)建一組新面孔。每個面都與相對的地平線面和左/右面相連。

  • 如果可能,將從所有可見面中移除的頂點分配給新面。

.cleanup () : this

在計算凸包后清理內(nèi)部屬性。

.compute () : this

開始執(zhí)行快速外殼算法。

.computeExtremes () : Object

計算將用于計算初始外殼的極值(最小/最大向量)。

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

eyePoint - 點的 3D 坐標。

crossEdge - 用于跳轉(zhuǎn)到當前面的邊。

face - 當前正在測試的人臉。

horizon - 按 CCW 順序構(gòu)成地平線一部分的邊。

計算 CCW 順序的半邊鏈,稱為“地平線”。對于要成為地平線一部分的邊緣,它必須連接可以看到“eyePoint”的面和看不到“eyePoint”的面。

.computeInitialHull () : this

計算初始單純形,將所有候選點分配給其面,以形成船體的一部分。

.containsPoint ( point : Vector3 ) : this

point - 3D 空間中的一個點。

如果給定點在此凸包內(nèi),則返回 true。

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

face - 給定的臉。

absorbingFace - 嘗試吸收第一個面的頂點的可選面。

刪除“臉”能夠看到的所有可見頂點。

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

  • 如果 'absorbingFace' 存在,則此方法將分配可以看到 'absorbingFace' 的 'face' 的所有頂點。

  • 如果頂點看不到“absorbingFace”,它會被添加到“未分配”頂點列表中。

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

ray - 給定的射線。

target - 表示交點的目標向量。

使用此凸包執(zhí)行射線相交測試。如果未找到交集,則返回 null。

.intersectsRay ( ray : Ray ) : Boolean

ray - 給定的射線。

如果給定射線與此凸包相交,則返回 true。

.makeEmpty () : this

使這個凸包為空。

.nextVertexToAdd () : VertexNode

查找下一個頂點以使用當前外殼創(chuàng)建面。

  • 讓初始面成為“已分配”頂點列表中存在的第一個面。

  • 如果面不存在則返回,因為沒有剩余的頂點。

  • 否則,對于面看到的每個頂點,找到離它最遠的那個。

.reindexFaces () : this

從內(nèi)部面孔列表中刪除不活動(例如已刪除)的面孔。

.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 數(shù)組。

計算給定點數(shù)組的凸包。

源碼

examples/jsm/math/ConvexHull.js


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號