THREE.js - Quaternion to lat,lon

时间:2017-04-11 11:54:25

标签: three.js geometry quaternions webvr

我正在尝试将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值。不过,还有一种更复杂的方法......

1 个答案:

答案 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