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

Three.js中通过XY坐标获取网格Z值的Raycaster使用问题

问题分析与修正方案

嘿,我帮你找出代码里的问题啦!你遇到的坐标不符、Z值不准的情况,主要是对THREE.Raycaster的用法理解错了,还有几个小细节没注意到:

核心错误点

  • Raycaster.set() 的参数用错了:这个方法的第二个参数是方向向量(需要归一化),不是射线的终点!你现在传的bottom是一个点坐标,这会让射线的方向变成「从原点指向bottom点」,完全不是你想要的垂直向下。正确的方向应该是指向-Z轴的归一化向量new THREE.Vector3(0, 0, -1)。
  • 变量名大小写不一致:你创建的是raycaster(小写c),但调用时写成了rayCaster(大写C),这属于低级拼写错误,可能导致代码逻辑异常。
  • 重复创建Raycaster浪费性能:没必要在循环里每次都新建Raycaster,初始化一次重复用就好。

修正后的代码

// 提前初始化Raycaster和方向向量,避免循环内重复创建
const raycaster = new THREE.Raycaster();
const downwardDir = new THREE.Vector3(0, 0, -1); // 垂直向下的归一化方向向量

for(let i = 0; i < points.length; i++){
  const pts = points[i];
  // 射线起点:目标XY坐标,z设为足够高的位置(比如50)
  const rayStart = new THREE.Vector3(pts.x, pts.y, 50);
  
  // 设置射线:起点 + 方向向量
  raycaster.set(rayStart, downwardDir);
  
  // 检测与目标网格子物体的交点(注意变量名统一为raycaster)
  const intersects = raycaster.intersectObjects(scene.getObjectByName('MyObj_s').children, false);
  
  if(intersects.length > 0){
    const hitPoint = intersects[0].point;
    console.log(`目标XY(${pts.x}, ${pts.y})对应的网格Z值:`, hitPoint.z);
    console.log('完整交点坐标:', hitPoint);
  } else {
    console.log(`XY(${pts.x}, ${pts.y})位置没有命中网格`);
  }
}

额外注意事项

  • 确保你的网格子物体是可射线检测的:默认情况下Mesh是支持的,但如果设置了mesh.raycast = null或者material.visible = false,射线就检测不到了。
  • 若网格有变换(缩放、旋转、平移):建议在射线检测前调用scene.updateMatrixWorld(),确保所有物体的矩阵都更新完毕,避免坐标计算偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:23:54