THREE.js - 四元数到纬度,经度

THREE.js - Quaternion to lat, lon

我正在尝试将 vrDisplays 旋转(以四元数表示)转换为纬度和经度,因为我使用的 API 需要头戴式显示器的当前旋转(纬度和经度值)。

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
});

// 我注意到在我的代码中我已经有了从欧拉角到经纬度的转换。所以我可能只是将四元数转换为欧拉角,然后将其转换为经纬度值。不过,必须有一个更复杂的方法...

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