Raycaster.html 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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. 这个类用于进行[link:https://en.wikipedia.org/wiki/Ray_casting raycasting](光线投射)。
  13. 光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体)。
  14. </p>
  15. <h2>代码示例</h2>
  16. <code>
  17. const raycaster = new THREE.Raycaster();
  18. const pointer = new THREE.Vector2();
  19. function onPointerMove( event ) {
  20. // 将鼠标位置归一化为设备坐标。x 和 y 方向的取值范围是 (-1 to +1)
  21. pointer.x = ( event.clientX / window.innerWidth ) * 2 - 1;
  22. pointer.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
  23. }
  24. function render() {
  25. // 通过摄像机和鼠标位置更新射线
  26. raycaster.setFromCamera( pointer, camera );
  27. // 计算物体和射线的焦点
  28. const intersects = raycaster.intersectObjects( scene.children );
  29. for ( let i = 0; i < intersects.length; i ++ ) {
  30. intersects[ i ].object.material.color.set( 0xff0000 );
  31. }
  32. renderer.render( scene, camera );
  33. }
  34. window.addEventListener( 'pointermove', onPointerMove );
  35. window.requestAnimationFrame(render);
  36. </code>
  37. <h2>例子</h2>
  38. <p>
  39. [example:webgl_interactive_cubes Raycasting to a Mesh]<br />
  40. [example:webgl_interactive_cubes_ortho Raycasting to a Mesh in using an OrthographicCamera]<br />
  41. [example:webgl_interactive_buffergeometry Raycasting to a Mesh with BufferGeometry]<br />
  42. [example:webgl_instancing_raycast Raycasting to a InstancedMesh]<br />
  43. [example:webgl_interactive_lines Raycasting to a Line]<br />
  44. [example:webgl_interactive_raycasting_points Raycasting to Points]<br />
  45. [example:webgl_geometry_terrain_raycast Terrain raycasting]<br />
  46. [example:webgl_interactive_voxelpainter Raycasting to paint voxels]<br />
  47. [example:webgl_raycaster_texture Raycast to a Texture]
  48. </p>
  49. <p>
  50. </p>
  51. <h2>构造器</h2>
  52. <h3>[name]( [param:Vector3 origin], [param:Vector3 direction], [param:Float near], [param:Float far] )</h3>
  53. <p>
  54. [page:Vector3 origin] —— 光线投射的原点向量。<br />
  55. [page:Vector3 direction] —— 向射线提供方向的方向向量,应当被标准化。<br />
  56. [page:Float near] —— 返回的所有结果比near远。near不能为负值,其默认值为0。<br />
  57. [page:Float far] —— 返回的所有结果都比far近。far不能小于near,其默认值为Infinity(正无穷。)</p>
  58. <p>
  59. 这将创建一个新的raycaster对象。<br />
  60. </p>
  61. <h2>属性</h2>
  62. <h3>[property:Float far]</h3>
  63. <p>
  64. raycaster的远距离因数(投射远点)。这个值表明哪些对象可以基于该距离而被raycaster所丢弃。
  65. 这个值不应当为负,并且应当比near属性大。
  66. </p>
  67. <h3>[property:Float near]</h3>
  68. <p>
  69. raycaster的近距离因数(投射近点)。这个值表明哪些对象可以基于该距离而被raycaster所丢弃。
  70. 这个值不应当为负,并且应当比far属性小。
  71. </p>
  72. <h3>[property:Camera camera]</h3>
  73. <p>
  74. The camera to use when raycasting against view-dependent objects such as billboarded objects like [page:Sprites]. This field
  75. can be set manually or is set when calling "setFromCamera".
  76. Defaults to null.
  77. </p>
  78. <h3>[property:Layers layers]</h3>
  79. <p>
  80. Used by [name] to selectively ignore 3D objects when performing intersection tests. The following code example ensures that
  81. only 3D objects on layer *1* will be honored by the instance of [name].
  82. <code>
  83. raycaster.layers.set( 1 );
  84. object.layers.enable( 1 );
  85. </code>
  86. </p>
  87. <h3>[property:Object params]</h3>
  88. <p>
  89. 具有以下属性的对象:
  90. <code>
  91. {
  92. Mesh: {},
  93. Line: { threshold: 1 },
  94. LOD: {},
  95. Points: { threshold: 1 },
  96. Sprite: {}
  97. }
  98. </code>
  99. Where threshold is the precision of the raycaster when intersecting objects, in world units.
  100. </p>
  101. <h3>[property:Ray ray]</h3>
  102. <p>用于进行光线投射的[Page:Ray](射线)。</p>
  103. <h2>方法</h2>
  104. <h3>[method:undefined set]( [param:Vector3 origin], [param:Vector3 direction] )</h3>
  105. <p>
  106. [page:Vector3 origin] —— 光线投射的原点向量。<br />
  107. [page:Vector3 direction] —— 为光线提供方向的标准化方向向量。
  108. </p>
  109. <p>
  110. 使用一个新的原点和方向来更新射线。
  111. </p>
  112. <h3>[method:undefined setFromCamera]( [param:Vector2 coords], [param:Camera camera] )</h3>
  113. <p>
  114. [page:Vector2 coords] —— 在标准化设备坐标中鼠标的二维坐标 —— X分量与Y分量应当在-1到1之间。<br />
  115. [page:Camera camera] —— 射线所来源的摄像机。
  116. </p>
  117. <p>
  118. 使用一个新的原点和方向来更新射线。
  119. </p>
  120. <h3>[method:this setFromXRController]( [param:WebXRController controller] )</h3>
  121. <p>
  122. [page:WebXRController controller] — The controller to copy the position and direction from.
  123. </p>
  124. <p>Updates the ray with a new origin and direction.</p>
  125. <h3>[method:Array intersectObject]( [param:Object3D object], [param:Boolean recursive], [param:Array optionalTarget] )</h3>
  126. <p>
  127. [page:Object3D object] —— 检查与射线相交的物体。<br />
  128. [page:Boolean recursive] —— 若为true,则同时也会检查所有的后代。否则将只会检查对象本身。默认值为true。<br />
  129. [page:Array optionalTarget] — (可选)设置结果的目标数组。如果不设置这个值,则一个新的[page:Array]会被实例化;如果设置了这个值,则在每次调用之前必须清空这个数组(例如:array.length = 0;)。
  130. </p>
  131. <p>
  132. 检测所有在射线与物体之间,包括或不包括后代的相交部分。返回结果时,相交部分将按距离进行排序,最近的位于第一个。<br>
  133. 该方法返回一个包含有交叉部分的数组:
  134. </p>
  135. <code>
  136. [ { distance, point, face, faceIndex, object }, ... ]
  137. </code>
  138. <p>
  139. [page:Float distance] —— 射线投射原点和相交部分之间的距离。<br />
  140. [page:Vector3 point] —— 相交部分的点(世界坐标)<br />
  141. [page:Object face] —— 相交的面<br />
  142. [page:Integer faceIndex] —— 相交的面的索引<br />
  143. [page:Object3D object] —— 相交的物体<br />
  144. [page:Vector2 uv] —— 相交部分的点的UV坐标。<br />
  145. [page:Vector2 uv1] —— 相交部分的点的第二组UV坐标<br />
  146. [page:Vector3 normal] - 交点处的内插法向量<br />
  147. [page:Integer instanceId] – 与InstancedMesh物体相交时的instance索引
  148. </p>
  149. <p>
  150. 当计算这条射线是否和物体相交的时候,*Raycaster*将传入的对象委托给[page:Object3D.raycast raycast]方法。
  151. 这将可以让[page:Mesh mesh]对于光线投射的响应不同于[page:Line lines]和[page:Points pointclouds]。
  152. </p>
  153. <p>
  154. <strong>请注意</strong>:对于网格来说,面必须朝向射线的原点,以便其能够被检测到。
  155. 用于交互的射线穿过面的背侧时,将不会被检测到。如果需要对物体中面的两侧进行光线投射,
  156. 你需要将[page:Mesh.material material]中的[page:Material.side side]属性设置为*THREE.DoubleSide*。
  157. </p>
  158. <h3>[method:Array intersectObjects]( [param:Array objects], [param:Boolean recursive], [param:Array optionalTarget] )</h3>
  159. <p>
  160. [page:Array objects] —— 检测和射线相交的一组物体。<br />
  161. [page:Boolean recursive] —— 若为true,则同时也会检测所有物体的后代。否则将只会检测对象本身的相交部分。默认值为true。<br />
  162. [page:Array optionalTarget] —— (可选)设置结果的目标数组。如果不设置这个值,则一个新的[page:Array]会被实例化;如果设置了这个值,则在每次调用之前必须清空这个数组(例如:array.length = 0;)。
  163. </p>
  164. <p>
  165. 检测所有在射线与这些物体之间,包括或不包括后代的相交部分。返回结果时,相交部分将按距离进行排序,最近的位于第一个),相交部分和[page:.intersectObject]所返回的格式是相同的。
  166. </p>
  167. <h2>源代码</h2>
  168. <p>
  169. [link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
  170. </p>
  171. </body>
  172. </html>