Unity坐标转换

 

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设备时,经常遇到坐标转化问题,可以在转到相同手系坐标后在进行相关的切换。
参考文献:
文献一
文献二
文献三

posted @ 2022-04-07 16:12  81192  阅读(409)  评论(0编辑  收藏  举报