three.js - Threejs/Raycast 不计算与我的立方体的交集

标签 three.js

这是我的 js 文件。有用。当我单击立方体时,它会进入光线转换函数,但不会进入 for 循环,并且 console.log( intersects[ 0 ] ) 给出未定义

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 ] ); 
    }
}

最佳答案

您的代码似乎可以使用最新版本的 third.js 运行。我刚刚对其进行了一些重构/简化。

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/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e2968a908787a2d2ccd3d6d2ccd0" rel="noreferrer noopener nofollow">[email protected]</a>/build/three.min.js"></script>

关于three.js - Threejs/Raycast 不计算与我的立方体的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72344882/

相关文章:

javascript - 三.JS,改变子3D对象的世界位置

javascript - JSON 图像 url 而不是 base64

javascript - Three.js: map 和属性未定义以及在本地使用图像

javascript - 三个js向右线性方向移动相机

javascript - 三JS : Getting the rotation so one vector3 will face another vector3

javascript - 在 Threejs 中导入 *.obj 的面上移动粒子

three.js - 三JS : is it possible to simplify an object/reduce the number of vertexes?

javascript - Three.js Cube - 旋转到随机一侧

Three.js:在对象中心旋转

css - 以倒置旋转木马或 VR/球形方式查看图像