首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Three.js -拖放(XZ)

Three.js -拖放(XZ)
EN

Stack Overflow用户
提问于 2015-10-05 12:45:12
回答 2查看 5.4K关注 0票数 2

我是three.js新手,我用draggablecubes.html的例子拖放我的对象。问题是,我希望它们只在XZ平面上移动(而不是在Y轴上),我不知道如何在平面上移动它们。用户应该只能在地面上“滑动”它们。我使用的是OrbitControls而不是TrackballControls。

https://jsfiddle.net/d58bbLey/

代码语言:javascript
复制
    function onDocumentMouseMove( event ) {
    event.preventDefault();

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

    raycaster.setFromCamera( mouse, camera );

    if ( SELECTED ) {
        var intersects = raycaster.intersectObject( plane );

        if ( intersects.length > 0 ) {
            SELECTED.position.copy( intersects[ 0 ].point.sub( offset ) );
        }
        return;
    }

    var intersects = raycaster.intersectObjects( objects );

    if ( intersects.length > 0 ) {

        if ( INTERSECTED != intersects[ 0 ].object ) {

            if ( INTERSECTED ) INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
            INTERSECTED = intersects[ 0 ].object;
            INTERSECTED.currentHex = INTERSECTED.material.color.getHex();
            plane.position.copy( INTERSECTED.position );
            plane.lookAt( camera.position );
        }
        container.style.cursor = 'pointer';
    } else {
        if ( INTERSECTED ) INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
        INTERSECTED = null;
        container.style.cursor = 'auto';
    }
}

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-05 15:47:10

最后,我发现了这个问题:每一个物体都有一个平面,它是lookAt摄像机的。因此,我删除了plane.lookAt(camera.position)并添加了以下一行:

代码语言:javascript
复制
plane.applyMatrix(new THREE.Matrix4().makeRotationX( -Math.PI / 2));

现在我的物体停留在飞机上(XZ轴)。

票数 0
EN

Stack Overflow用户

发布于 2019-07-02 07:35:05

我必须做同样的事情,到目前为止我使用的是DragControls

代码语言:javascript
复制
const geometry = new THREE.SphereGeometry(5, 32, 32);
const materialSphere = new THREE.MeshBasicMaterial({ color: 0xff0000, side: THREE.DoubleSide, wireframe: true });
const sphereMesh = new THREE.Mesh(geometry, materialSphere);
this.scene.add(sphereMesh);

this.dragControls = new DragControls([sphereMesh], camera, renderer.domElement);

this.dragControls.addEventListener('drag', (event) => {
  event.object.position.z = 0;
  event.object.position.x = 0;
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32948985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档