【Three.js】十、three.js场景中物体的选择

【Three.js】十、three.js场景中物体的选择

利用THREE.Raycaster(光线投射)进行物体的选择。

使用方式:

let vector = new THREE.Vector2((event.clientX/window.innerWidth) * 2 -1,(event.clientY/window.innerHeight) * 2 + 1);
let raycaster = new THREE.Raycaster();
// 使用一个新的原点和方向来更新射线。
raycaster.setFromCamera(vector, camera);
// 检测所有在射线与这些物体之间,包括或不包括后代的相交部分。返回结果时,相交部分将按距离进行排序,最近的位于第一个)
// .intersectObjects ( objects : Array, recursive : Boolean, optionalTarget : Array ) : Array
// objects —— 检测和射线相交的一组物体。
// recursive —— 若为true,则同时也会检测所有物体的后代。否则将只会检测对象本身的相交部分。默认值为false。
// optionalTarget —— (可选)设置结果的目标数组。如果不设置这个值,则一个新的Array会被实例化;如果设置了这个值,则在每次调用之前必须清空这个数组(例如:array.length = 0;)。
let intersects = raycaster.intersectObjects([sphere, box]);

使用鼠标选择场景中的物体示例:

	let INTERSECTED, vector = new THREE.Vector2();
    function render(){
        stats.update();
        trackballControls.update();
        let raycaster = new THREE.Raycaster();
        raycaster.setFromCamera(vector, camera);
        let intersects = raycaster.intersectObjects( scene.children.filter(item => item instanceof THREE.Mesh && item.name !== 'plane'));
        if (intersects.length > 0) {
            let obj = intersects[0].object;
            if (INTERSECTED !== obj) {
                INTERSECTED && INTERSECTED.material.color.setHex(INTERSECTED.currentColor)
                INTERSECTED = obj;
                INTERSECTED.currentColor = obj.material.color.getHex();
                intersects[0].object.material.color.set(0xff0000);
            }
        } else {
            INTERSECTED && INTERSECTED.material.color.setHex(INTERSECTED.currentColor);
            INTERSECTED = null;
        }
        requestAnimationFrame(render);
        renderer.render(scene, camera);
    }
    function mousedown(event){
        vector.x = (event.clientX / window.innerWidth) * 2 - 1;
        vector.y = - (event.clientY / window.innerHeight) * 2 + 1;
    }
    render();
    document.addEventListener('mousemove', mousedown);

完整示例参考(src/pages/three_selectObject_demo):https://github.com/MAXLZ1/threejs_demo
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MAXLZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值