Three.js 光线投射器在物体离开原点后不会击中物体
Three.js raycaster does not hit objects after they are moved away from origin
我在使用 raycaster 时遇到问题:
当我在中心 (0, 0, 0) 创建对象时,光线投射器可以击中它。
但是无论出于何种原因,如果我将对象移动到 (0, 300, 0) 或其他位置,光线投射器将停止击中对象。
所有方向的设置都 100% 正确。我使用 Three.js 函数一步一步地测试了我自己对移动对象的光线投射并且它有效。
似乎 raycaster.IntersectsObject(objects) 没有正确地将 matrixWorld 应用到 Bounding Sphere。
知道为什么吗?
我知道有一个关于这个主题的类似 Post,但解决方案对我来说没有用:
边界球具有正确的值。
您已确保网格的世界矩阵是最新的。您可以通过调用 mesh.updateMatrixWorld();
.
轻松解决此问题
var camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
camera.position.set( 400, 200, -300 );
var scene = new THREE.Scene();
var geometry = new THREE.SphereBufferGeometry(100, 100, 100);
var material = new THREE.MeshBasicMaterial({
color: 0xaa5555
});
var mesh = new THREE.Mesh(geometry, material);
mesh.position.set(0, 300, 0);
mesh.updateMatrixWorld(); // FIX
scene.add(mesh);
camera.lookAt( mesh.position );
var raycaster = new THREE.Raycaster();
var ray = raycaster.ray;
ray.origin.copy( camera.position );
ray.direction.subVectors( mesh.position, camera.position ).normalize();
var intersections = raycaster.intersectObjects(scene.children);
console.log( intersections );
var renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
renderer.render( scene, camera );
body {
margin: 0;
}
canvas {
display: block;
}
<script src="https://cdn.jsdelivr.net/npm/three@0.119/build/three.js"></script>
我在使用 raycaster 时遇到问题:
当我在中心 (0, 0, 0) 创建对象时,光线投射器可以击中它。 但是无论出于何种原因,如果我将对象移动到 (0, 300, 0) 或其他位置,光线投射器将停止击中对象。
所有方向的设置都 100% 正确。我使用 Three.js 函数一步一步地测试了我自己对移动对象的光线投射并且它有效。
似乎 raycaster.IntersectsObject(objects) 没有正确地将 matrixWorld 应用到 Bounding Sphere。
知道为什么吗?
我知道有一个关于这个主题的类似 Post,但解决方案对我来说没有用:
边界球具有正确的值。
您已确保网格的世界矩阵是最新的。您可以通过调用 mesh.updateMatrixWorld();
.
var camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
camera.position.set( 400, 200, -300 );
var scene = new THREE.Scene();
var geometry = new THREE.SphereBufferGeometry(100, 100, 100);
var material = new THREE.MeshBasicMaterial({
color: 0xaa5555
});
var mesh = new THREE.Mesh(geometry, material);
mesh.position.set(0, 300, 0);
mesh.updateMatrixWorld(); // FIX
scene.add(mesh);
camera.lookAt( mesh.position );
var raycaster = new THREE.Raycaster();
var ray = raycaster.ray;
ray.origin.copy( camera.position );
ray.direction.subVectors( mesh.position, camera.position ).normalize();
var intersections = raycaster.intersectObjects(scene.children);
console.log( intersections );
var renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
renderer.render( scene, camera );
body {
margin: 0;
}
canvas {
display: block;
}
<script src="https://cdn.jsdelivr.net/npm/three@0.119/build/three.js"></script>