Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Three.js使用相机的光线投射选择项目_Javascript_Three.js - Fatal编程技术网

Javascript Three.js使用相机的光线投射选择项目

Javascript Three.js使用相机的光线投射选择项目,javascript,three.js,Javascript,Three.js,嘿,伙计们,我正试图让光线直接从相机出来,与我看到的任何东西相交,但我看到的所有参考都使用鼠标,我不知道如何转换 到目前为止,我掌握的代码是: var raycaster = new THREE.Raycaster(); function render() { raycaster.set(camera, 0); renderer.render( scene, camera ); } 我做了类似的事情,只是用鼠标的位置而不是相机 您可以尝试将前两行event.offset

嘿,伙计们,我正试图让光线直接从相机出来,与我看到的任何东西相交,但我看到的所有参考都使用鼠标,我不知道如何转换

到目前为止,我掌握的代码是:

var raycaster = new THREE.Raycaster();

function render() 
{ 
    raycaster.set(camera, 0);

    renderer.render( scene, camera );
}
我做了类似的事情,只是用鼠标的位置而不是相机

您可以尝试将前两行event.offsetX和event.offsetY替换为画布的中心,如:

编辑:现在您可以对intersect多维数据集执行一些特殊操作。例如,显示他的线框,如:intersectObjects[0]。material.wireframe=true

注意:intersectObjects数组按距离排序。因此,最近的对象将位于索引0处

编辑2:您可以创建一个更新循环更新函数来使用上述代码。我知道两种方法:

使用setIntervaluUpdate,1000/60:1000/60使其每秒呼叫60次。否定:当更新函数的执行时间超过16.6 1000/60毫秒时,它将不精确 在渲染方法中调用update方法。肯定:这将更加精确,并且您已经将应用程序与渲染逻辑分离了

功能更新{ //把上面的代码放在这里 }

函数render{ // ... 使现代化 }


非常感谢。你能把所有这些都放在渲染中吗?不,你不应该把它放在渲染函数中!它与渲染逻辑无关!对不起,我看到的所有其他stuf都进入了渲染。我想它现在可以工作了,我只需要测试itOkay,因为某种原因,光线总是选择三个物体,我猜,但不管我如何移动相机,它似乎都不会改变。我唯一改变的是:对于var I=0;i.长度;i++{intersectObjects[i].object.material.color.set 0xff0000;console.logiintersectobjects;}在我上面的代码中,将在render方法中调用update方法,因此它转到render逻辑。我的意思是,为了更干净的代码,应该将更新逻辑与渲染逻辑分开。您希望对相交对象执行什么操作?
var x = (event.offsetX / renderer.domElement.width) * 2 - 1;
var y = -(event.offsetY / renderer.domElement.height) * 2 + 1;
var z = 0.5;
var mousePosition = new THREE.Vector3(x, y, z);
var raycaster = new THREE.Raycaster();

mousePosition.unproject(camera);
raycaster.set(camera.position, mousePosition.sub(camera.position).normalize());

var intersectObjects = raycaster.intersectObjects(scene.children);

if (intersectObjects.length) {
    // do something
}
var x = ((canvasElement.clientWidth / 2) / renderer.domElement.width) * 2 - 1;
var y = -((canvasElement.clientHeight / 2) / renderer.domElement.height) * 2 + 1;