2015-11-27 44 views
2

我正在使用three.js軌道控件並嘗試讓skybox跟隨攝像頭的位置。在搜索了互聯網後,我找不到合適的答案。three.js通過軌道控件獲取攝像頭位置

我的問題很簡單 - 使用軌控制時,我該如何找回相機的座標,以下不工作:

skybox.position.x = camera.position.x; //Moving skybox with camera 
skybox.position.z = camera.position.z; //Moving skybox with camera 
skybox.position.y = camera.position.y; //Moving skybox with camera 

x和z座標的值是不正確的。我也曾嘗試:

orbit_controls.object.target 

代替,但這會導致與X和Z返回不正確的值類似不正確的行爲。

控制機制的一個看似明顯的要求似乎非常困難。

回答

2

因爲沒有答案所以我做了一些額外的測試,我發現需要座標系轉換來檢索相機的正確座標。

以下將檢索相機在標準世界(x,y,z)空間中的當前位置並將其應用於天空盒。

newZ = -(camera.position.x * Math.cos(5.49779)) - (camera.position.z * Math.sin(5.49779)); 
newX = (camera.position.x * Math.cos(0.78)) + (camera.position.z * Math.sin(0.78)); 

skybox.position.x = newX; //Moving skybox with camera 
skybox.position.z = newZ; //Moving skybox with camera 
skybox.position.y = camera.position.y; //Moving skybox with camera 

因爲我在其他地方找不到這個答案,所以我希望這對其他人有用,它解決了我的問題。

+2

你會介意解釋你如何得到這些數字嗎? :)你是如何確定他們需要? –

1

我有同樣的問題,我所做的是在OrbitControls.js文件中將以下代碼行包含到THREE.OrbitControls函數中。

THREE.OrbitControls = function (object, domElement) { 

    . 
    . 
    . 

    this.getPos = function() { 
    pos = new THREE.Vector3(); 
    pos.copy(this.object.position); 
    return pos; 
    }; 
    this.getCenter = function() { 
    cent = new THREE.Vector3(); 
    cent.copy(this.center); 
    return cent; 
    }; 
    . 
    . 
    . 
} 

this.object它指向在創建控件對象,你把攝像機對象,this.center被初始化爲(0,0,0)一THREE.Vector3(),它定義了你的相機正在看。

它的工作完美。正如你所看到的是兩個吸氣功能,一個獲取攝像頭位置,另一個獲取中心。然後我從我這樣的代碼調用它:

//Create the controls object 
var controls = new THREE.OrbitControls(this.camera, this.renderer.domElement); 
//get the camera position whenever you want 
var cameraPosition = controls.getPos(); 
+0

嗯,我不知道爲什麼,這不是對你提出的方法的反思,因爲它可能是我的目的,但是使用上面的確切代碼我發現它不會返回正確的座標。使用輔助軸作爲指導(正如我確認我的做法是正確的),它似乎沒有返回正確的值。 –

相關問題