我正在尝试将vrDisplays旋转(以四元数形式)转换为纬度和经度,因为我使用的API需要头部安装显示的当前旋转为lat和lon值。
lordofducts在unity3D论坛(https://forum.unity3d.com/threads/quaternions-and-euler-angles-to-longitude-latitude.154392/)
中回答给了我很好的希望,这实际上是可能的,但我有点卡住,因为THREE.Quaternion似乎没有ToAxisAngle()方法,我对3D几何不太好。
所以有人知道如何实现这一目标,所以我可以这样做吗?
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
});
//我注意到在我的代码中我已经有从Euler角度到lat lon的转换。所以我可能只是将Quaternion转换为Euler角度,然后将其转换为lat lon值。不过,还有一种更复杂的方法......
答案 0 :(得分:1)
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