在过去的几天里,我一直困扰着我。我有一个用Opencv拍摄的右手姿势(X右,Y向上,Z后),我想在Unity中进行可视化(X右,Y向上,Z前)。设法做到正确。
我尝试使用四元数或矩阵来完成此操作,它应该只是镜像Z轴,并将Unity中摄影机的变换旋转设置为计算出的变换,但是我无法获得正确的变换。
对于四元数,我尝试通过否定Z和W项来反射(reflect),并获得了一个坐标系(X右,Y向下,Z向前),这是有道理的,但这并不是我想要实现的。对于矩阵,我认为我应该将右手相机乘以一个单位为[2,2]的恒等矩阵,但是我没有得到想要的东西。
我肯定错过了一些东西,可能是我真的忘记了一些愚蠢的东西:)
有人建议吗?
最佳答案
四元数可以认为是围绕轴a = (ax, ay, az)
旋转 Angular theta
qx = ax * sin(theta/2)
qy = ay * sin(theta/2)
qz = az * sin(theta/2)
qw = cos(theta/2)
在右手坐标系中,
theta
的旋转将是逆时针,而在左手坐标系中,theta
的旋转将是顺时针(当然,这取决于您的观点)。因此,要将四元数从右手系统转换为Unity的左手系统,您必须考虑两个因素:
我们通过否定四元数的
qz
分量来说明第一个因素。第二个因素是通过翻转旋转轴来解释的(围绕1,0,0旋转90度是围绕-1,0,0旋转90度的逆过程)。如果原始的右手四元数是
q
,而左手四元数是q'
,则表示您最终得到:q'=(-qx, -qy, qz, qw)
附加说明
q
同样适用于RH或LH坐标系。但是,将四元数应用于空间 vector 时,所得的变换将具有 vector 空间的惯用性。