1
0

ConvexHull.html 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="utf-8" />
  5. <base href="../../../../" />
  6. <script src="page.js"></script>
  7. <link type="text/css" rel="stylesheet" href="page.css" />
  8. </head>
  9. <body>
  10. <h1>凸包([name])</h1>
  11. <p class="desc">
  12. 凸包类。Quickhull 算法的实现者: Dirk Gregorius。2014 年 3 月,游戏开发者大会:
  13. [link:http://media.steampowered.com/apps/valve/2014/DirkGregorius_ImplementingQuickHull.pdf Implementing QuickHull]
  14. </p>
  15. <h2>导入</h2>
  16. <p>
  17. [name] 是一个附加组件,必须显式导入。请参阅 [link:#manual/introduction/Installation Installation / Addons].
  18. </p>
  19. <code>
  20. import { ConvexHull } from 'three/addons/math/ConvexHull.js';
  21. </code>
  22. <h2>构造函数</h2>
  23. <h3>[name]()</h3>
  24. <p>
  25. 创建一个 [name] 实例。
  26. </p>
  27. <h2>属性</h2>
  28. <h3>[property:VertexList assigned]</h3>
  29. <p>
  30. 该 [page:VertexList vertex list] 包含分配给面的所有顶点。默认是一个空的顶点列表。
  31. </p>
  32. <h3>[property:Array faces]</h3>
  33. <p>
  34. 生成的凸包面。默认是一个空数组。
  35. </p>
  36. <h3>[property:Array newFaces]</h3>
  37. <p>
  38. 该数组保存在单次迭代中生成的面。默认是一个空数组。
  39. </p>
  40. <h3>[property:Float tolerance]</h3>
  41. <p>
  42. 用于内部比较运算的 epsilon 值。该值的计算取决于几何形状的大小。默认值为 -1。
  43. </p>
  44. <h3>[property:VertexList unassigned]</h3>
  45. <p>
  46. 该 [page:VertexList vertex list] 包含未分配给面的所有顶点。默认是一个空的顶点列表。
  47. </p>
  48. <h3>[property:Array vertices]</h3>
  49. <p>
  50. 给定几何数据的内部表示( [page:VertexNode vertices] 数组)。
  51. </p>
  52. <h2>方法</h2>
  53. <h3>[method:HalfEdge addAdjoiningFace]( [param:VertexNode eyeVertex], [param:HalfEdge horizonEdge] )</h3>
  54. <p>
  55. [page:VertexNode eyeVertex] - 添加到凸包的顶点。<br />
  56. [page:HalfEdge horizonEdge] - 地平线的单个边缘。<br /><br />
  57. 创建一个面,顶点顺序为 'eyeVertex.point'、'horizonEdge.tail' 和 'horizonEdge.head',顺序为逆时针(CCW)。所有半边按照逆时针顺序创建,因此该面始终指向凸包的外部。
  58. </p>
  59. <h3>[method:this addNewFaces]( [param:VertexNode eyeVertex], [param:HalfEdge horizonEdge] )</h3>
  60. <p>
  61. [page:VertexNode eyeVertex] - 添加到凸包的顶点。<br />
  62. [page:HalfEdge horizon] - 形成地平线的半边数组。<br /><br />
  63. 将 'horizon.length' 个面添加到凸包,每个面将与地平线上的相对面以及左/右相邻的面连接。
  64. </p>
  65. <h3>[method:this addVertexToFace]( [param:VertexNode vertex], [param:Face face] )</h3>
  66. <p>
  67. [page:VertexNodeNode vertex] - 要添加的顶点。<br />
  68. [page:Face face] - 目标面。<br /><br />
  69. 将一个顶点添加到 “分配(assigned)” 顶点列表,并将其分配给给定的面。
  70. </p>
  71. <h3>[method:this addVertexToHull]( [param:VertexNode eyeVertex] )</h3>
  72. <p>
  73. [page:VertexNode eyeVertex] - 添加到凸包的顶点。<br /><br />
  74. 使用以下算法向凸包添加顶点:
  75. <ul>
  76. <li>计算“地平线”,这是一系列半边。要使一条边属于这个组,它必须是连接一个能够看到 'eyeVertex' 的面和一个不能看到 'eyeVertex' 的面的边。</li>
  77. <li>所有能够看到 'eyeVertex' 的面都会从已分配顶点列表中移除其可见的顶点。</li>
  78. <li>使用“地平线”和 'eyeVertex' 的每条边创建一组新的面。每个面都与相对的地平线面以及左/右相邻的面连接。</li>
  79. <li>从所有可见面中移除的顶点将被分配给新的面,如果可能的话。</li>
  80. </ul>
  81. </p>
  82. <h3>[method:this cleanup]()</h3>
  83. <p>计算凸包后清理内部属性。</p>
  84. <h3>[method:this compute]()</h3>
  85. <p>开始执行快速凸包算法。</p>
  86. <h3>[method:Object computeExtremes]()</h3>
  87. <p>计算将用于计算初始凸包的极值(最小/最大向量)。</p>
  88. <h3>[method:this computeHorizon]( [param:Vector3 eyePoint], [param:HalfEdge crossEdge], [param:Face face],
  89. [param:Array horizon] )</h3>
  90. <p>
  91. [page:Vector3 eyePoint] - 点的 3D 坐标。<br />
  92. [page:HalfEdge crossEdge] - 用于跳转到当前面的边。<br />
  93. [page:Face face] - 当前正在测试的面。<br />
  94. [page:Array horizon] - 按 CCW 顺序构成地平线一部分的边。<br /><br />
  95. 计算一个逆时针(CCW)顺序的半边链,称为“地平线”('horizon')。要使一条边成为地平线的一部分,它必须连接一个能够看到 'eyePoint' 的面和一个不能看到 'eyePoint' 的面。
  96. </p>
  97. <h3>[method:this computeInitialHull]()</h3>
  98. <p>计算初始的单纯形,将所有可能成为凸包一部分的点分配给其面。
  99. </p>
  100. <h3>[method:this containsPoint]( [param:Vector3 point] )</h3>
  101. <p>
  102. [page:Vector3 point] - 3D 空间中的一个点。<br /><br />
  103. 返回 `true` 如果定点在此凸包内。
  104. </p>
  105. <h3>[method:this deleteFaceVertices]( [param:Face face], [param:Face absorbingFace] )</h3>
  106. <p>
  107. [page:Face face] - 给定的面。<br />
  108. [page:Face absorbingFace] - 尝试吸收第一个面的顶点的可选面。<br /><br />
  109. 删除 “面(face)” 能够看到的所有可见顶点。
  110. <ul>
  111. <li>如果 'absorbingFace' 不存在,则所有已移除的顶点将被添加到 'unassigned' 顶点列表。
  112. </li>
  113. <li>如果 'absorbingFace' 存在,则该方法将分配所有 'face' 中可以看到 'absorbingFace' 的顶点。
  114. </li>
  115. <li>如果一个顶点不能看到 'absorbingFace',则将其添加到 'unassigned' 顶点列表。</li>
  116. </ul>
  117. </p>
  118. <h3>[method:Vector3 intersectRay]( [param:Ray ray], [param:Vector3 target] )</h3>
  119. <p>
  120. [page:Ray ray] - 给定的射线。<br />
  121. [page:Vector3 target] - 表示交点的目标向量。<br /><br />
  122. 与该凸包执行光线相交测试。如果没有找到交集则返回 `null`。
  123. </p>
  124. <h3>[method:Boolean intersectsRay]( [param:Ray ray] )</h3>
  125. <p>
  126. [page:Ray ray] - 给定的射线。<br /><br />
  127. 返回给的射线是否与此凸包相交,如果相交则返回 `true`。
  128. </p>
  129. <h3>[method:this makeEmpty]()</h3>
  130. <p>使这个凸包为空。</p>
  131. <h3>[method:VertexNode nextVertexToAdd]()</h3>
  132. <p>查找下一个顶点以使用当前凸包创建面。
  133. <ul>
  134. <li>让初始面成为存在于“已分配(assigned)”顶点列表中的第一个面。</li>
  135. <li>如果面不存在则返回,因为没有顶点剩下。</li>
  136. <li>否则,对于面能看到的每个顶点,找到距离它最远的那个。</li>
  137. </ul>
  138. </p>
  139. <h3>[method:this reindexFaces]()</h3>
  140. <p>从内部面列表中移除不活跃的(例如已删除的)面。</p>
  141. <h3>[method:VertexNode removeAllVerticesFromFace]( [param:Face face] )</h3>
  142. <p>
  143. [page:Face face] - 给定的面。<br /><br />
  144. 移除给定面能够看到的所有可见顶点,这些顶点存储在“已分配(assigned)”顶点列表中。
  145. </p>
  146. <h3>[method:this removeVertexFromFace]( [param:VertexNode vertex], [param:Face face] )</h3>
  147. <p>
  148. [page:VertexNode vertex] - 要删除的顶点。<br />
  149. [page:Face face] - 目标面。<br /><br />
  150. 从“已分配”顶点列表和给定面中移除一个顶点。在移除后,它还确保从“面”到它在“已分配”中看到的第一个顶点的链接被正确连接。
  151. </p>
  152. <h3>[method:this resolveUnassignedPoints]( [param:Array newFaces] )</h3>
  153. <p>
  154. [page:Face newFaces] - 一组新的面。<br /><br />
  155. 尽可能从未分配的顶点列表中重新分配顶点给新的面。
  156. </p>
  157. <h3>[method:this setFromObject]( [param:Object3D object] )</h3>
  158. <p>
  159. [page:Object3D object] - 用于计算凸包的 [page:Object3D]<br /><br />
  160. 计算 [page:Object3D] 的凸包(包括其子元素),考虑到对象及其子元素的世界变换。
  161. </p>
  162. <h3>[method:this setFromPoints]( [param:Array points] )</h3>
  163. <p>
  164. [page:Array points] - 生成的凸包将包含的 [page:Vector3 Vector3s] 数组<br /><br />
  165. 计算给定点数组的凸包。
  166. </p>
  167. <h2>源代码</h2>
  168. <p>
  169. [link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/math/ConvexHull.js examples/jsm/math/ConvexHull.js]
  170. </p>
  171. </body>
  172. </html>