Unity坐标转换
文章目录
本文从基本的坐标系转化(即均为左手或者右手)开始,后续给出左右手坐标系转化的方法,参考众多文章,只贴结论和方法,细节参考后续的参考文献。
在同一坐标系的转化比较简单,但是为了方便计算通常会采用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矩阵。
左右手坐标系转化比较简单,一般只需要某一个轴反向即可,在unity将z轴取反即可,即位置x,y不变,z值取反。旋转值(四元数),w和z值不变,x,y取反。
总结如下:
哪个轴反转,坐标位置对应的那个轴数值取反,旋转则w值和对应那个轴不变,其他取反。