我已经设置了一个raycaster为了从我的画布执行对象选择。ThreeJS raycaster关闭与相机和对象的坐标大于1000000
它适用于camera.position.x和object.position.x的小值,但我的问题是,它不能很好地工作时,camera.postion.x是一个很大的数字,在我的情况下10 000 000!
实际上,当鼠标指针位于整个对象的右侧时,我收到了一个反应!我的猜测是,用这么大的数字计算会产生这种失真,但不能确定。
var raycaster = new THREE.Raycaster();
var vector = new THREE.Vector2();
camera.position.x = 11000000;
object.position.x = 11000000;
function onMouseMove(event) {
vector.x = ((event.clientX - renderer.domElement.offsetLeft)/renderer.domElement.clientWidth) * 2 - 1;
vector.y = - ((event.clientY - renderer.domElement.offsetTop)/renderer.domElement.clientHeight) * 2 + 1;
raycaster.setFromCamera(vector, camera);
var intersects = raycaster.intersectObjects(scene.children, true);
if(intersects.length>0){
alert("INTERSECTION " + intersects[0].object.userData.name);
}
}canvas.addEventListener('mousemove', onMouseMove, false);
我省略了对象添加到场景和其他一些东西,以便帖子不会太长。例如,当camera.position.x和object.position.x被设置为小于1 000 000的某个值时,这适用,即使那时仍然存在一些失真。
编辑1
var scene = new THREE.Scene();
var canvas = document.getElementById('canvas');
var height = canvas.clientHeight;
var width = canvas.clientWidth;
var camera = new THREE.PerspectiveCamera(70, width/height, 1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height);
canvas.appendChild(renderer.domElement);
而且,这里是我的HTML的一部分,其中 '画布' DIV所在,我也尝试过的,而不是renderer.domElement.offsetLeft等canvas.offsetLef ..
编辑2
<div id="content" ng-controller="ShippingCtrl">
<div id="left_panel">
</div>
<div id="canvas" style="width:900px; height:600px; border:1px solid white">
</div>
<div id="right_pannel">
</div></div>
我想肯定的是,一个DOMElement和帆布起源于HTML/CSS坐标是相同的,没有利润,浏览器缩放或偏移正在从您的意图中移动光线。那么你的渲染器setSize也是正确的。由于浮动不精确,我从未见过射线缺失。 – Radio
我会说你的设置有问题。也许你的完整代码的小提琴会帮助别人指出这个问题。 – Wilt
我有同样的问题。但是,如果我旋转并用orbitControls平移我的场景,raycaster会找到相交对象。 你找到了解决办法? –