1.前言
本文从基本的坐标系转化(即均为左手或者右手)开始,后续给出左右手坐标系转化的方法,参考众多文章,只贴结论和方法,细节参考后续的参考文献。
2.坐标转化
2.1 普通转化
在同一坐标系的转化比较简单,但是为了方便计算通常会采用RT矩阵进行计算,类似与渲染中的仿射变换。计算公式如下: 如果知道ΔR和ΔT,就比较容易计算,根据一点在不同坐标系下的数值可以如下方案计算ΔR和ΔT:
public static Pose ComputeDeltaPose(Pose localPose,Pose cloudPose)
{
Vector3 localPosition = localPose.position;
Quaternion localRotation = Quaternion.Normalize(localPose.rotation);
Vector3 cloudPosition = cloudPose.position;
Quaternion cloudRotation = Quaternion.Normalize(cloudPose.rotation);
Quaternion deltaRotation = localRotation * Quaternion.Inverse(cloudRotation);
Vector3 deltaPosition = localPosition - deltaRotation * cloudPosition;
return new Pose(deltaPosition, deltaRotation);
}
也可以采用unity的matrix4X4直接求出ΔRT矩阵。
2.2 左右手坐标系转化
左右手坐标系转化比较简单,一般只需要某一个轴反向即可,在unity将z轴取反即可,即位置x,y不变,z值取反。旋转值(四元数),w和z值不变,x,y取反。 总结如下: 哪个轴反转,坐标位置对应的那个轴数值取反,旋转则w值和对应那个轴不变,其他取反。
3.结语
U3d在与一些算法打交道时,尤其在做mr设备时,经常遇到坐标转化问题,可以在转到相同手系坐标后在进行相关的切换。 参考文献: 文献一 文献二 文献三
|