我有一个装有红外摄像机的真实/物理棒,并有一些IR LED形成了我正在使用的图案,以使虚拟棒以与物理棒相同的方式移动。
为此,我在Python中使用OpenCV,并将由solvePnP计算的旋转和平移 vector 发送到Unity。
我正在努力了解如何将solvePnP函数给出的结果用于我的3D世界。
到目前为止,我所做的是:使用solvePnP函数获取旋转和平移 vector 。然后使用此旋转 vector 在3D世界中移动我的棍子
transform.rotation = Quaternion.Euler(new Vector3(x, z, y));
当我的摇杆以一定 Angular 放置并且移动缓慢时,似乎工作正常……但大多数情况下,它到处移动。
通过在线寻找答案,大多数人在solvePnP之后都需要执行几个步骤-根据我的理解:
我知道如果我像在OpenGL中那样使用矩阵,则必须执行这些步骤-但是Unity3D呢?这些额外步骤是否必要?或者我可以直接使用由solvePnP函数提供的 vector (我怀疑,到目前为止我得到的结果并不理想)。
最佳答案
这很古老,但是对以下问题的答案是:“关于Unity3D呢?这些额外的步骤是否必要?或者我可以直接使用由solvePnP函数提供的 vector 吗?”
是:
-不,您不能直接使用它们。我尝试使用Quaternion.Euler转换rvec,正如您所发布的,结果很糟糕。
是的,您必须使用Rodrigues,它可以将rvec正确地转换为旋转矩阵。
-关于外在矩阵的求逆:这取决于。
如果您的对象位于世界空间中的(0,0,0),并且您想放置相机,则必须反转tvec和rvec产生的变换,以获得所需的结果。
另一方面,如果您的摄像头具有固定的位置,并且想要相对于该对象定位对象,则必须将摄像头的localToWorld矩阵应用于rvec和tvec产生的变换,以便获得所需的结果
关于opencv - Unity3D的solvePnP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45180989/