我有一个 kinect 应用程序,它将关节的位置作为 3D 空间中的点发送给我。关节的顺序如下图所示。
现在我想将它们移动到另一个使用 COLLADA 坐标系的应用程序中。
我的想法:如果我想旋转肩部,我需要向量(Rshoulder - Relbow)并将其存储为 VX,然后我需要找到 2 个正交向量作为 Y 和 Z,然后计算一个四元数。我可能完全错了,但这只是我目前的心态..
简而言之:我如何成功地将 Y UP 系统中有 2 个给定点的旋转计算为 Z 向上系统的旋转?
我有一个 kinect 应用程序,它将关节的位置作为 3D 空间中的点发送给我。关节的顺序如下图所示。
现在我想将它们移动到另一个使用 COLLADA 坐标系的应用程序中。
我的想法:如果我想旋转肩部,我需要向量(Rshoulder - Relbow)并将其存储为 VX,然后我需要找到 2 个正交向量作为 Y 和 Z,然后计算一个四元数。我可能完全错了,但这只是我目前的心态..
简而言之:我如何成功地将 Y UP 系统中有 2 个给定点的旋转计算为 Z 向上系统的旋转?
您应该先将这些点转换为您的内部坐标系,然后再执行其他任何操作。交换 Y 轴和 Z 轴很简单——只需交换 y 和 z 坐标即可。如果你想用矩阵链做所有事情,你可以制作一个矩阵来为你做这件事:
swapYZ_xyz = [ 1 0 0 ] or, swapYZ_xyzw = [ 1 0 0 0 ]
[ 0 0 1 ] [ 0 0 1 0 ]
[ 0 1 0 ] [ 0 1 0 0 ]
[ 0 0 0 1 ]
请注意,这种变换不是旋转:它是反射。您需要在这里进行反射 -没有旋转可以将左手坐标系映射到右手坐标系(根据您的问题要求),而反射总是在左手和右手之间转换。
这也是为什么四元数表示对于这种整体坐标转换没有任何意义:四元数自然只表示旋转。
一旦您在内部坐标系中拥有所有内容,确定每个关节的旋转是一个更复杂的问题(我不会在这里详细解决一个问题,原因如下......)
首先,没有额外的信息,每个关节的旋转都没有很好的定义。为了看到这一点,假设您有一组与给定关节位置一致的旋转:然后您可以将两个关节之间的任何“骨骼”旋转到任意角度,在不改变关节位置的情况下改变两个关节的旋转。为了消除这种冗余,您需要在某些关节处指定额外的约束——也就是说,您需要对有关(例如)肘部如何旋转的知识进行编码。
其次,一旦您解决了上述歧义,您仍然会遇到难以定义的情况——例如,如果手臂是直的,您实际上无法分辨上臂相对于您的手和肩膀是如何旋转的。任何求解器都需要以某种方式处理这种情况 - 并记住您的数据会很嘈杂......
最好的整体解决方案可能是创建姿势的数学模型,并运行卡尔曼滤波器来整合(嘈杂的)输入数据。这是一项艰巨的任务,但它可以让您以稳健的方式处理嘈杂的数据和瞬态歧义。