【问题标题】:How to rotate the plane using three.js?如何使用three.js旋转平面?
【发布时间】:2018-10-20 18:20:04
【问题描述】:

大家好,我正在使用three.js 并尝试将这架飞机旋转到下方,但成功了。知道该怎么做吗?下面是使用three.js 渲染平面的代码。请问如何旋转呢?谢谢!

 var container;
var camera, scene, renderer;
var plane;

var mouse, raycaster, isShiftDown = false;

var cubeGeometry = new THREE.BoxBufferGeometry( 50, 50, 50 );
var cubeMaterial = new THREE.MeshLambertMaterial( { color: 0x00ff80, overdraw: 0.5 } );

var objects = [];

init();
render();

function init() {

    container = document.createElement( 'div' );
    document.body.appendChild( container );

    var info = document.createElement( 'div' );
    info.style.position = 'absolute';
    info.style.top = '10px';
    info.style.width = '100%';
    info.style.textAlign = 'center';
    info.innerHTML = '<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> - voxel painter<br><strong>click</strong>: add voxel, <strong>shift + click</strong>: remove voxel, <a href="javascript:save()">save .png</a>';
    container.appendChild( info );

    camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 10000 );
    camera.position.set( 500, 800, 1300 );
    camera.lookAt( 0, 0, 0 );

    scene = new THREE.Scene();
    scene.background = new THREE.Color( 0xf0f0f0 );

    // Grid

    var gridHelper = new THREE.GridHelper( 1000, 20 );
    scene.add( gridHelper );

    //

    raycaster = new THREE.Raycaster();
    mouse = new THREE.Vector2();

    //PlaneBufferGeometry: platform to lay cubes
    var geometry = new THREE.PlaneBufferGeometry( 10000, 10000 );
    geometry.rotateX( - Math.PI / 2 );

    plane = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { visible: false } ) );
    scene.add( plane );

    objects.push( plane );

    // Lights

    var ambientLight = new THREE.AmbientLight( 0x606060 );
    scene.add( ambientLight );

    var directionalLight = new THREE.DirectionalLight( 0xffffff );
    directionalLight.position.x = Math.random() - 0.5;
    directionalLight.position.y = Math.random() - 0.5;
    directionalLight.position.z = Math.random() - 0.5;
    directionalLight.position.normalize();
    scene.add( directionalLight );

    var directionalLight = new THREE.DirectionalLight( 0x808080 );
    directionalLight.position.x = Math.random() - 0.5;
    directionalLight.position.y = Math.random() - 0.5;
    directionalLight.position.z = Math.random() - 0.5;
    directionalLight.position.normalize();
    scene.add( directionalLight );

    renderer = new THREE.CanvasRenderer();
    renderer.setPixelRatio( window.devicePixelRatio );
    renderer.setSize( window.innerWidth, window.innerHeight );
    container.appendChild(renderer.domElement);

    document.addEventListener( 'mousedown', onDocumentMouseDown, false );
    //document.addEventListener( 'keydown', onDocumentKeyDown, false );
    //document.addEventListener( 'keyup', onDocumentKeyUp, false );

    //

    window.addEventListener( 'resize', onWindowResize, false );

}

function onWindowResize() {

    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();

    renderer.setSize( window.innerWidth, window.innerHeight );

    render();

}

function onDocumentMouseDown( event ) {

    event.preventDefault();

    mouse.x = ( event.clientX / renderer.domElement.clientWidth ) * 2 - 1;
    mouse.y = - ( event.clientY / renderer.domElement.clientHeight ) * 2 + 1;

    raycaster.setFromCamera( mouse, camera );

    var intersects = raycaster.intersectObjects( objects );

    if ( intersects.length > 0 ) {

        var intersect = intersects[ 0 ];

        if ( isShiftDown ) {

            if ( intersect.object != plane ) {

                scene.remove( intersect.object );

                objects.splice( objects.indexOf( intersect.object ), 1 );

            }

        } else {

            var voxel = new THREE.Mesh( cubeGeometry, cubeMaterial );
            voxel.position.copy( intersect.point ).add( intersect.face.normal );
            voxel.position.divideScalar( 50 ).floor().multiplyScalar( 50 ).addScalar( 25 );
            scene.add( voxel );

            objects.push( voxel );

        }

        render();

    }

}

function render() {

    renderer.render( scene, camera );

}
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/renderers/CanvasRenderer.js"></script>
<script src="https://threejs.org/examples/js/renderers/Projector.js"></script>

看这里的飞机

