You need to enable JavaScript to run this app. Three.js中如何获取沿指定射线的最近相交物体及距离
优惠活动
大模型
产品
解决方案
定价
更多

Three.js中如何获取沿指定射线的最近相交物体及距离

Three.js实现机器人正前方最近障碍物距离检测

核心实现逻辑

直接用Three.js内置的Raycaster(射线投射器)能力实现,从指定起点沿固定方向发射射线,计算射线与场景物体的相交关系,返回的相交结果自动按距离从近到远排序,直接提取最近值即可。

落地步骤

  1. 提前维护障碍物目标列表
    不要直接对整个场景做射线检测(会产生大量无效计算,场景复杂度高时性能骤降),单独定义数组obstacleList,所有需要被检测的障碍物Mesh/组对象统一存入该数组,障碍物的新增、销毁操作要同步更新这个数组。
  2. 动态计算探测射线的起点与方向
    由于机器人会实时移动、旋转,不能写死射线参数,每帧检测时要基于机器人当前姿态做坐标转换:
    • 射线起点:取机器人前端安装的传感器位置,先定义该点在机器人本地坐标系的偏移值,通过localToWorld()方法转换为全局世界坐标
    • 射线方向:取机器人本地坐标系的正前方向量,结合机器人的全局旋转四元数,转换为世界空间下的实际朝向
      参考代码:
    // 示例:传感器在机器人本地坐标系Z轴正方向1.5m处
    const sensorLocalOffset = new THREE.Vector3(0, 0, 1.5);
    // 转换为世界坐标作为射线起点
    const rayOrigin = robotMesh.localToWorld(sensorLocalOffset.clone());
    // 本地正前方向量
    const localForward = new THREE.Vector3(0, 0, 1);
    // 结合机器人全局旋转,转换为世界空间下的射线方向
    const worldForward = localForward.applyQuaternion(
      robotMesh.getWorldQuaternion(new THREE.Quaternion())
    );
    
  3. 执行射线检测
    初始化Raycaster实例,传入计算好的起点、方向,可额外设置最小、最大探测距离裁剪值,避免超量程计算:
    // 参数:射线起点、射线方向、最小检测距离、最大探测量程
    const raycaster = new THREE.Raycaster(rayOrigin, worldForward, 0.1, 50);
    // 仅检测维护好的障碍物列表,true代表递归检测组对象的子Mesh
    const intersectResults = raycaster.intersectObjects(obstacleList, true);
    
  4. 提取最近障碍物距离
    raycaster.intersectObjects()返回的结果数组已经按相交点到射线起点的距离从近到远排序,无需手动排序:
    let nearestDistance;
    if (intersectResults.length > 0) {
      // 数组第一个元素即为最近的相交障碍物,distance属性为直线距离
      nearestDistance = intersectResults[0].distance;
    } else {
      // 探测范围内无障碍物,返回设置的最大量程值
      nearestDistance = 50;
    }
    

注意事项

  • 禁止将机器人自身的Mesh加入obstacleList,否则射线会首先命中自身结构,返回无效的0值
  • 如果障碍物是包含多个子Mesh的Group对象,intersectObjects的第二个参数必须设为true开启递归检测,否则无法识别子层级的碰撞
  • 障碍物销毁、移除时要同步从obstacleList中删除对应引用,避免检测到已从场景移除的无效对象造成报错
  • 如果需要模拟真实激光雷达的发散角,可在中心射线基础上左右偏移小角度打多条射线,取所有检测结果的最小值作为最终障碍物距离

内容的提问来源于stack exchange,提问作者kmindspark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 23:06:07