使用Unity3D解析PNP

时间:2017-07-19 04:28:13

标签: opencv unity3d

我有一个真实/物理棒,上面附有一个红外摄像头和一些红外LED,它形成一种模式,我正在使用这种模式,使虚拟摇杆以与物理摇杆相同的方式移动。

为此,我在Python中使用OpenCV并将solvePnP计算的旋转和平移向量发送给Unity。

我很难理解如何将solvePnP函数给出的结果用于我的3D世界。

到目前为止,我所做的是:使用solvePnP函数来获取旋转和平移向量。然后使用此旋转矢量在3D世界中移动我的操纵杆

transform.rotation = Quaternion.Euler(new Vector3(x, z, y));

当我的手柄处于某个角度并且如果我移动缓慢时似乎工作正常......但大多数时候它会移动到处。

通过在线寻找答案,大多数人在solvePnP之后又做了几个步骤 - 根据我的理解:

  1. 使用Rodrigues将旋转矢量转换为旋转矩阵

  2. 将轮播矩阵和翻译向量复制到外部矩阵

  3. 反向外在矩阵
  4. 据我所知,如果我在OpenGL中使用矩阵,这些步骤是必要的 - 但是Unity3D呢?这些额外的步骤是否必要?或者我可以直接使用solvePnP函数给出的向量(我怀疑,因为到目前为止我得到的结果并不好)。

1 个答案:

答案 0 :(得分:0)

这很古老,但是对以下问题的答案是:“关于Unity3D呢?这些额外的步骤是否必要?或者我可以直接使用由solvePnP函数给出的向量”

是:

-不,您不能直接使用它们。我尝试使用Quaternion.Euler转换rvec,正如您所发布的,结果很糟糕。

-是的,您必须使用Rodrigues,它可以将rvec正确地转换为旋转矩阵。

-关于外在矩阵的求逆:这取决于。 如果您的对象位于世界空间中的(0,0,0),并且您想放置相机,则必须反转tvec和rvec所产生的变换,以获得所需的结果。 另一方面,如果您的摄像头具有固定的位置,并且想要相对于该对象定位对象,则必须将摄像头的localToWorld矩阵应用于rvec和tvec产生的变换,以获得所需的结果