【问题讨论】:

    标签: three.js 3d


    【解决方案1】:

    我推荐使用THREE.OrbitControls。

    添加轨道控制:

    orbitControls = new THREE.OrbitControls(camera);
    

    并持续为您的场景设置动画:

    function render() {
        renderer.render( scene, camera );
        requestAnimationFrame(render);
    }
    

    您还必须管理THREE.OrbitControls 和鼠标事件 (onDocumentMouseDown) 如何相互作用。

    一种可能性是在onDocumentMouseDown 中只处理鼠标左键:

    function onDocumentMouseDown( event ) {
    
        if ( event.button != 0 ) // 0 means left mouse button
            return; 
    

    并通过鼠标右键旋转场景。这可以通过设置OrbitControls 的.mouseButtons 属性来完成:

    orbitControls.mouseButtons = {
        LEFT: THREE.MOUSE.RIGHT,
        MIDDLE: THREE.MOUSE.MIDDLE,
        RIGHT: THREE.MOUSE.LEFT
    }
    

    进一步说明,您可以通过分别设置.enablePan、.enableZoom.enableRotate 来启用或禁用窗格、缩放和旋转。

    看下面的例子,盒子是用鼠标左键定位的,场景可以通过按住鼠标右键来旋转:

    var container;
    var camera, scene, renderer;
    var plane;
    
    var mouse, raycaster, isShiftDown = false;
    
    var cubeGeometry = new THREE.BoxBufferGeometry( 50, 50, 50 );
    var cubeMaterial = new THREE.MeshLambertMaterial( { color: 0x00ff80, overdraw: 0.5 } );
    
    var objects = [];
    
    init();
    render();
    
    function init() {
    
        container = document.createElement( 'div' );
        document.body.appendChild( container );
    
        camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 10000 );
        camera.position.set( 500, 800, 1300 );
        camera.lookAt( 0, 0, 0 );
    
        scene = new THREE.Scene();
        scene.background = new THREE.Color( 0xf0f0f0 );
    
        var gridHelper = new THREE.GridHelper( 1000, 20 );
        scene.add( gridHelper );
    
        raycaster = new THREE.Raycaster();
        mouse = new THREE.Vector2();
    
        //PlaneBufferGeometry: platform to lay cubes
        var geometry = new THREE.PlaneBufferGeometry( 10000, 10000 );
        geometry.rotateX( - Math.PI / 2 );
    
        plane = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { visible: false } ) );
        scene.add( plane );
    
        objects.push( plane );
    
        // Lights
    
        var ambientLight = new THREE.AmbientLight( 0x606060 );
        scene.add( ambientLight );
    
        var directionalLight = new THREE.DirectionalLight( 0xffffff );
        directionalLight.position.x = Math.random() - 0.5;
        directionalLight.position.y = Math.random() - 0.5;
        directionalLight.position.z = Math.random() - 0.5;
        directionalLight.position.normalize();
        scene.add( directionalLight );
    
        var directionalLight = new THREE.DirectionalLight( 0x808080 );
        directionalLight.position.x = Math.random() - 0.5;
        directionalLight.position.y = Math.random() - 0.5;
        directionalLight.position.z = Math.random() - 0.5;
        directionalLight.position.normalize();
        scene.add( directionalLight );
    
        renderer = new THREE.CanvasRenderer();
        renderer.setPixelRatio( window.devicePixelRatio );
        renderer.setSize( window.innerWidth, window.innerHeight );
        container.appendChild(renderer.domElement);
    
        orbitControls = new THREE.OrbitControls(camera); 
        orbitControls.mouseButtons = {
    	    LEFT: THREE.MOUSE.RIGHT,
    	    MIDDLE: THREE.MOUSE.MIDDLE,
    	    RIGHT: THREE.MOUSE.LEFT
        }
    
        document.addEventListener( 'mousedown', onDocumentMouseDown, false );
       
        window.addEventListener( 'resize', onWindowResize, false );
    }
    
    function onWindowResize() {
    
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
    
        renderer.setSize( window.innerWidth, window.innerHeight );
    }
    
    function onDocumentMouseDown( event ) {
    
        if ( event.button != 0 )
           return;
    
        event.preventDefault();
    
        mouse.x = ( event.clientX / renderer.domElement.clientWidth ) * 2 - 1;
        mouse.y = - ( event.clientY / renderer.domElement.clientHeight ) * 2 + 1;
    
        raycaster.setFromCamera( mouse, camera );
    
        var intersects = raycaster.intersectObjects( objects );
    
        if ( intersects.length > 0 ) {
    
            var intersect = intersects[ 0 ];
    
            if ( isShiftDown ) {
    
                if ( intersect.object != plane ) {
    
                    scene.remove( intersect.object );
    
                    objects.splice( objects.indexOf( intersect.object ), 1 );
    
                }
    
            } else {
    
                var voxel = new THREE.Mesh( cubeGeometry, cubeMaterial );
                voxel.position.copy( intersect.point ).add( intersect.face.normal );
                voxel.position.divideScalar( 50 ).floor().multiplyScalar( 50 ).addScalar( 25 );
                scene.add( voxel );
    
                objects.push( voxel );
    
            }
        }
    }
    
    function render() {
        renderer.render( scene, camera );
        requestAnimationFrame(render);
    }
    <script src="https://threejs.org/build/three.min.js"></script>
    <script src="https://threejs.org/examples/js/renderers/CanvasRenderer.js"></script>
    <script src="https://threejs.org/examples/js/renderers/Projector.js"></script>
    <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>

    【讨论】:

      猜你喜欢
      • 2013-09-20
      • 1970-01-01
      • 2013-07-29
      • 2012-12-09
      • 2020-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多