我知道在71版本中没有THREE.projector
(参见不推荐使用的列表),但是我不知道如何替换它,特别是在下面的代码中,它检测哪个对象被点击了:
var vector = new THREE.Vector3(
(event.clientX / window.innerWidth) * 2 - 1,
-(event.clientY / window.innerHeight) * 2 + 1,
0.5
);
projector.unprojectVector(vector, camera);
var raycaster = new THREE.Raycaster(
camera.position,
vector.sub(camera.position).normalize()
);
var intersects = raycaster.intersectObjects(objects);
if (intersects.length > 0) {
clicked = intersects[0];
console.log("my clicked object:", clicked);
}
7条答案
按热度按时间gwbalxhn1#
现在有一种更简单的模式,可以同时使用正交摄影机和透视摄影机类型:
第84号三条
h6my8fg22#
threeidojs raycaster文档实际上给出了这些答案中列出的所有相关信息,以及所有可能很难让你了解的缺失点。
希望能有所帮助。
cngwdvgl3#
您可以使用如上所述的最新推荐版本。
要使特定代码正常工作,请替换:
与
dzjeubhm4#
我注意到,我认为之前所说的所有这些在一个完整的窗口中都是可以的,但是如果你在页面上除了画布之外还有其他东西,你需要获取点击事件目标的偏移量并删除它。
e =事件,mVec是一个三向量2
看起来你也需要注意拖动(鼠标移动),否则在使用窗口时释放拖动将触发不需要的点击。addEventListener('click',function(e){});
[You我会注意到我把负号放在了更符合逻辑的地方。]
6tr1vspr5#
https://github.com/mrdoob/three.js/issues/5587
Objects = Object3D类型的对象数组,用于检查与光线的相交。可以是场景中的所有内容,但如果有很多内容,则效率可能会很低。
recursiveFlag =如果为true,它也会检查所有子系。否则,它只会检查与对象的交集。预设值为true。
文档
flvlnr446#
我想分享我的经验与更多的细节这样做,因为我觉得上面的答案并没有真正解释的细节,让这一点去。
在我的例子中,我使用STL_Viewer,你可以在这里找到它(https://www.viewstl.com/plugin/),它帮助创建一个threeJS场景,并为你提供你需要的相机和场景。
上面是我的函数,它将自动规范化被单击空间中的x,y坐标(在-1和1之间),因为这是光线投射器的setFromCamera函数所需要的。
因为您可能会在屏幕的某个部分中单击偏移量,所以我以这种方式对它进行了编程,这样无论它在DOM中的位置如何,它都可以处理。只需将"stl_contEye"替换为div的名称,该div将包含渲染的ThreeJS或STLViewer(在我的示例中)。
通过这种方式,你将得到你点击的3D空间中的确切点。函数model_clicked只返回一个包含clientX或clientY的事件,如果你没有使用STLViewers事件来检测点击,你只需要以某种方式自己得到这个。上面有很多来自其他答案的例子。
我希望这能帮助那些试图在有或没有stl_viewer的情况下弄清楚这一点的人
pcrecxhr7#