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

时间:2017-11-29 13:34:24

标签: ios unity3d scenekit arkit

我想在我的APP中创建一个Animoji。但是当我与一些设计师联系时,他们并不知道如何设计Animoji 3D模型。我在哪里可以找到供参考的解决方案?

我可以想到的解决方案是在3D模型的表面上创建许多骨骼,当我得到blendShapes ARFaceAnchor,其中包含面部表情的详细信息时,我用它来更新骨骼动画偏面的。

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

2 个答案:

答案 0 :(得分:5)

首先,要清除空气:Animoji是一款建立在ARKit之上的产品,绝不是ARKit本身的特色。没有简单的方法可以“以这种格式构建模型并且它只是在(或类似的)Animoji中工作”。

也就是说,有多种方法可以使用ARKit出售的面部表情数据来执行3D动画,所以你如何做到这一点更多地取决于你和你的艺术家所熟悉的内容。请记住,对于其中任何一种,您可以根据自己想要的动画的实际程度使用尽可能多的混合形状。

骨骼动画

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

变形目标动画

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

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

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眉毛,其仅通过设置节点位置来制作动画。

答案 1 :(得分:0)

检出'weboji' javascript library on gitHub。我们聘请的CG艺术家可以在几分钟内将其用于工作流程,以创建3D模型。而且,这可能是避免专有格式和封闭生态系统问题的有趣方法。

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

Demo on youtube featuring a 2D 'Cartman'.