Three.js THREE.Raycaster 射线拾取详解 (解决射线无法射到object3,group里的children)

简介

由于浏览器是一个2d视口,而在里面显示three.js的内容是3d场景,所以,现在有一个问题就是如何将2d视口的xy坐标转换成three.js场景中的3d坐标。好在three.js已经有了解决相关问题的方案,那就是THREE.Raycaster射线,用于鼠标拾取(计算出鼠标移过的三维空间中的对象)等等。

THREE.Raycaster构造函数和对象方法

new Raycaster( origin, direction, near, far );

origin — 光线投射的起点向量。 
direction — 光线投射的方向向量,应该是被归一化的。 
near — 投射近点,用来限定返回比near要远的结果。near不能为负数。缺省为0。 
far — 投射远点,用来限定返回比far要近的结果。far不能比near要小。缺省为无穷大。

方法

setFromCamera

用一个新的原点和方向向量来更新射线(ray)。

.setFromCamera ( coords, camera )

coords — 鼠标的二维坐标,在归一化的设备坐标(NDC)中,也就是X 和 Y 分量应该介于 -1 和 1 之间。 
camera — 射线起点处的相机,即把射线起点设置在该相机位置处。

intersectObject

检查射线和物体之间的所有交叉点(包含或不包含后代)。交叉点返回按距离排序,最接近的为第一个。 返回一个交叉点对象数组。

.intersectObject ( object, recursive )

object — 用来检测和射线相交的物体。 
recursive — 如果为true,它还检查所有后代。否则只检查该对象本身。缺省值为false。

返回数组每一个对象的内容

[ { distance, point, face, faceIndex, indices, object }, ... ]

distance – 射线的起点到相交点的距离 
point – 在世界坐标中的交叉点 
face – 相交的面 
faceIndex – 相交的面的索引 
indices – 组成相交面的顶点索引 
object – 相交的对象

当一个网孔(Mesh)对象和一个缓存几何模型(BufferGeometry)相交时,faceIndex 将是 undefined,并且 indices 将被设置; 而当一个网孔(Mesh)对象和一个几何模型(Geometry)相交时,indices 将是 undefined。

当计算这个对象是否和射线相交时,Raycaster 把传递的对象委托给 raycast 方法。 这允许 meshes 对于光线投射的响应可以不同于 lines 和 pointclouds。

注意,对于网格,面(faces)必须朝向射线原点,这样才能被检测到;通过背面的射线的交叉点将不被检测到。 为了光线投射一个对象的正反两面,你得设置 material 的 side 属性为 THREE.DoubleSide。

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
射线是在three.js中用于进行射线投射和检测碰撞的一种对象。通过定义射线的起点和方向,可以用于进行鼠标拾取物体碰撞检测等操作。 在three.js中,创建射线对象可以使用THREE.Raycaster类。首先,你需要定义射线的起点和方向。起点可以是摄像机位置或者鼠标点击的屏幕坐标。方向可以是摄像机指向的方向或者屏幕坐标转换为三维空间中的方向。 下面是一个示例代码,展示了如何创建射线并进行射线检测: ```javascript // 创建一个射线 var raycaster = new THREE.Raycaster(); // 设置射线的起点 var origin = new THREE.Vector3(0,0, 0); raycaster.set(origin, new THREE.Vector3(0, 0, -1)); // 方向为负Z轴 // 射线投射检测 var intersects = raycaster.intersectObjects(scene.children); if (intersects.length > 0) { // 有物体射线相交 var intersectedObject = intersects[0].object; // 进行相应的处理 } else { // 没有物体射线相交 } ``` 在上述代码中,我们创建了一个射线对象`raycaster`,并设置了其起点和方向。然后,使用`raycaster.intersectObjects(scene.children)`方法来进行射线检测,返回与射线相交的物体数组`intersects`。如果`intersects`数组的长度大于0,表示有物体射线相交,可以对相交的物体进行相应的处理。 需要注意的是,射线检测需要在每一帧或者特定的事件中进行更新,以保证射线的起点和方向与场景中的物体保持一致。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值