Raycaster.html 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <base href="../../../" />
  6. <script src="list.js"></script>
  7. <script src="page.js"></script>
  8. <link type="text/css" rel="stylesheet" href="page.css" />
  9. </head>
  10. <body>
  11. <h1>[name]</h1>
  12. <p class="desc">
  13. 该类被设计为 [link:https://en.wikipedia.org/wiki/Ray_casting raycasting] 类的帮助类。射线检测用于帮助判断用户鼠标
  14. 在3D空间内选择的物体具体是哪个。(通过检测从摄像机到视锥近平面上鼠标点连线发出的射线,位于3D空间内哪个物体上,从而判断当前
  15. 用户的选择)。
  16. </p>
  17. <h2>示例</h2>
  18. <code>
  19. var raycaster = new THREE.Raycaster();
  20. var mouse = new THREE.Vector2();
  21. function onMouseMove( event ) {
  22. // 将鼠标位置归一化为设备坐标。x 和 y 方向的取值范围是 (-1 to +1)
  23. mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
  24. mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
  25. }
  26. function render() {
  27. // 通过摄像机和鼠标位置更新射线
  28. raycaster.setFromCamera( mouse, camera );
  29. // 计算物体和射线的焦点
  30. var intersects = raycaster.intersectObjects( scene.children );
  31. for ( var i = 0; i < intersects.length; i++ ) {
  32. intersects[ i ].object.material.color.set( 0xff0000 );
  33. }
  34. renderer.render( scene, camera );
  35. }
  36. window.addEventListener( 'mousemove', onMouseMove, false );
  37. window.requestAnimationFrame(render);
  38. </code>
  39. <div>
  40. Examples: [example:webgl_interactive_cubes Raycasting to a Mesh]<br />
  41. [example:webgl_interactive_cubes_ortho Raycasting to a Mesh in using an OrthographicCamera]<br />
  42. [example:webgl_interactive_buffergeometry Raycasting to a Mesh with BufferGeometry]<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_octree_raycasting Raycasting using an octree]<br />
  47. [example:webgl_interactive_voxelpainter Raycasting to paint voxels]<br />
  48. [example:webgl_raycast_texture Raycast to a Texture]
  49. </div>
  50. <p>
  51. </p>
  52. <h2>构造函数</h2>
  53. <h3>[name]( [param:Vector3 origin], [param:Vector3 direction], [param:Float near], [param:Float far] ) {</h3>
  54. <p>
  55. [page:Vector3 origin] — The origin vector where the ray casts from.<br />
  56. [page:Vector3 direction] — The direction vector that gives direction to the ray. Should be normalized.<br />
  57. [page:Float near] — All results returned are further away than near. Near can't be negative. Default value is 0.<br />
  58. [page:Float far] — All results returned are closer than far. Far can't be lower than near. Default value is Infinity.
  59. </p>
  60. <p>
  61. 该方法构造一个新的射线对象。<br />
  62. </p>
  63. <h2>属性</h2>
  64. <h3>[property:float far]</h3>
  65. <p>
  66. 射线的 far 参数。该参数决定射线最远可达范围,超过 far 的物体在检测时可以忽略。
  67. 该值不能为负,且应该大于 near 参数。
  68. </p>
  69. <h3>[property:float linePrecision]</h3>
  70. <p>
  71. 当与物体焦时,射线当精确度。
  72. </p>
  73. <h3>[property:float near]</h3>
  74. <p>
  75. 射线的 near 参数。该参数决定射线的最近距离,近于 near 的物体在检测时可以忽略。
  76. 该值不能为负,且应该小于 far 参数。
  77. </p>
  78. <h3>[property:Object params]</h3>
  79. <p>
  80. 该对象拥有如下属性:
  81. <code>
  82. {
  83. Mesh: {},
  84. Line: {},
  85. LOD: {},
  86. Points: { threshold: 1 },
  87. Sprite: {}
  88. }
  89. </code>
  90. </p>
  91. <h3>[property:Ray ray]</h3>
  92. <p> 射线检测时用到的 [Page:Ray]。</p>
  93. <h2>方法</h2>
  94. <h3>[method:null set]( [param:Vector3 origin], [param:Vector3 direction] )</h3>
  95. <p>
  96. [page:Vector3 origin] — 射线的起点坐标。<br />
  97. [page:Vector3 direction] — 射线的方向向量,该向量需要被归一化。
  98. </p>
  99. <p>
  100. 用参数规定的原点和方向更新射线数据。
  101. </p>
  102. <h3>[method:null setFromCamera]( [param:Vector2 coords], [param:Camera camera] )</h3>
  103. <p>
  104. [page:Vector2 coords] — 鼠标的被归一化的 2D 坐标(Normalized Device Coordinate)。X 和 Y 的值都应该components should be between -1 and 1。<br />
  105. [page:Camera camera] — 射线应该以哪个摄像机作为原点。
  106. </p>
  107. <p>
  108. 用参数规定的新原点和方向更新射线数据。
  109. </p>
  110. <h3>[method:Array intersectObject]( [param:Object3D object], [param:Boolean recursive], [param:Array optionalTarget] )</h3>
  111. <p>
  112. [page:Object3D object] — 用于检测与射线焦的物体。<br />
  113. [page:Boolean recursive] — 如果设置为 true, 该方法同样检测所有的子对象与射线的相焦情况。否则,值检测参数指定的物体。默认值为 false。<br />
  114. [page:Array optionalTarget] — (可选) 结果存储到指定对象。否则,一个新的队列 [page:Array] 将会被实例化。如果设置了该值, 在调用该函数前,需要清空队列(例如, array.length = 0;)。
  115. </p>
  116. <p>
  117. 检查对象和射线的所有焦点,如果 recursive 设置为 true,同样检查子对象。焦点结果被保存在队列中,按照焦点的距离排序,最近结果最先返回。
  118. </p>
  119. <code>
  120. [ { distance, point, face, faceIndex, object }, ... ]
  121. </code>
  122. <p>
  123. [page:Float distance] – 射线原点到焦点的距离<br />
  124. [page:Vector3 point] – 世界坐标下的焦点位置<br />
  125. [page:Face3 face] – 与射线相交的位置<br />
  126. [page:Integer faceIndex] – 与射线相交的面的索引<br />
  127. [page:Object3D object] – 与射线相交的对象<br />
  128. [page:Vector2 uv] - 与射线相交点的物体的 U,V 坐标
  129. </p>
  130. <p>
  131. *Raycaster* 当计算射线是否与对象相交时,会代理到对象的 [page:Object3D.raycast raycast] 方法。该方法允许 [page:Mesh meshes] 对射线检测的响应与 [page:Line lines] 和 [page:Points pointclouds] 不同。
  132. </p>
  133. <p>
  134. *Note* 对于被检测的 mesh 的面,其必须朝向 检测射线 [page:.ray ray] 的原点, 否则该面会被忽略。如果想要射线检测到 mesh 中朝向原点和背向原点的面,你需要设置 [page:Mesh.material material] 的 [page:Material.side side] 属性为 *THREE.DoubleSide*。
  135. </p>
  136. <h3>[method:Array intersectObjects]( [param:Array objects], [param:Boolean recursive], [param:Array optionalTarget] )</h3>
  137. <p>
  138. [page:Array objects] — 需要被检测是否与射线碰撞的物体的队列<br />
  139. [page:Boolean recursive] — 如果为 true, 检测时除指定对象外,也会递归检测所有子对象。 默认值为 false。<br />
  140. [page:Array optionalTarget] — (可选)结果存储到指定对象。否则,一个新的队列 [page:Array] 将会被实例化。如果设置了该值, 在调用该函数前,需要清空队列(例如, array.length = 0;)。
  141. </p>
  142. <p>
  143. 检查参数队列中的所有对象和当前射线的所有焦点,如果 recursive 设置为 true,同样检查子对象。焦点结果被保存在队列中,按照焦点的距离排序,最近结果最先返回。
  144. </p>
  145. <h2>资源</h2>
  146. [link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
  147. </body>
  148. </html>