unity坐标系

unity坐标系

左右手坐标系

unity 采用左手坐标系: 大拇指向x,其它指从y->z,y轴向上,z轴向前,x轴向右
opencv opengl WebGL 3dMax 采用右手坐标系 ( 参考 OpenCVForUnity\org\opencv\unity\ARUtils.cs)
左右手坐标系的互换规则可以是 x,y,z 任一坐标取反,当你定下来后,后续就要统一,比如你采用 x 取反,那后续就不要用 y ,z 取反
Matrix4x4 invertYMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(-1, 1, 1));
绕轴旋转就是伸出左手,大拇指跟轴向一致,握拳方向就是正方向
点P坐标从A坐标系到B坐标系的转换
Pb = MatrixABPa
矩阵M从A坐标系到B坐标系的转换
点P经过Ma变换和经过Mb变换后空间位置保持不变
则有 Ma
P = MatrixBAMbMatrixABP
因此 Mb = MatrixAB
MaMatrixBA
如果是取点P,保证在A,B坐标系下相机 C 的画面相同,则相机C 在A 坐标系下的矩阵为
CA = invertYMatrix * CB * invertYMatrix;
推导如下:
要保证画面相同,则点P 在2个坐标系下的相机坐标系中的位置存在关系 PA = invertYMatrix
PB
而 PA = CA^-1invertYMatrixCBPB
因此 invertYMatrix
PB = CA^-1invertYMatrixCBPB
整理得 CA = invertYMatrix
CBinvertYMatrix^-1
而 invertYMatrix == invertYMatrix^-1
最终 CA = invertYMatrix
CB*invertYMatrix
这个就是相机矩阵在2个坐标系的映射关系,保证2个相机的输出画面一致

相机方向

  • 相机方向是跟采用的左右手坐标系绑定的

    • 在右手坐标系下,相机方向就是标准的opengl处理方式,即相机方向沿z轴负方向
    • 在左手坐标系下,相机方向就是unity处理方式,沿z轴正方向
  • worldToCameraMatrix
    我们外部计算unity的投影矩阵时远近平面距离都为正值,但底层shader使用的是opengl投影矩阵,即远近平面距离都为负值
    在shader中 UNITY_MATRIX_MV 已经包含了转成OpenGL的矩阵的过程,用unity代码实现是这样

        Matrix4x4 unityToOpenGL = Matrix4x4.identify;
        unityToOpenGL.m22 = -1;
        projectionOpenGL = unityToOpenGL * projectionUnity;
    

    那么外部传入的顶点坐标转换 camera.worldToCameraMatrix 也需要转成相对OpenGL的坐标系
    camera.worldToCameraMatrix = unityToOpenGL * camera.worldToLocalMatrix;

  • 同一个模型如果想在2个坐标系下看到一致的图像,且可以调整相机缩放
    则相机在2个坐标系下的位置一样,但必须旋转才能看到模型

    • 如果右手坐标系下相机绕x轴旋转180度,则看到的图像与左手坐标系的上下颠倒,也就是相机的y轴缩放必须设为-1才能看到正常图像
    • 如果右手坐标系下相机绕y轴旋转180度,则看到的图像与左手坐标系的左右颠倒,也就是相机的x轴缩放必须设为-1才能看到正常图像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值