fransua
fransua

Reputation: 533

Threejs / Raycast doesn't compute intersection with my cube

Here is my js files. It works. When I click on the cube, it goes inside raycast function, but doesn't enter the for loop and console.log( intersects[ 0 ] ) gives 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 ] ); 
    }
}

Upvotes: 2

Views: 168

Answers (1)

Mugen87
Mugen87

Reputation: 31016

It seems your code works by using a latest version of three.js. I've just refactored/simplified it a bit.

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/[email protected]/build/three.min.js"></script>

Upvotes: 2

Related Questions