2013-01-10 64 views
0

我試圖修改TrackballControls.js,使其旋轉像OrbitControls.js那樣,地平線保持平坦,但保持旋轉和繞過場景的能力(特別是collada建築模型)。我一直在試圖弄清楚這一天的好日子,但我是一名設計師,而不是程序員。 :-)我甚至不確定是否應該關注this.rotateCamera和/或this.update。three.js和TrackballControls - 保持地平線

(順便說一句,我只想用OrbitControls.js,但它不支持搖攝,看着大COLLADA建築模型時,這是必要的。)

任何幫助將非常感激。

+1

作爲變通,你可以嘗試使用'OrbitControls'和滑動大樓右側以模擬移動照相機左側。否則,破解'OrbitControls'可能比破解'TrackballControls'更容易。 – WestLangley

+0

我想知道是否將平移添加到軌道比向軌跡球添加水平旋轉更容易。我會看到我可以理解軌跡球如何平移並嘗試將其移入軌道。謝謝。 :-) – Andy

+1

是的,我認爲,將平移添加到OrbitControls會更容易。像這樣:'camera.position.addSelf(delta); controls.center.addSelf(delta);' – WestLangley

回答

0

自從問了這個問題已經有一段時間了,但我遇到了同樣的問題,沒有在網上找到太多討論,所以我想我會發布我的解決方案。

如果必須使用TrackballControls,你想一個平坦的地平線,你可以簡單地通過添加以下行「this.rotateCamera」結束編輯TrackballControls.js庫方法

this.object.up = new THREE.Vector3(0,1,0); 

這在(0,1,0)方向(即在y方向)鎖定攝像機向上方向。整個修改的方法函數,那麼將改爲:

this.rotateCamera = function() { 

    var angle = Math.acos(_rotateStart.dot(_rotateEnd)/_rotateStart.length()/_rotateEnd.length()); 

    if (angle) { 

     var axis = (new THREE.Vector3()).crossVectors(_rotateStart, _rotateEnd).normalize(); 
      quaternion = new THREE.Quaternion(); 

     angle *= _this.rotateSpeed; 

     quaternion.setFromAxisAngle(axis, -angle); 

     _eye.applyQuaternion(quaternion); 
     _this.object.up.applyQuaternion(quaternion); 

     _rotateEnd.applyQuaternion(quaternion); 

     if (_this.staticMoving) { 

      _rotateStart.copy(_rotateEnd); 

     } else { 

      quaternion.setFromAxisAngle(axis, angle * (_this.dynamicDampingFactor - 1.0)); 
      _rotateStart.applyQuaternion(quaternion); 

     } 

    } 

    // Lock the camera up direction 
    this.object.up = new THREE.Vector3(0,1,0); 

}; 
+0

假設它有效,不要實例化一個新的對象。 'this.object.up.set(0,1,0);' – WestLangley

+0

必須有一種簡單的方法來鎖定地平線。似乎是一件很常見的事情。 – Tyguy7