如何设计 ARKit 使用的 Animoji 3D 模型?

How do I design a Animoji 3D model used by ARKit?

我想在我的应用程序中创建动话表情。但是当我接触一些设计师时,他们不知道如何设计 Animoji 3D 模型。在哪里可以找到参考的解决方案?

我能想到的解决方案是在3D模型的脸上创建很多骨骼,当我得到blendShapesARFaceAnchor,其中包含面部表情的详细信息,然后我用它来更新部分面部的骨骼动画。

感谢您的阅读。任何建议表示赞赏。

首先,澄清一下:Animoji 是构建在 ARKit 之上的产品,绝不是 ARKit 本身的功能。没有通向 "build a model in this format and it 'just works' in (or like) Animoji".

的简单路径

也就是说,有多种方法可以使用 ARKit 出售的面部表情数据来执行 3D 动画,因此如何执行更多取决于您和您的艺术家的习惯。请记住,对于其中任何一个,您都可以根据需要使用任意多或少的混合形状,具体取决于您希望动画的逼真程度。

骨骼动画

按照您的建议,创建与您感兴趣的每个混合变形相对应的骨骼,以及混合变形值到骨骼位置的映射。例如,您需要为 browOuterUpLeft 参数的骨骼定义两个位置,其中一个对应于值 0.0,另一个对应于值 1.0,您可以在这些状态之间的任何位置调整其变换. (并在网格中设置骨骼影响,使其在这两个位置之间移动会产生类似于 reference design 应用于模型时的效果。)

变形目标动画

定义多个拓扑等效的网格,每个网格对应您感兴趣的每个混合变形参数。每个网格都应该代表您的角色在该混合变形的权重为 1.0 且所有其他混合变形为 0.0 时的目标状态.

然后,在渲染时,将每个顶点位置设置为所有混合变形目标中相同顶点位置的加权平均值。伪代码:

for vertex in i..<vertexCount {
    outPosition = float4(0)
    for shape in 0..<blendShapeCount {
        outPosition += targetMeshes[shape][vertex] * blendShapeWeights[shape]
    }
}

上述算法的实际实现更有可能在 GPU 上的顶点着色器中完成,因此 for vertex 部分在那里是隐式的——您只需要提供所有混合变形作为顶点属性的目标。 (或者使用计算着色器?)

如果您使用的是 SceneKit,则可以让 Apple 通过将混合形状目标网格提供给 SCNMorpher 来为您实施算法。

This is where the name "blend shape" comes from, by the way. 谣言说内置的 ARFaceGeometry 也是这样构建的。

更简单的混合方法

正如您在 Apple's sample code 中看到的那样,您可以更简单 — 将一张脸分成单独的部分(SceneKit 中的节点)并根据混合形状参数设置它们的位置或变换。

您也可以结合其中的一些方法。例如,卡通人物可以使用变形目标进行嘴巴周围的皮肤变形,但具有浮动的 2D 眉毛,只需通过设置节点位置即可设置动画。

签出 'weboji' javascript library on gitHub。我们聘请来创建 3D 模型的 CG 艺术家在几分钟内就熟悉了工作流程。此外,这可能是一种避免专有格式和封闭生态系统问题的有趣方法。

Screenshots of a 3D Fox (THREE.JS based demo) and a 2D Cartman (SVG based demo).

Demo on youtube featuring a 2D 'Cartman'.