2017-04-11 78 views
0

我嘗試將vrDisplays旋轉(以四元數形式)轉換爲經度和緯度,因爲我使用的API需要當前旋轉的頭部安裝顯示的經度和緯度值。THREE.js - Quaternion to lat,lon

lordofducts回答unity3D論壇(https://forum.unity3d.com/threads/quaternions-and-euler-angles-to-longitude-latitude.154392/

給了我好希望,這實際上是可能的,但我也有點卡住,因爲THREE.Quaternion似乎並不具有ToAxisAngle()方法和我三維幾何體不太好。

所以沒有人有一個想法,我怎麼能做到這一點,所以我可以這樣做?

var quat = THREE.Quaternion(); 

quat.fromArray(vrDisplay.getPose().orientation); 

var lat = //do sth with quat 
var lon = //do seth with quat 

api.rotateCamera({ 
    lat: lat, 
    lon: lon 
}); 

//我注意到,在我的代碼中,我已經有一個從歐拉角到緯度的轉換。所以我可能只是將四元數轉換成歐拉角,然後將其轉換爲經緯度值。仍然必須有更復雜的方法...

+0

(1)僅供參考,有'Vector4.setAxisAngleFromQuaternion(四元)'。 (2)但是,嘗試'v = new THREE.Vector3(); //重用它! v.set(0,0,1).applyQuaternion(quaternion);'這應該給你方向。 – WestLangley

回答

0
var look = new THREE.Vector3(); 

quatToSpherical = function(quat){ 
    look.set(0,0,1); 
    look.applyQuaternion(quat); 
    look.normalize(); 
    if(Math.abs(look.x) < 0.001) look.x = 0.001; 

    var angles = {}; 
    var radius = 1; 

    angles.lat = Math.acos(look.z/r); 
    angles.lon = Math.atan2(look.y , look.x); 

    return angles; 
} 

該解決方案僅適用於標準笛卡爾座標系。

右手座標與XY地平面系統就像我在我的設置使用權需要補償:

angles.lat = Math.acos(look.z/r) - Math.PI/2; 
angles.lon = Math.atan2(look.y , look.x) - Math.PI; 

https://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates