在过去的几天里,我一直困扰着我。我有一个用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的左手系统,您必须考虑两个因素:
  • Z轴取反
  • 旋转方向从CCW翻转为CW

  • 我们通过否定四元数的qz分量来说明第一个因素。第二个因素是通过翻转旋转轴来解释的(围绕1,0,0旋转90度是围绕-1,0,0旋转90度的逆过程)。

    如果原始的右手四元数是q,而左手四元数是q',则表示您最终得到:
    q'=(-qx, -qy, qz, qw)
    

    附加说明
  • 四元数本来就不具有惯用性。四元组q同样适用于RH或LH坐标系。但是,将四元数应用于空间 vector 时,所得的变换将具有 vector 空间的惯用性。
  • 08-20 04:26