화면의 전체 너비와 높이를 차지하지 않는 캔버스에이 기능을 구현할 때 문제가 발생했습니다. 여기 내가 찾은 해결책이 꽤 잘 작동합니다.
기존의 캔버스에 모든 것을 초기화 :
var init = function() {
var canvas_model = document.getElementById('model')
var viewSize = 50 // Depending on object size, canvas size etc.
var camera = new THREE.OrthographicCamera(-canvas_model.clientWidth/viewSize, canvas_model.clientWidth/viewSize, canvas_model.clientHeight/viewSize, -canvas_model.clientHeight/viewSize, 0.01, 2000),
}
캔버스에 이벤트 리스너를 추가
canvas_model.addEventListener('click', function(event){
var bounds = canvas_model.getBoundingClientRect()
mouse.x = ((event.clientX - bounds.left)/canvas_model.clientWidth) * 2 - 1;
mouse.y = - ((event.clientY - bounds.top)/canvas_model.clientHeight) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(scene.children, true);
if (intersects.length > 0) {
// Do stuff
}
}, false)
아니면 'touchstart'이벤트에 대한
에서, mouse.x 계산 라인을 변경하고 mouse.y 입력 :
mouse.x = ((event.touches[0].clientX - bounds.left)/canvas_model.clientWidth) * 2 - 1;
mouse.y = - ((event.touches[0].clientY - bounds.top)/canvas_model.clientHeight) * 2 + 1;
여백 및 여백 때문에 좌표가 약간 벗어날 수 있습니다. 당신이 그것을 설명 했습니까? – Prusse
데모의 순간에는 마진이나 패딩이 없지만 설명 된 기술은 정확하지 않습니다. – Andrea
[이 예제] (http://mrdoob.github.com/three.js/examples/canvas_interactive_cubes.html)를보십시오. –