Я использую Raycaster в THREE.js, чтобы сосредоточиться на объектах с положением мыши. Это то, что я делал миллион раз, без проблем, но в моей текущей настройке есть что-то, что не работает.RayCasting issue in THREE.js - Пересечения являются темпераментными, большую часть времени не возвращают никаких пересечений
Иногда обратный вызов onFocus запускается, но в большинстве случаев вызывается обратный вызов onBlur. Насколько я могу видеть из примеров и вопросов переполнения стека, я делаю все правильно, но, похоже, это не так ... Единственное различие, которое я вижу сейчас и в другое время, я сделал это, что обычно моя камера находится на 0, 0, 0.0001, глядя в сторону объектов, и на этот раз камера выше, глядя в объекты.
Камера на 130, 325, 194, и объект в 0, 0, 0
фрагменты кода ниже:
scene = new THREE.Scene();
scene.add(camera);
const geometry = new THREE.CubeGeometry(50, 50, 50);
const material = new THREE.MeshBasicMaterial({ color: 0xff00ff, wireframe: false });
const mesh = new THREE.Mesh(geometry, material);
mesh.onFocus =() => {
console.log('focus test');
}
mesh.onBlur =() => {
console.log('blur test');
}
intersectableObjects.push(mesh);
scene.add(mesh);
const onMouseMove = ({ clientX, clientY }) => {
const x = (clientX/window.innerWidth) * 2 - 1;
const y = - (clientY/window.innerHeight) * 2 + 1;
mouseVector.set(x, y);
raycaster.setFromCamera(mouseVector, camera);
castFocus();
}
const castFocus =() => {
intersectableObjects.forEach((obj, i) => {
const intersects = raycaster.intersectObject(obj, false);
if (intersects.length) return obj.onFocus();
obj.onBlur();
});
}
вам не нужно пытаться пересекать каждый объект индивидуально. вы можете использовать 'raycaster.intersectObjects (scene.children);' или вы можете передать 'raycaster.intersectObjects' свой массив объектов для проверки пересечения. – gaitat
Спасибо, я тоже пробовал это, но он все еще не работает. Я пересекаю их отдельно, так как это облегчает работу с обратными вызовами onBlur и onFocus. –