3d Three.js:使用鼠标旋转立方体

3d Three.js:使用鼠标旋转立方体,3d,three.js,rotation,mouseevent,3d,Three.js,Rotation,Mouseevent,我正在使用threejs渲染立方体。目前,我实现了一个具有不同纹理的旋转立方体。现在我正在尝试使用鼠标使立方体旋转。在我的例子中,立方体正在旋转: function animate() { mesh.rotation.x += .015; mesh.rotation.y += .015; mesh.rotation.y += .015; render(); requestAnimationFrame( animate ); } 现在我有两个选择: 我在

我正在使用threejs渲染立方体。目前,我实现了一个具有不同纹理的旋转立方体。现在我正在尝试使用鼠标使立方体旋转。在我的例子中,立方体正在旋转:

function animate() {
    mesh.rotation.x += .015;
    mesh.rotation.y += .015;
    mesh.rotation.y += .015;

    render();
    requestAnimationFrame( animate );
}
现在我有两个选择:

  • 我在移动和握住鼠标的同时旋转相机
  • 我在按住/移动鼠标的同时旋转立方体
  • 我还打算有两个州。一个是立方体自动旋转,另一个是立方体通过拖动鼠标旋转。 我已经试过轨道控制器了,但没成功。有没有简单的解决办法,就是用鼠标移动一个浮动的旋转立方体

    我的代码:

    THREE.JS

    var camera;
    var scene;
    var renderer;
    var mesh;
    var geometry;
    var material1;
    var material2;
    var material3;
    var material4;
    var material5;
    var material6;
    var materials;
    var meshFaceMaterial;
    
    
    
    init();
    animate();
    
    function init() {
    
        scene = new THREE.Scene();
        camera = new THREE.PerspectiveCamera( 30, window.innerWidth / window.innerHeight, 1, 1000);
    
        var light = new THREE.DirectionalLight( 0xffffff );
        light.position.set( 0, 1, 1 ).normalize();
        scene.add(light);
    
        geometry = new THREE.CubeGeometry( 10, 10, 10);
        material1 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub1.jpg') } );
        material2 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub2.jpg') } );
        material3 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub3.jpg') } );
        material4 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub4.jpg') } );
        material5 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub5.jpg') } );
        material6 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub6.jpg') } );
    
        materials = [material1, material3, material5, material6, material4, material2];
    
        meshFaceMaterial = new THREE.MeshFaceMaterial( materials );
    
        mesh = new THREE.Mesh(geometry, meshFaceMaterial );
        mesh.position.z = -50;
        scene.add( mesh );
    
        renderer = new THREE.WebGLRenderer();
        renderer.setSize( window.innerWidth, window.innerHeight );
        document.getElementById('render').appendChild( renderer.domElement );   
        window.addEventListener( 'resize', onWindowResize, false );
    
        render();
    }
    
    function animate() {
        mesh.rotation.x += .015;
        mesh.rotation.y += .015;
        mesh.rotation.y += .015;
    
        render();
        requestAnimationFrame( animate );
    }
    
    function render() {
        renderer.render( scene, camera );
    }
    
    function onWindowResize() {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize( window.innerWidth, window.innerHeight );
        render();
    }
    
    看看代码:
    https://codepen.io/kranzy/pen/pEjGqV

    <script src="https://dl.dropboxusercontent.com/u/3587259/Code/Threejs/three.min.js"></script>
    <script src="https://dl.dropboxusercontent.com/u/3587259/Code/Threejs/OrbitControls.js"></script>
    
    <div id="container"></div> 
    <script>
    var container, stats;
    
    var camera, controls, scene, renderer;
    
    var cross;
    
    init();
    animate();
    
    function init() {
    
      camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
      camera.position.z = 10;
    
      controls = new THREE.OrbitControls( camera );
      controls.addEventListener( 'change', render );
    
      scene = new THREE.Scene();
      // world
    
        geometry = new THREE.CubeGeometry( 10, 10, 10);
      /*
        material1 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub1.jpg') } );
        material2 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub2.jpg') } );
        material3 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub3.jpg') } );
        material4 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub4.jpg') } );
        material5 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub5.jpg') } );
        material6 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub6.jpg') } );
    
        materials = [material1, material3, material5, material6, material4, material2];
    */
        meshFaceMaterial = /*new THREE.MeshFaceMaterial( materials )*/ new THREE.MeshPhongMaterial({color: 0xff00ff});
    
        mesh = new THREE.Mesh(geometry, meshFaceMaterial );
        mesh.position.z = 0;
        scene.add( mesh );
    
    
      // lights
    
      light = new THREE.DirectionalLight( 0xffffff );
      light.position.set( 1, 1, 1 );
      scene.add( light );
    
      light = new THREE.DirectionalLight( 0x002288 );
      light.position.set( -1, -1, -1 );
      scene.add( light );
    
      light = new THREE.AmbientLight( 0x222222 );
      scene.add( light );
    
    
      // renderer
    
      renderer = new THREE.WebGLRenderer( { antialias: false } );
      renderer.setSize( window.innerWidth, window.innerHeight );
    
      container = document.getElementById( 'container' );
      container.appendChild( renderer.domElement );
    
      window.addEventListener( 'resize', onWindowResize, false );
    
    }
    
    function onWindowResize() {
    
      camera.aspect = window.innerWidth / window.innerHeight;
      camera.updateProjectionMatrix();
    
      renderer.setSize( window.innerWidth, window.innerHeight );
    
      render();
    
    }
    
    function animate() {
    
      requestAnimationFrame( animate );
      controls.update();
    
    }
    
    function render() {
      renderer.render( scene, camera );
    }
    </script>
    
    
    var容器,stats;
    摄像机、控件、场景、渲染器;
    变量交叉;
    init();
    制作动画();
    函数init(){
    摄像头=新的三个透视摄像头(60,window.innerWidth/window.innerHeight,11000);
    摄像机位置z=10;
    控制装置=新的三个控制装置(摄像机);
    控件。addEventListener('change',render);
    场景=新的三个。场景();
    //世界
    几何学=新的三次立方测量法(10,10,10);
    /*
    material1=新的THREE.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub1.jpg')});
    material2=新的THREE.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub2.jpg')});
    material3=新的THREE.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub3.jpg'))});
    material4=新的THREE.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub4.jpg')});
    material5=新的三个.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub5.jpg'))});
    material6=新的三个.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub6.jpg'))});
    材料=[材料1、材料3、材料5、材料6、材料4、材料2];
    */
    meshFaceMaterial=/*new THREE.meshFaceMaterial(材质)*/new THREE.MeshPhongMaterial({color:0xff00ff});
    网格=新的三个网格(几何体、网格面材质);
    网格位置z=0;
    场景。添加(网格);
    //灯光
    灯光=新的三个方向灯光(0xffffff);
    光。位置。设置(1,1,1);
    场景。添加(灯光);
    灯光=新的三方向灯光(0x002288);
    灯。位置。设置(-1,-1,-1);
    场景。添加(灯光);
    灯光=新的三个环境灯光(0x22222);
    场景。添加(灯光);
    //渲染器
    renderer=new THREE.WebGLRenderer({antialas:false});
    renderer.setSize(window.innerWidth、window.innerHeight);
    container=document.getElementById('container');
    container.appendChild(renderer.doElement);
    addEventListener('resize',onWindowResize,false);
    }
    函数onWindowResize(){
    camera.aspect=window.innerWidth/window.innerHeight;
    camera.updateProjectMatrix();
    renderer.setSize(window.innerWidth、window.innerHeight);
    render();
    }
    函数animate(){
    请求动画帧(动画);
    控件更新();
    }
    函数render(){
    渲染器。渲染(场景、摄影机);
    }
    
    您需要设置大于零的
    camera.position.z
    。这就是为什么不能使用OrbitControls。

    请查看代码:
    https://codepen.io/kranzy/pen/pEjGqV

    <script src="https://dl.dropboxusercontent.com/u/3587259/Code/Threejs/three.min.js"></script>
    <script src="https://dl.dropboxusercontent.com/u/3587259/Code/Threejs/OrbitControls.js"></script>
    
    <div id="container"></div> 
    <script>
    var container, stats;
    
    var camera, controls, scene, renderer;
    
    var cross;
    
    init();
    animate();
    
    function init() {
    
      camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
      camera.position.z = 10;
    
      controls = new THREE.OrbitControls( camera );
      controls.addEventListener( 'change', render );
    
      scene = new THREE.Scene();
      // world
    
        geometry = new THREE.CubeGeometry( 10, 10, 10);
      /*
        material1 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub1.jpg') } );
        material2 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub2.jpg') } );
        material3 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub3.jpg') } );
        material4 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub4.jpg') } );
        material5 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub5.jpg') } );
        material6 = new THREE.MeshPhongMaterial( { map: THREE.ImageUtils.loadTexture('img/cub6.jpg') } );
    
        materials = [material1, material3, material5, material6, material4, material2];
    */
        meshFaceMaterial = /*new THREE.MeshFaceMaterial( materials )*/ new THREE.MeshPhongMaterial({color: 0xff00ff});
    
        mesh = new THREE.Mesh(geometry, meshFaceMaterial );
        mesh.position.z = 0;
        scene.add( mesh );
    
    
      // lights
    
      light = new THREE.DirectionalLight( 0xffffff );
      light.position.set( 1, 1, 1 );
      scene.add( light );
    
      light = new THREE.DirectionalLight( 0x002288 );
      light.position.set( -1, -1, -1 );
      scene.add( light );
    
      light = new THREE.AmbientLight( 0x222222 );
      scene.add( light );
    
    
      // renderer
    
      renderer = new THREE.WebGLRenderer( { antialias: false } );
      renderer.setSize( window.innerWidth, window.innerHeight );
    
      container = document.getElementById( 'container' );
      container.appendChild( renderer.domElement );
    
      window.addEventListener( 'resize', onWindowResize, false );
    
    }
    
    function onWindowResize() {
    
      camera.aspect = window.innerWidth / window.innerHeight;
      camera.updateProjectionMatrix();
    
      renderer.setSize( window.innerWidth, window.innerHeight );
    
      render();
    
    }
    
    function animate() {
    
      requestAnimationFrame( animate );
      controls.update();
    
    }
    
    function render() {
      renderer.render( scene, camera );
    }
    </script>
    
    
    var容器,stats;
    摄像机、控件、场景、渲染器;
    变量交叉;
    init();
    制作动画();
    函数init(){
    摄像头=新的三个透视摄像头(60,window.innerWidth/window.innerHeight,11000);
    摄像机位置z=10;
    控制装置=新的三个控制装置(摄像机);
    控件。addEventListener('change',render);
    场景=新的三个。场景();
    //世界
    几何学=新的三次立方测量法(10,10,10);
    /*
    material1=新的THREE.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub1.jpg')});
    material2=新的THREE.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub2.jpg')});
    material3=新的THREE.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub3.jpg'))});
    material4=新的THREE.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub4.jpg')});
    material5=新的三个.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub5.jpg'))});
    material6=新的三个.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture('img/cub6.jpg'))});
    材料=[材料1、材料3、材料5、材料6、材料4、材料2];
    */
    meshFaceMaterial=/*new THREE.meshFaceMaterial(材质)*/new THREE.MeshPhongMaterial({color:0xff00ff});
    网格=新的三个网格(几何体、网格面材质);
    网格位置z=0;
    场景。添加(网格);
    //灯光
    灯光=新的三个方向灯光(0xffffff);
    光。位置。设置(1,1,1);
    场景。添加(灯光);
    灯光=新的三方向灯光(0x002288);
    灯。位置。设置(-1,-1,-1);
    场景。添加(灯光);
    灯光=新的三个环境灯光(0x22222);
    场景。添加(灯光);
    //渲染器
    renderer=new THREE.WebGLRenderer({antialas:false});
    renderer.setSize(window.innerWidth、window.innerHeight);
    container=document.getElementById('container');
    container.appendChild(renderer.doElement);
    addEventListener('resize',onWindowResize,false);
    }
    函数onWindowResize(){
    camera.aspect=window.innerWidth/window.innerHeight;
    camera.updateProjectMatrix();
    renderer.setSize(window.innerWidth、window.innerHeight);
    render();
    }
    函数animate(){
    请求动画帧(动画);
    控件更新();
    }
    函数render(){
    渲染器。渲染(场景、摄影机);
    }
    

    您需要设置大于零的
    camera.position.z
    。这就是为什么您不能使用OrbitControl。

    谢谢!它还可以处理html文件中的面材质。现在我想在我的文件中对此进行调整,但不幸的是,我在使用OrbitControls时再次遇到问题:
    3dcube.js:26 Uncaught TypeError:THREE.OrbitControls不是构造函数,即使在这里它也没有加载修复它。我的错是-我