【问题标题】:Right hand camera to left hand, OpenCV to Unity右手相机到左手,OpenCV 到 Unity
【发布时间】:2017-01-23 22:02:18
【问题描述】:

最近几天我有一个问题一直困扰着我。我有一个用 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,但是我没有得到我想要的。

我肯定错过了一些东西,可能是我忘记了一些非常愚蠢的东西:)

有什么建议吗?

【问题讨论】:

标签: opencv matrix unity3d camera


【解决方案1】:

可以将四元数视为围绕轴 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 的左手系统,您必须考虑两个因素:

  1. Z 轴被取反
  2. 旋转方向从 CCW 翻转到 CW

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

如果你原来的右手四元数是q,而你的左手四元数是q'那意味着你最终得到:

q'=(-qx, -qy, qz, qw)

补充说明

  • 四元数本身并没有惯用手。 quaterion q 同样适用于 RH 或 LH 坐标系。但是,当您将四元数应用于空间向量时,生成的变换会呈现向量空间的旋向性。

【讨论】:

  • 感谢 exahustivre 的解释,我今天尝试了转换,但我得到的是一个带有 X-right、Y-down 和 Z-back 的坐标系。从这个坐标系中,我通过在 X 轴上旋转 180 度来实现我想要的,但是如果我在对象的 Z 轴上应用更多的旋转,我会得到反向旋转。
  • 我肯定有可能搞错了。您最终旋转 180 度的事实使我认为 openCV 相机的旋转可以在具有 X-Right、Y-Down 和 Z-Forward 的坐标系中给出。 (参见:i.stack.imgur.com/4iFEV.png)这将使 open-cv 相机的观察方向相反 180 度,并应将转换更改为 q'=(-qx, qy, -qz, qw)。
猜你喜欢
  • 2014-01-07
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2021-11-06
  • 2016-09-24
相关资源
最近更新 更多