2016-11-01 15 views
0

私はあらゆるところでこれを解決するために探しています。 OrbitControlsとTrackballControllsでは、カメラが水平に留まらないようです! TrackballControllsで移動すると、シーンが回転し始めます。 OrbitControllsを左から右にドラッグするとシーンが回転します。 TrackballControlsを使用することができますが、シーンの中心を移動するときにカメラの水平線を水平に保ちたいと思います。これは可能ですか?3つのJSレベルの地平線カメラ

マイコード:

// SETUP GLOBAL VARIABLES 

    var camera, controls, scene, renderer; 
    // PLANET PHYSICAL LOCATIONS 
    var sun, mercPL, venPL, earthPL, marsPL, jupPL, satPL, urPL, nepPL; 
    // TIME, AND SCALARS 
    var now, scalar, planetScalar; 

    init(); 
    animate(); 

    function init() { 

     scene = new THREE.Scene(); 

     renderer = new THREE.WebGLRenderer(); 
     renderer.setPixelRatio(window.devicePixelRatio); 
     renderer.setSize(window.innerWidth, window.innerHeight); 

     var container = document.getElementById('container'); 
     container.appendChild(renderer.domElement); 

     camera = new THREE.PerspectiveCamera(60, window.innerWidth/window.innerHeight, 1, 100000); 
     camera.position.z = 200; 

     controls = new THREE.OrbitControls(camera, renderer.domElement); 
     //controls.addEventListener('change', render); // add this only if there is no animation loop (requestAnimationFrame) 
     controls.enableDamping = true; 
     controls.dampingFactor = 0.8; 
     controls.enableZoom = true; 




     // ADD THE SUN PHYSICAL LOCATION 
     var geometry = new THREE.SphereGeometry(5, 30, 30, 0, Math.PI * 2, 0, Math.PI * 2); 
     var material = new THREE.MeshBasicMaterial({color: "Yellow"}); 
     sun = new THREE.Mesh(geometry, material); 
     scene.add(sun); 

     var segmentCount = 32, 
      radius = 80, 
      geometry = new THREE.Geometry(), 
      material = new THREE.LineBasicMaterial({ color: 0xFFFFFF }); 

     for (var i = 0; i <= segmentCount; i++) { 
      var theta = (i/segmentCount) * Math.PI * 2; 
      geometry.vertices.push(
       new THREE.Vector3(
        Math.cos(theta) * radius, 
        Math.sin(theta) * radius, 
        0));    
     } 
     scene.add(new THREE.Line(geometry, material)); 

     var segmentCount2 = 32, 
      radius2 = 120, 
      geometry2 = new THREE.Geometry(), 
      material2 = new THREE.LineBasicMaterial({ color: 0xFFFFFF }); 

     for (var i = 0; i <= segmentCount2; i++) { 
      var theta = (i/segmentCount2) * Math.PI * 2; 
      geometry2.vertices.push(
       new THREE.Vector3(
        Math.cos(theta) * radius2, 
        Math.sin(theta) * radius2, 
        0));    
     } 

     scene.add(new THREE.Line(geometry2, material2)); 

     // 

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

     render(); 



    } 

    function onWindowResize() { 

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

    } 


    function animate() { 

      requestAnimationFrame(animate); 
      controls.update(); 

      render(); // MUST BE HERE FOR ANIMATION 

    } 


    function render() { 

      renderer.render(scene, camera); 
    } 

ありがとう!

答えて

2

おそらくこれはあなたを助けることができます(すべてのオプションが軌道ライブラリにコメントしている)

レベルホライゾン:オービットの

controls.minPolarAngle = Math.PI/2; 
controls.maxPolarAngle = Math.PI/2; 

フォーカス:

controls.target = (cube.position); 

結果:(注意:私のマウスコントロールは逆さまです(軌道右/左パン)

Three.js Lock Orbit Controls

編集:あなたのコメントコードを確認した後、私は、これはあなたが欲しいものだと思う:

Three.js Orbit Controls pt 2.

要旨はということです:

a)は、あなたがアップでカメラを提供する必要がありますベクトル:

camera.up.set(0, 0, 1); 

そして

b)はカメラで太陽をターゲット:

camera.lookAt(sun.position); 

あなたはまだ減衰して再生し、角度をロック(あなたがそれらを必要とする場合、垂直制約もある)とヨーダウンスピードアップが、私は望むことができますこれはあなたを近づけます。

+0

それは私がやっていることではありません。私はこの種のやりとりを探しています:http://minorplanetcenter.com/db_search/show_orbit?utf8=&&number=&designation=2016+NP21&name=&epoch=2016-07-31.0&peri=171.3873438&m=349.42313&node=144.6257306&incl = 33.4926092&e = 0.154857744&a = 2.615223&commit =インタラクティブ+オービット+スケッチ – rankind

+0

リンクが壊れていて、コピー/貼り付けするとページが壊れます。そのサイトを掘り下げて実際の例を見つけた後は、どのような相互作用があなたを参照しているのかは分かりません。スライダーコントロールを介したヨーの回転? @キノの答えはあなたが求めているものに合うようです。マウスのコントロールが反転されていることに触れていることに注意してください。マウスの右ボタンを使って軌道を描きます。 – msun

+0

私は上記の私のコードを追加しました。私はそれをどのようにしたいと思っていますか?これらの行は、シーンを上下に動かすことができないように固定しているように見えますか?ありがとう:) – rankind

関連する問題