以编程方式在 3D 模型中插入骨架

Insert skeleton in 3D model programmatically

背景


我正在开展一个项目,其中用户通过 Kinect (v2) 进行扫描。结果将生成适合在游戏中使用的 3D 模型。

扫描方面进展顺利,我生成了一些很好的用户模型。
例子: 注意:这只是一个早期的测试模型。还需要清理,需要换个姿势才能正确读取骨骼数据


问题


我目前面临的问题是我不确定如何将骨骼数据放入生成的 3D 模型中。我似乎找不到可以让我以编程方式将骨架插入 3D 模型的程序。我想通过一个我可以以编程方式控制的程序来执行此操作,或者以将骨骼数据包含在文件中的方式调整 3D 模型文件。


我尝试了什么


我一直在寻找有关 Google 和 Whosebug 的类似问题,但它们通常指的是动作捕捉或骨骼动画。我知道 Maya 可以选择在 3D 模型中插入骨架,但据我所知,这始终是手动完成的。也许有一个更专业的术语来描述我要解决的问题,但我不知道。

对于如何实现骨骼插入,我是有思路的。我想象它是这样的:

  1. 扫描用户并使用Kinect生成3D模型;

    1.2。清理用户模型,去除任何变形或不必要的信息。关闭清理过程中留下的漏洞。

  2. 使用Kinect扫描用户骨骼数据

    2.2。提取骨架数据。
    2.3.获取关节位置并存储为 3D space 的 xyz 坐标。存储骨骼长度和方向。

  3. 在可以创建骨骼的程序中读取3D骨骼数据。

  4. 保存插入骨骼的新模型。


问题


谁能推荐(我知道,这可能是"opinion based")一个程序来读取骨骼数据并将其插入到 3D 模型中?是否可以为此目的使用 Maya?

提前致谢。

注意:我选择 post 此处的问题而不是 Graphics Design Stack Exchange(或其他 Stack Exchange 站点)上的问题,因为我觉得它与编码更相关,并且可能更有用将来会在这里搜索的人。如果 post 发错网站了,我们深表歉意。

你的问题中一个棘手的部分是你所说的 "inserting the skeleton" 是什么意思。通常骨骼数据与您的几何体非常分离,并存储在场景图中的不同位置(骨骼数据本质上是分层的)。

有一些文件格式您可以导出到您可以在几何体和骨架之间建立某种关联的地方,但是对于如何将两者关联在一起,这是非常特定于格式的(例如:FBX 与 Collada)。

可能最接近 "inserting" 或更恰当地说,"attaching" 骨架到网格的东西是蒙皮。您可以在那里计算权重分配,基本上确定每个骨骼对网格中给定顶点的影响程度。

这是一个很难做到的部分(无论是在编程上还是在艺术上),并且根据您的质量需求,对于最高质量需求(商业游戏、电影等),通常最多是半自动解决方案艺术家努力调整最终的权重分配 and/or 骨骼。

有一些算法在确定这些权重分配方面变得非常复杂,从简单的启发式算法,例如仅根据最近的线距离分配权重(非常粗糙,并且通常会在骨盆或肩部等棘手区域附近分崩离析)或其他算法实际上将网格视为实体体积(使用体素或四面体表示)来尝试分配权重。示例:http://blog.wolfire.com/2009/11/volumetric-heat-diffusion-skinning/

但是,您可能能够使用像 delta mush 这样的算法获得不错的结果,这种算法允许您在权重分配方面有点马虎,但仍然可以获得相当平滑的变形。

现在,如果您想在外部执行此操作,几乎任何 3D 动画软件都可以,包括像 Blender 这样的免费软件。然而,一般来说,蒙皮和角色动画往往需要相当多的艺术技巧和耐心,所以值得注意的是,让角色跳跃、跳舞、蹲伏并不像看起来那么容易 运行 即使你事先有了骨架,仍然看起来不错。从骨架到几何体的重量关联是最困难的部分。这通常是艺术家花费大量时间处理变形以使它们在各种姿势中看起来正确的结果。