gpt4 book ai didi

opencv - 使用 Unity3D 解决 PnP

转载 作者:太空宇宙 更新时间:2023-11-03 21:51:14 36 4
gpt4 key购买 nike

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

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

我正在努力理解如何将 solvePnP 函数给出的结果用于我的 3D 世界。

到目前为止,我所做的是:使用 solvePnP 函数获取旋转和平移向量。然后使用这个旋转矢量在 3d 世界中移动我的棍子

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

当我的摇杆以特定角度放置并且我移动缓慢时,它似乎工作正常......但大多数时候它到处移动。

通过在线查找答案,大多数人在 solvePnP 之后都做了几个步骤 - 据我了解:

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

  2. 将旋转矩阵和平移向量复制到外部矩阵

  3. 逆外部矩阵

我知道如果我像在 OpenGL 中一样使用矩阵,这些步骤是必要的 - 但是 Unity3D 呢?这些额外的步骤是必要的吗?或者我可以直接使用 solvePnP 函数给出的向量(我对此表示怀疑,因为到目前为止我得到的结果并不好)。

最佳答案

这是旧的,但问题的答案是“Unity3D 怎么样?是否需要这些额外的步骤?或者我可以直接使用 solvePnP 函数给出的向量”

是:

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

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

-关于反转外部矩阵:视情况而定。如果您的对象在世界空间中位于 (0,0,0) 并且您想要放置相机,则必须反转 tvec 和 rvec 产生的变换,以获得所需的结果。另一方面,如果你的相机有一个固定的位置并且你想相对于它定位对象,你必须将相机的 localToWorld 矩阵应用于 rvec 和 tvec 产生的变换,以获得所需的结果

关于opencv - 使用 Unity3D 解决 PnP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45180989/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com