我有一个问题,过去几天一直困扰着我。我有一个用Opencv右手拍摄的相机姿势(X-right,Y-up,Z-back)我希望在Unity中可视化(X-right,Y-up,Z-forward)但我不能真的设法做对了。
我尝试使用四元数或矩阵来做它,它应该只是镜像Z轴并将Unity中相机变换的旋转设置为计算变换但是我无法获得正确的转换。
使用四元数我试图通过否定Z和W术语来镜像,并且我实现了一个坐标系(X-right,Y-down,Z-forward),它是有道理的,但它不是我想要实现的。对于矩阵,我想我应该将右手相机乘以一个单位矩阵,元素[2,2]设置为-1,但是我不能得到我想要的东西。
我肯定错过了一些东西,可能是我忘记了一些非常愚蠢的东西:)
有人提出建议吗?
答案 0 :(得分:2)
可以将四元数视为围绕轴a = (ax, ay, az)
旋转角度theta
qx = ax * sin(theta/2)
qy = ay * sin(theta/2)
qz = az * sin(theta/2)
qw = cos(theta/2)
在右手坐标系中,theta
的旋转将是逆时针旋转,而在左手坐标系中,theta
的旋转将是顺时针旋转(取决于您的点 - - 视图,当然)。
因此,要将你的四元数从右手系统转移到Unity的左撇子系统,你必须考虑两个因素:
我们通过否定四元数的qz
分量来计算第一个因子。第二个因素是通过翻转旋转轴来计算的(旋转90度,大约1,0,0是旋转90度的倒数,大约是-1,0,0)。
如果你原来的右手四元数是q
而左手四元数是q'
那意味着你最终得到:
q'=(-qx, -qy, qz, qw)
q
同样适用于RH或LH坐标系。但是,将四元数应用于空间矢量时,生成的变换将采用矢量空间的旋向性。