1:添加点击事件

    window.addEventListener('click', this.onMouseClick, false);

2:在点击事件中获取具体信息

    // 监听鼠标点击事件
    onMouseClick(event) {
        event.preventDefault();
        this.currentPartition = {}
        this.showHeight = false;
        // console.log(event)
        // 将鼠标位置转换成归一化设备坐标(-1 到 +1)
        // this.elem.clientWidth, this.elem.clientHeight
        // let x = event.clientX  - (window.innerWidth - this.elem.clientWidth)
        // let y = event.clientY  - (window.innerHeight - this.elem.clientHeight)
        // mouse.x = (  event.clientX / window.innerWidth ) * 2 - 1;
        // mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
        // console.log('event.clientY')
        // console.log(event)
        this.mouseTop = event.clientY-renderer.domElement.getBoundingClientRect().top +'px';
        this.mouseLeft = event.clientX-renderer.domElement.getBoundingClientRect().left+3+'px';
        const mouse = new THREE.Vector2();
        // 转换为webgl坐标系下的鼠标位置
        mouse.x = ((event.clientX - renderer.domElement.getBoundingClientRect().left) / renderer.domElement.clientWidth) * 2 - 1;
        mouse.y = -((event.clientY - renderer.domElement.getBoundingClientRect().top) / renderer.domElement.clientHeight) * 2 + 1;
        // console.log(mouse)
        // // 使用鼠标位置更新射线投射器
        raycaster.setFromCamera(mouse, camera);
        
        // // 计算鼠标点击的所有物体
        const intersects = raycaster.intersectObjects(scene.children, true);
        
        // 如果有物体被点击,输出它的信息
        if (intersects.length > 0) {
            // 获取最近的交点对象和交点坐标
            const intersect = intersects[0];
            const point = intersect.point; // 交点在世界坐标中的位置
            const object = intersect.object; // 被点击的对象
            const distanceToCamera = intersect.distance; // 从相机到交点的距离(可以用来计算高度)
            // console.log('Clicked on object:', object);
            // console.log('Intersection  ---------------  point:');
            // console.log(point);
            this.mouseCurrentHeight = parseInt(parseFloat((point.z-2.2).toFixed(2)) * 100) / 100;// Math.floor(point.z-1);
            this.showHeight = true;
            // if(this.timerHeight){
            //     clearInterval(this.timerHeight)
            // }
            // this.timerHeight = setInterval(()=>{
            //     this.showHeight = false;
            //     clearInterval(this.timerHeight)
            // },1500)
            // console.log('Distance to camera:', distanceToCamera);
            
            // // 如果需要计算高度,可以这样做:
            // // 假设相机位于y=0的位置,则可以计算高度为:point.y - cameraPosition.y;
            // const cameraPosition = new THREE.Vector3();
            // camera.getWorldPosition(cameraPosition);
            // const height = point.y - cameraPosition.y; // 注意:这取决于你的场景设置,可能需要调整以适应实际情况。
            // console.log('Height from camera:', height);
            return
            // // 取第一个被点击的物体
            // let intersect = null;
            // console.log('输出被点击的物体信息');
            // intersects.forEach((ele) => {
            //     // console.log('ele');
            //     // console.log(ele);
            //     // if(ele.object.name == "partitionName"){
            //         intersect = ele;
            //     // }
            // })
            // if(intersect){
            //     // 输出被点击的物体信息
            //     console.log('输出被点击的物体信息');
            //     console.log(intersect.object);
            //     // if(intersect.object.partitionInfo.volume){
            //     //     intersect.object.partitionInfo.volume = Number(intersect.object.partitionInfo.volume).toFixed(2)
            //     // }
            //     // this.currentPartition = { ...intersect.object.partitionInfo }
            //     // console.log(intersects);
            // }
            // 你可以获取更多的信息,例如点的位置、面的法线等
            // console.log(intersect.point);
            // console.log(intersect.face.normal);
        }
    },
View Code

备住:由于我这里展示3d模型的区域不是全屏所以点击时候做了处理需要转化一下坐标系。代码如下:

        this.mouseTop = event.clientY-renderer.domElement.getBoundingClientRect().top +'px';
        this.mouseLeft = event.clientX-renderer.domElement.getBoundingClientRect().left+3+'px';
        const mouse = new THREE.Vector2();
        // 转换为webgl坐标系下的鼠标位置
        mouse.x = ((event.clientX - renderer.domElement.getBoundingClientRect().left) / renderer.domElement.clientWidth) * 2 - 1;
        mouse.y = -((event.clientY - renderer.domElement.getBoundingClientRect().top) / renderer.domElement.clientHeight) * 2 + 1;
        // console.log(mouse)

 

posted on 2025-04-30 09:13  刘世涛6192  阅读(19)  评论(0)    收藏  举报