【问题标题】:THREE.js - Quaternion to lat, lonTHREE.js - 四元数到纬度,经度
【发布时间】:2017-09-06 19:08:02
【问题描述】:

我正在尝试将 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
});

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

【问题讨论】:

  • (1) 仅供参考,有Vector4.setAxisAngleFromQuaternion( quaternion )。 (2) 但是,请尝试 v = new THREE.Vector3(); // reuse it! v.set( 0, 0, 1 ).applyQuaternion( quaternion ); 这应该会给你方向。

标签: three.js geometry quaternions webvr


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多