35three.js鼠标控制物体旋转缩放

35three.js鼠标控制物体旋转缩放_第1张图片

35three.js鼠标控制物体旋转缩放_第2张图片

 

 

three.js包含了很多相机控制器,通过旋转相机可以达到同样的旋转效果。
但是当我们需要固定场景背景,固定固定摄像机的时候。我们只能去移动物体了。Three.js提供了
TransformControls.js控件,它可以控制物体的旋转、缩放、平移,但是使用起来并不方便。
这个时候就需要自己动手写控制器了。
原理很简单:获取鼠标(手势)点击的位置,以及鼠标拖动的距离。
把移动的方向和距离作为参数传递给物体。然后在循环中改变物体的属性来控制物体。
将要转动的物体放在一个组中,改变该组就可以。

//添加监听事件
document.addEventListener( 'mousedown', onDocumentMouseDown, false );
document.addEventListener( 'touchstart', onDocumentTouchStart, false );
document.addEventListener( 'touchmove', onDocumentTouchMove, false );

    function onDocumentMouseDown( event ) {
        event.preventDefault();
        document.addEventListener( 'mousemove', onDocumentMouseMove, false );
        document.addEventListener( 'mouseup', onDocumentMouseUp, false );
        document.addEventListener( 'mouseout', onDocumentMouseOut, false );
        mouseXOnMouseDown = event.clientX - windowHalfX;
        targetRotationOnMouseDown = targetRotation;
    }

    function onDocumentMouseMove( event ) {
        mouseX = event.clientX - windowHalfX;
        targetRotation = targetRotationOnMouseDown + ( mouseX - mouseXOnMouseDown ) * 0.02;
    }

    function onDocumentMouseUp( event ) {
        document.removeEventListener( 'mousemove', onDocumentMouseMove, false );
        document.removeEventListener( 'mouseup', onDocumentMouseUp, false );
        document.removeEventListener( 'mouseout', onDocumentMouseOut, false );
    }

    function onDocumentMouseOut( event ) {
        document.removeEventListener( 'mousemove', onDocumentMouseMove, false );
        document.removeEventListener( 'mouseup', onDocumentMouseUp, false );
        document.removeEventListener( 'mouseout', onDocumentMouseOut, false );
    }

    function onDocumentTouchStart( event ) {
        if ( event.touches.length == 1 ) {
            event.preventDefault();
            mouseXOnMouseDown = event.touches[ 0 ].pageX - windowHalfX;
            targetRotationOnMouseDown = targetRotation;
        }
    }

    function onDocumentTouchMove( event ) {
        if ( event.touches.length == 1 ) {
            event.preventDefault();
            mouseX = event.touches[ 0 ].pageX - windowHalfX;
            targetRotation = targetRotationOnMouseDown + ( mouseX - mouseXOnMouseDown ) * 0.05;
        }
    }

    function animate() {
        requestAnimationFrame( animate );
        render();
    }

    function render() {
        group.rotation.y += ( targetRotation - group.rotation.y ) * 0.08;
        camera.lookAt( cameraTarget );
        renderer.clear();
        renderer.render( scene, camera );
    }

这里获取的是X轴方向的鼠标移动的值。然后绕Y轴旋转。也可以添加其他的方向的旋转事件。
也可以添加一个功能,点击立方体之上才有效果。再说吧。

你可能感兴趣的:(three.js)