将Kinect's Skeleton数据匹配到XNA中的.fbx模型

本文关键字:XNA 中的 模型 fbx 数据 Kinect Skeleton | 更新日期: 2023-09-27 18:18:52

我的问题是关于我正在做的一个学校项目。它涉及到在骨骼上绘制服装(比如牛仔裤)的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属性,那么我可以看到有东西在移动。然而,被选中的骨头留在它的地方。有人有什么想法吗?

将Kinect's Skeleton数据匹配到XNA中的.fbx模型

如果您感兴趣,那么您可以在这里找到一个演示。它有使用Kinect和XNA使用实时动作捕捉的源代码。

我已经断断续续地做了一段时间了。我现在使用的一个简单的解决方案是,你使用nui骨架轨迹的点来匹配.fbx模型中各种关节的旋转。fbx模型很可能有比跟踪的关节更多的关节,对于那些你可以迭代旋转的关节。

有趣的部分:

当你的模型需要在模型空间中旋转时,Kinect会在骨骼空间-1到1中跟踪骨骼关节的位置。它们都提供了与层次结构中的父骨骼相关的子位置或旋转。此外,.fbx模型所需的旋转是围绕任意轴的。

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

假设你有一个肩膀,我们称之为点a,肘部我们称之为点b在fbx模型的绑定姿态上。骨架上有点a'和b'因此,对于绑定模型,我们将有一个从肩膀到肘部的向量V。

V = b - a

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

V' = b' - a'

所以肩膀的旋转轴是

Vhat = V叉乘V'

肩关节在Vhat周围的旋转角度

Theta = ((V点积V')/幅度(V)) *幅度(V')

对于fbx模型上的肩关节,你要绕着Vhat旋转。

这个模型可能看起来有点翻,所以你可能不得不使用一些约束或使用四元数或其他东西来帮助它看起来不像一条死鱼。

我也不确定XNA是否有一个内置的功能来围绕任意轴旋转。如果有人能再检查一下我的数学我会很感激的,我有点生疏了。

Kinect SDK仅提供头部位置或右手位置等身体部位的点。另外,你也可以从Kinect传感器读取深度流。

但是目前Kinect还不能生成人体的3D模型。你得自己去做。

我最终选择了Digital Runes选项(带有Kinect演示),除了一些我无法解决的问题外,它几乎是完美的。

但是因为我要赶去学校,我们决定彻底改变这个项目,我们的新解决方案不涉及Kinect。《Digital Runes》的例子确实有很大帮助。