该类被设计为 [link:https://en.wikipedia.org/wiki/Ray_casting raycasting] 类的帮助类。射线检测用于帮助判断用户鼠标 在3D空间内选择的物体具体是哪个。(通过检测从摄像机到视锥近平面上鼠标点连线发出的射线,位于3D空间内哪个物体上,从而判断当前 用户的选择)。
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
function onMouseMove( event ) {
// 将鼠标位置归一化为设备坐标。x 和 y 方向的取值范围是 (-1 to +1)
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
}
function render() {
// 通过摄像机和鼠标位置更新射线
raycaster.setFromCamera( mouse, camera );
// 计算物体和射线的焦点
var intersects = raycaster.intersectObjects( scene.children );
for ( var i = 0; i < intersects.length; i++ ) {
intersects[ i ].object.material.color.set( 0xff0000 );
}
renderer.render( scene, camera );
}
window.addEventListener( 'mousemove', onMouseMove, false );
window.requestAnimationFrame(render);
[page:Vector3 origin] — The origin vector where the ray casts from.
[page:Vector3 direction] — The direction vector that gives direction to the ray. Should be normalized.
[page:Float near] — All results returned are further away than near. Near can't be negative. Default value is 0.
[page:Float far] — All results returned are closer than far. Far can't be lower than near. Default value is Infinity.
该方法构造一个新的射线对象。
射线的 far 参数。该参数决定射线最远可达范围,超过 far 的物体在检测时可以忽略。 该值不能为负,且应该大于 near 参数。
当与物体焦时,射线当精确度。
射线的 near 参数。该参数决定射线的最近距离,近于 near 的物体在检测时可以忽略。 该值不能为负,且应该小于 far 参数。
该对象拥有如下属性:
{
Mesh: {},
Line: {},
LOD: {},
Points: { threshold: 1 },
Sprite: {}
}
射线检测时用到的 [Page:Ray]。
[page:Vector3 origin] — 射线的起点坐标。
[page:Vector3 direction] — 射线的方向向量,该向量需要被归一化。
用参数规定的原点和方向更新射线数据。
[page:Vector2 coords] — 鼠标的被归一化的 2D 坐标(Normalized Device Coordinate)。X 和 Y 的值都应该components should be between -1 and 1。
[page:Camera camera] — 射线应该以哪个摄像机作为原点。
用参数规定的新原点和方向更新射线数据。
[page:Object3D object] — 用于检测与射线焦的物体。
[page:Boolean recursive] — 如果设置为 true, 该方法同样检测所有的子对象与射线的相焦情况。否则,值检测参数指定的物体。默认值为 false。
[page:Array optionalTarget] — (可选) 结果存储到指定对象。否则,一个新的队列 [page:Array] 将会被实例化。如果设置了该值, 在调用该函数前,需要清空队列(例如, array.length = 0;)。
检查对象和射线的所有焦点,如果 recursive 设置为 true,同样检查子对象。焦点结果被保存在队列中,按照焦点的距离排序,最近结果最先返回。
[ { distance, point, face, faceIndex, object }, ... ]
[page:Float distance] – 射线原点到焦点的距离
[page:Vector3 point] – 世界坐标下的焦点位置
[page:Face3 face] – 与射线相交的位置
[page:Integer faceIndex] – 与射线相交的面的索引
[page:Object3D object] – 与射线相交的对象
[page:Vector2 uv] - 与射线相交点的物体的 U,V 坐标
*Raycaster* 当计算射线是否与对象相交时,会代理到对象的 [page:Object3D.raycast raycast] 方法。该方法允许 [page:Mesh meshes] 对射线检测的响应与 [page:Line lines] 和 [page:Points pointclouds] 不同。
*Note* 对于被检测的 mesh 的面,其必须朝向 检测射线 [page:.ray ray] 的原点, 否则该面会被忽略。如果想要射线检测到 mesh 中朝向原点和背向原点的面,你需要设置 [page:Mesh.material material] 的 [page:Material.side side] 属性为 *THREE.DoubleSide*。
[page:Array objects] — 需要被检测是否与射线碰撞的物体的队列
[page:Boolean recursive] — 如果为 true, 检测时除指定对象外,也会递归检测所有子对象。 默认值为 false。
[page:Array optionalTarget] — (可选)结果存储到指定对象。否则,一个新的队列 [page:Array] 将会被实例化。如果设置了该值, 在调用该函数前,需要清空队列(例如, array.length = 0;)。
检查参数队列中的所有对象和当前射线的所有焦点,如果 recursive 设置为 true,同样检查子对象。焦点结果被保存在队列中,按照焦点的距离排序,最近结果最先返回。