You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

THREE.js Raycaster的intersectObject方法检测点在网格内时返回空交集问题

首先回答关于matrixWorld的疑问

Raycaster计算相交时确实会用到mesh的matrixWorld:它内部会自动对mesh的matrixWorld求逆矩阵,将你传入的世界空间射线(起点、方向)转换到mesh的局部坐标空间,再和局部存储的几何体顶点做相交计算,只要你确认matrixWorld是最新的,这一步不会有问题。

无相交结果的常见原因(针对Forge场景)

  • Forge模型的几何体非标准Three.js结构
    Autodesk Forge为了性能优化,大部分构件的顶点数据不会按标准Three.js的geometry.attributes.position格式存储,原生Raycaster无法读取到有效顶点数据,自然返回空结果。你可以先打印mesh.geometry.attributes确认position属性是否存在、长度是否符合预期。
  • 射线方向巧合漏检
    你当前使用的(1,1,1)方向可能刚好和mesh的面平行、或者从顶点/边缝隙处擦过,没有触发相交判定。建议同时测试3个以上不同轴方向的射线(比如x正、y负、z正),只要任意一个的相交次数为奇数即可判定点在内部。
  • 近裁剪阈值过滤
    Raycaster默认的near属性为0.1,如果待检测点距离mesh内壁的距离小于该值,近距离的相交结果会被过滤,你可以手动调低阈值避免漏检。
  • 优先使用Forge自带相交接口
    Forge Viewer内置了适配自身模型结构的相交方法viewer.impl.rayIntersect,兼容性远高于原生Three.js Raycaster,适配Forge模型的效果更好。

修改后的参考代码

mesh.material.side = THREE.DoubleSide;
// 调低近裁剪阈值为1e-6,避免过滤近距离相交
const raycaster = new THREE.Raycaster(undefined, undefined, 1e-6);
let vertex = new THREE.Vector3();
vertex.fromArray(positions, positionIndex);
vertex.applyMatrix4(matrixWorld);

// 测试多方向射线避免巧合漏检
const directions = [
  new THREE.Vector3(1,0,0),
  new THREE.Vector3(0,1,0),
  new THREE.Vector3(0,0,1)
];
let isPointInside = false;
for(const dir of directions) {
  raycaster.set(vertex, dir);
  const intersects = raycaster.intersectObject(mesh, true);
  if(intersects.length % 2 === 1) {
    isPointInside = true;
    break;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:18:00