2017-01-26 1 views
0

Я использую 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(); 
    }); 
} 
+0

вам не нужно пытаться пересекать каждый объект индивидуально. вы можете использовать 'raycaster.intersectObjects (scene.children);' или вы можете передать 'raycaster.intersectObjects' свой массив объектов для проверки пересечения. – gaitat

+0

Спасибо, я тоже пробовал это, но он все еще не работает. Я пересекаю их отдельно, так как это облегчает работу с обратными вызовами onBlur и onFocus. –

ответ

0

После нескольких очень разочаровывает часов я обнаружил, что У Raycaster есть проблемы при работе с очень низким значением для CameraNear.

У меня была камера около установленной 0,000001, но когда я увеличил ее до 0,01, она работала нормально.

Смежные вопросы