2016-12-05 54 views
0

我有一个从THREEJS例子(https://threejs.org/examples/webgl_loader_fbx.html)中导入并显示threejs.json场景的场景。场面正常,我有一个网格,我的模型放在网格的顶部。如何将THREEJS中相机的焦点更改为现有物体?

当我拖动鼠标并缩放时,相机指向屏幕的中心。但是,该模型位于场景的底部,因此常常位于相机外部。

如何将相机的中心设置为我放置的模型?

我试着加入camera.lookAt(new THREE.Vector3(0, 0, 0)),但是对于相机的中心没有任何影响,不管我改变了什么值。

下面是我的代码:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <title>three.js webgl - FBX loader</title> 
     <meta charset="utf-8"> 
     <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> 
     <style> 
      body { 
       font-family: Monospace; 
       background-color: #000; 
       color: #fff; 
       margin: 0px; 
       overflow: hidden; 
      } 
      #info { 
       color: #fff; 
       position: absolute; 
       top: 10px; 
       width: 100%; 
       text-align: center; 
       z-index: 100; 
       display:block; 
      } 
      #info a, .button { color: #f00; font-weight: bold; text-decoration: underline; cursor: pointer } 
     </style> 
    </head> 

    <body> 
     <div id="info"> 
      Test 
     </div> 

     <script src="js/three.js"></script> 

     <script src="js/controls/OrbitControls.js"></script> 

     <script src="js/loaders/FBXLoader.js"></script> 

     <script src="js/Detector.js"></script> 
     <script src="js/libs/stats.min.js"></script> 

     <script> 

      if (! Detector.webgl) Detector.addGetWebGLMessage(); 

      var container, stats, controls; 
      var camera, scene, renderer; 
      var w = 1920; 
      var h = 1080; 

      var clock = new THREE.Clock(); 

      var mixers = []; 

      init(); 

      function init() { 

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

       camera = new THREE.PerspectiveCamera(45, (window.innerWidth/window.innerHeight), 2, 2000); 

       scene = new THREE.Scene(); 

       // grid 
       var gridHelper = new THREE.GridHelper(14, 28, 0x303030, 0x303030); 
       gridHelper.position.set(0, - 0.04, 0); 
       scene.add(gridHelper); 

       // stats 
       stats = new Stats(); 
       container.appendChild(stats.dom); 

       // model 
       var manager = new THREE.LoadingManager(); 
       manager.onProgress = function(item, loaded, total) { 

        console.log(item, loaded, total); 

       }; 

       var onProgress = function(xhr) { 

        if (xhr.lengthComputable) { 

         var percentComplete = xhr.loaded/xhr.total * 100; 
         console.log(Math.round(percentComplete, 2) + '% downloaded'); 

        } 

       }; 

       var onError = function(xhr) { 
       }; 

       // BEGIN Clara.io JSON loader code 
       var objectLoader = new THREE.ObjectLoader(); 
       objectLoader.load("carport-scene.json", function (obj) { 
        scene.add(obj); 
       }); 
       // END Clara.io JSON loader code 

       renderer = new THREE.WebGLRenderer(); 
       renderer.setPixelRatio(window.devicePixelRatio); 
       renderer.setSize(window.innerWidth, window.innerHeight); 
       renderer.setClearColor(0x0000ff); 
       container.appendChild(renderer.domElement); 

       // controls, camera 
       controls = new THREE.OrbitControls(camera, renderer.domElement); 
       controls.target.set(0, 12, 0); 
       camera.position.set(25, 0, 25); 
       //camera.lookAt(new THREE.Vector3(100, 100, 100)); 
       controls.update(); 

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

       animate(); 

      } 

      function onWindowResize() { 

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

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

      } 

      // 

      function animate() { 

       requestAnimationFrame(animate); 

       if (mixers.length > 0) { 

        for (var i = 0; i < mixers.length; i ++) { 

         mixers[ i ].update(clock.getDelta()); 

        } 

       } 

       stats.update(); 

       render(); 

      } 

      function render() { 

       renderer.render(scene, camera); 

      } 

     </script> 

    </body> 
</html> 

我已经创建出这一问题的GIF: http://g.recordit.co/APLcyJKj01.gif

回答

0

通过更新controls.target.set(0, 0, 0);线固定它。看起来这是旋转控制的目标。

0

如果你知道你的对象的位置,那么你可以做

controls.target = your_object.position; // or any THREE.Vector3() 

也,你animation功能添加

controls.update(); 

0

此代码的工作:

camera.lookAt(new THREE.Vector3(0, 0, 0)); 

,但使用的是:

<script src="js/controls/OrbitControls.js"></script> 

而且该库将自动返回到给出的位置:

//x,y,z 
controls.target.set(0, 0, 0);