动态

详情 返回 返回

threejs的transformControls拖拽結束的異常 - 动态 详情

transformControls拖拽結束以後會以結束點的射線拾取重新選中新的模型,這裏發現是監聽事件的問題

// 創建 TransformControls
        const transformControls = new TransformControls(camera, renderer.domElement);
        const transformControlsHelper = transformControls.getHelper()
        scene.add(transformControlsHelper);

        
        transformControls.addEventListener('dragging-changed', (event) => {
            controls.enabled = !event.value;
        });

        // 鼠標點擊選擇物體
        const raycaster = new THREE.Raycaster();
        const mouse = new THREE.Vector2();
       

        let isDragging = false;

        transformControls.addEventListener('mouseDown', () => {
        isDragging = true;
        });
        transformControls.addEventListener('mouseUp', () => {
        isDragging = false;
        });

        function onMouseClick(event) {
            if (isDragging) return; // 不在拖動時切換控制目標

            mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
            mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
            raycaster.setFromCamera(mouse, camera);

            const intersects = raycaster.intersectObjects(interactiveGroups);
            if (intersects.length > 0) {
                transformControls.attach(intersects[0].object);
            } else {
                transformControls.detach();
            }
        }

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

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

換成

window.addEventListener('pointerdown', onMouseClick, false);
  • 使用 pointerdown 當您需要:

立即響應按下動作(如拖拽開始)

支持觸摸設備的即時反饋

檢測壓力敏感設備的壓力級別

  • 使用 click 當您需要:

傳統的點擊行為

確保用户完成點擊動作

兼容性要求(click 有更廣泛的瀏覽器支持)

推薦一個webgl在線三維編輯器
https://github.com/nikonikoCW/Meteor3DEditor
官網
http://www.meteor3d.cn/

user avatar tianmiaogongzuoshi_5ca47d59bef41 头像 haoqidewukong 头像 freeman_tian 头像 dirackeeko 头像 aqiongbei 头像 longlong688 头像 huichangkudelingdai 头像 Dream-new 头像 ccVue 头像 wmbuke 头像 bugDiDiDi 头像 munergs 头像
点赞 68 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.