【发布时间】:2016-06-22 18:27:28
【问题描述】:
我已经设置了一个光线投射器,以便从我的画布中执行对象选择。
它适用于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 的一部分,其中 'canvas' div 所在的位置,我还尝试了 canvas.offsetLef 而不是 renderer.domElement.offsetLeft 等。
编辑 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>
【问题讨论】:
-
我想确保 HTML/CSS 中的 domElement 和画布原点坐标是相同的,并且没有边距、浏览器缩放或偏移量使光线偏离您的意图。然后你的渲染器 setSize 也是正确的。我从未见过因为浮动不精确而导致光线未命中的情况。
-
我会说你的设置有问题。也许修改您的完整代码会帮助其他人指出问题。
-
我也有同样的问题。但是如果我使用 orbitControls 旋转和平移我的场景,raycaster 会发现相交对象。你找到解决办法了吗?
标签: javascript three.js camera raycasting