从右侧摄影机到左侧,从OpenCV到Unity
我有一个问题,这几天一直困扰着我。我有一个用Opencv获得的右撇子(X-right,Y-up,Z-back)相机姿势,我想在Unity中进行可视化(X-right,Y-up,Z-forward),但我无法真正做到正确 我尝试使用四元数或矩阵进行转换,它应该只是镜像Z轴,并将摄影机变换的旋转设置为统一的计算变换,但我无法获得正确的转换 对于四元数,我尝试通过对Z和W项求反来镜像,我得到了一个坐标系(X-right,Y-down,Z-forward),这是有意义的,但这不是我想要实现的。对于矩阵,我想我应该用我的右手相机乘以一个单位矩阵,元素[2,2]设为-1,但是我没有得到我想要的 我肯定错过了一些东西,可能是我忘了的一些非常愚蠢的东西:)从右侧摄影机到左侧,从OpenCV到Unity,opencv,matrix,unity3d,camera,Opencv,Matrix,Unity3d,Camera,我有一个问题,这几天一直困扰着我。我有一个用Opencv获得的右撇子(X-right,Y-up,Z-back)相机姿势,我想在Unity中进行可视化(X-right,Y-up,Z-forward),但我无法真正做到正确 我尝试使用四元数或矩阵进行转换,它应该只是镜像Z轴,并将摄影机变换的旋转设置为统一的计算变换,但我无法获得正确的转换 对于四元数,我尝试通过对Z和W项求反来镜像,我得到了一个坐标系(X-right,Y-down,Z-forward),这是有意义的,但这不是我想要实现的。对于矩阵,
有人有什么建议吗?四元数可以被认为是绕一个轴旋转
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
分量求反来解释第一个因子。第二个因素通过翻转旋转轴来解释(围绕1,0,0旋转90度与围绕-1,0,0旋转90度相反)
如果您原来的右手四元数是q
,而左手四元数是q'
,则表示您最终得到:
q'=(-qx, -qy, qz, qw)
附加说明
- 四元数并没有天生的惯用手。四元数
同样适用于RH或LH坐标系。但是,将四元数应用于空间向量时,生成的变换将采用向量空间的惯用手q
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
分量求反来解释第一个因子。第二个因素通过翻转旋转轴来解释(围绕1,0,0旋转90度与围绕-1,0,0旋转90度相反)
如果您原来的右手四元数是q
,而左手四元数是q'
,则表示您最终得到:
q'=(-qx, -qy, qz, qw)
附加说明
- 四元数并没有天生的惯用手。四元数
同样适用于RH或LH坐标系。但是,将四元数应用于空间向量时,生成的变换将采用向量空间的惯用手q
q'=(-qx,qy,-qz,qw)
。感谢exahustivre的解释,我今天尝试了转换,但我得到的是一个具有X-right、Y-down和Z-back的坐标系。从这个坐标系中,我通过在X轴上旋转180度来实现我想要的,但是如果我在物体的Z轴上进行更多的旋转,我会得到反向旋转。当然,我可能出了什么问题。最终旋转180度的事实使我认为openCV相机的旋转可能是在一个坐标系中进行的,坐标系为X-Right、Y-Down和Z-Forward。(请参阅:)这将使开放式cv相机的观察方向相对180度,并应将转换更改为q'=(-qx,qy,-qz,qw)
。