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