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

Three.js Raycaster添加立方体后无法立即更新交点问题求助

解决Three.js Minecraft克隆中添加模式下Raycaster不立即检测新立方体的问题

问题根源

移除模式正常是因为删除物体后你大概率主动触发了Raycast检测,而添加模式下,新立方体加入场景后没有强制触发一次完整的Raycast计算,只能等待鼠标移动事件触发检测,导致指示器延迟更新。另外要确认新立方体是否被纳入Raycaster的检测范围。

解决方案

1. 确保新立方体被纳入检测范围

如果你的Raycaster是通过raycaster.intersectObjects(blocksArray)指定检测数组的,必须把新添加的立方体push到这个数组里:

// 添加新立方体时
const newBlock = new THREE.Mesh(geometry, material);
newBlock.position.copy(indicator.position);
scene.add(newBlock);
// 关键:加入检测数组
blocksArray.push(newBlock);

如果用的是raycaster.intersectScene(scene),则只需确保新立方体已添加到场景即可(这一步你应该已经完成)。

2. 添加后强制触发Raycast检测

移除checkIntersection中仅当鼠标位置变化才执行计算的逻辑(如果有的话),确保只要调用就重新计算射线交点。然后在添加立方体的pointerup事件末尾,立即调用checkIntersection:

// 假设全局存储了当前鼠标位置mouse(THREE.Vector2)
window.addEventListener('pointerup', (event) => {
  if (currentMode === 'add') {
    // ...创建并添加新立方体的逻辑...
    
    // 更新当前鼠标位置(避免使用旧值)
    mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
    mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
    
    // 强制触发检测,更新指示器
    checkIntersection();
  }
  // ...移除模式逻辑...
});

3. 修正checkIntersection函数

确保函数每次调用都重新计算射线,不要做鼠标位置变化的判断:

function checkIntersection() {
  raycaster.setFromCamera(mouse, camera);
  // 用检测数组或场景都可以
  const intersections = raycaster.intersectObjects(blocksArray);
  // const intersections = raycaster.intersectScene(scene);
  
  // 更新指示器位置逻辑
  if (intersections.length > 0) {
    const hit = intersections[0];
    if (currentMode === 'add') {
      // 添加模式下,指示器放在相邻的网格位置
      indicator.position.copy(hit.point)
        .add(hit.normal)
        .multiplyScalar(1)
        .floor()
        .addScalar(0.5);
    } else {
      indicator.position.copy(hit.object.position);
    }
    indicator.visible = true;
  } else {
    indicator.visible = false;
  }
}

为什么之前的临时方法没用?

你之前在pointerup调用checkIntersection无效,大概率是因为函数内部有鼠标位置变化的判断(比如和上一次位置对比,没变就跳过计算),或者没有更新当前鼠标位置就调用,导致用了旧的射线参数,无法检测到新立方体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:35:19