将Kinect的Skeleton数据与XNA中的.fbx模型进行匹配

时间:2011-12-26 13:56:44

标签: c# xna kinect

我的问题是关于我正在研究的学校项目。 它涉及将3D服装模型(如牛仔裤)映射到骨架上 这是由我的Kinect相机生成的。

可在此处找到一个示例:http://www.youtube.com/watch?v=p70eDrvy-uM

我搜索了这个主题,发现了一些相关的主题: http://forums.create.msdn.com/forums/t/93396.aspx - 这个问题展示了使用brekel进行动作捕捉的方法。但是,我必须在XNA中提出它。

我相信答案在于3D模型的骨架数据(正确导出为.FBX文件)。有没有办法将该骨架与Kinect相机生成的骨架对齐或匹配?

提前致谢!

编辑:我正在取得一些进展。我一直在玩一些不同的模型,尝试向上移动一些骨骼(非常简单地使用CreateTranslation,浮点数是根据经过的游戏时间计算的),如果我选择了rootbone,它会起作用,但它不起作用在一些骨头上(例如手或手臂)。如果我跟踪该骨骼的变换属性,包括X,Y和Z属性,那么我可以看到某些东西正在移动。但是所选择的骨骼保留在它的位置。任何人都有任何想法......?

4 个答案:

答案 0 :(得分:7)

如果您有兴趣,那么您会找到一个演示here。它包含使用Kinect和XNA进行实时动作捕捉的源代码。

答案 1 :(得分:3)

我一直在努力工作一段时间。我现在使用的一个简单的解决方案是使用nui骨架轨迹的点来匹配.fbx模型中各种关节的旋转。 fbx模型很可能会有更多的关节,然后跟踪的是那些你可以迭代旋转的关节。

有趣的部分:

Kinect跟踪骨架空间中的骨架关节位置-1到1,而模型需要在模型空间中旋转。它们都提供与层次结构中的父骨相关的子位置或旋转。您对.fbx模型所需的旋转也围绕任意轴。

您需要的是从绑定姿势中的.fbx模型到由kinect数据表示的姿势的更改。为了得到这个,你可以做一些矢量数学来找到围绕任意轴的父关节的旋转并相应地旋转它然后沿骨架链向下移动。

假设你有一个肩膀,我们将调用点a和肘部,我们可以在fbx模型的绑定姿势上调用b点。我们将在骨架上有一个'和b'点。 所以对于绑定模型,我们将有一个从肩部到肘部的矢量V.

V = b - a

骨架模型也会有一个向量V'

V'= b' - a'

因此肩部的旋转轴将是

Vhat = V交叉乘积V'

Vhat周围肩部的旋转角度

Theta =((V dot-product V')/幅度(V))*幅度(V')

你想要通过Vhat周围的theta旋转fbx模型上的肩关节。

该模型似乎有点失败,因此您可能不得不使用一些约束或使用四元数或其他有助于它看起来不像死鱼的东西。

此外,我不确定XNA是否具有围绕任意轴旋转的内置功能。如果有人可以仔细检查我的数学,我会很感激,我有点生气。

答案 2 :(得分:0)

Kinect SDK仅提供头部位置或右手位置等身体部位。您还可以单独从Kinect传感器读取深度流。

但目前Kinect并未生成身体的3D模型。你必须自己做。

答案 3 :(得分:0)

我最终选择了数字符文选项(使用Kinect演示版),除了一些我无法解决的问题外,这几乎是完美的。

但是因为我不得不赶快上学,我们决定彻底改变项目,我们的新解决方案不涉及Kinect。数字符文的例子确实有很大的帮助。