Threejs / Raycast 不计算与我的立方体的交集

Threejs / Raycast doesn't compute intersection with my cube

这是我的 js 文件。有用。当我点击立方体时,它会进入 raycast 函数,但不会进入 for 循环并且 console.log( intersects[ 0 ] ) 给出 undefined

let camera, scene, renderer;
let mesh, mesh_green;
let raycaster, mouse = { x : 0, y : 0 };
init();

function init() {
     camera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 1000 );
     camera.position.z = 40;
     scene = new THREE.Scene();
     const geometry = new THREE.BoxGeometry( 1, 1, 1 );
     const material = new THREE.MeshBasicMaterial( { color: "red" } );
     mesh = new THREE.Mesh( geometry, material );
     scene.add( mesh );
     mesh.position.set( 0, 10, 0 );
     renderer = new THREE.WebGLRenderer( { antialias: true } );
     renderer.setPixelRatio( window.devicePixelRatio );
     renderer.setSize( window.innerWidth, window.innerHeight );
     document.body.appendChild( renderer.domElement );
     raycaster = new THREE.Raycaster();
     renderer.domElement.addEventListener( 'click', raycast, false );

function raycast ( e ) {
                
    mouse.x = ( e.clientX / window.innerWidth ) * 2 - 1;
    mouse.y = - ( e.clientY / window.innerHeight ) * 2 + 1;
    console.log( "raycast" , e.clientX, mouse.x, window.innerWidth);
    
    raycaster.setFromCamera( mouse, camera );    
    const intersects = raycaster.intersectObjects( scene.children );
    
    for ( let i = 0; i < intersects.length; i++ ) {
        console.log( intersects[ i ] ); 
    }
}

您的代码似乎可以使用最新版本的 three.js。我只是 refactored/simplified 一点。

let camera, scene, renderer;

let mesh;

let raycaster, pointer = new THREE.Vector2();

init();
animate();

function init() {

  camera = new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 1000);
  camera.position.z = 40;
  
  scene = new THREE.Scene();

  const geometry = new THREE.BoxGeometry();
  const material = new THREE.MeshBasicMaterial({
    color: "red"
  });

  mesh = new THREE.Mesh(geometry, material);
  mesh.position.set(0, 10, 0);
  scene.add(mesh);

  renderer = new THREE.WebGLRenderer({antialias: true});
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);

  raycaster = new THREE.Raycaster();

  renderer.domElement.addEventListener('pointerdown', raycast);

}

function raycast(e) {

  pointer.x = (e.clientX / window.innerWidth) * 2 - 1;
  pointer.y = -(e.clientY / window.innerHeight) * 2 + 1;

  raycaster.setFromCamera(pointer, camera);
  const intersects = raycaster.intersectObject(scene);

  for (let i = 0; i < intersects.length; i++) {
    console.log(intersects[i]);
  }
}

function animate() {

  requestAnimationFrame(animate);

  mesh.rotation.x += 0.01;
  mesh.rotation.y += 0.02;

  renderer.render(scene, camera);

}
body {
      margin: 0;
}
<script src="https://cdn.jsdelivr.net/npm/three@0.140.2/build/three.min.js"></script>