FaceNinja

指南 · Unity · Godot 4 · three.js

在 Unity、Godot 或 three.js 中使用你的头部。

FaceNinja 头部是 MetaHuman 拓扑上的普通 GLB 或 FBX,带眼睛、牙齿、4K 纹理和 52 个 ARKit 混合变形,所以在 Unreal 之外也能用。下面介绍如何把它导入 Unity、Godot 4 和 three.js,以及如何用代码让面部动起来。

在 three.js 中渲染的 FaceNinja 头部,张嘴微笑
样本 S-16,一位合成人物,在 three.js 中从带 ARKit 形状的 GLB 加载,调高了 jawOpen 和两个 mouthSmile 形状。截图来自我们自己的测试页面。

哪个引擎用哪个文件

各引擎对应的文件
引擎文件单位
Unity带 ARKit 形状的 FBX厘米;Unity 会转换为米
Godot 4带 ARKit 形状的 GLB米,Y 轴向上
three.js带 ARKit 形状的 GLB米,Y 轴向上

两者都是真人大小。GLB 和 FBX 中都没有头发:在 Unreal 中由 MetaHuman 的毛发(Groom)替代;在其他引擎中,请自行添加头发。

可以在 Unity 中使用 MetaHuman 吗?

FaceNinja 头部是你自己的文件,采用 MetaHuman 拓扑,受我们的条款约束:可以在任何引擎中使用。你在 MetaHuman Creator 中创建的 MetaHuman 受 Epic 的许可约束,自 2025 年 6 月起,该许可也允许在其他引擎和工具中使用(Epic 的许可页面)。

Unity:导入 FBX

  1. 导入 FBX

    下载带 ARKit 形状的 FBX,拖进项目的 Assets 文件夹。

  2. 检查导入设置

    在 Model 选项卡中保持 Convert Units 打开,让厘米变为米,并保持 Import BlendShapes 打开(默认如此)。点击 Apply。

  3. 提取材质

    在 Materials 选项卡中提取纹理和材质,以便编辑。在 URP 或 HDRP 中,把材质转换为该管线的 Lit 着色器。

  4. 找到形状

    把头部放进场景。Skinned Mesh Renderer 在 BlendShapes 下列出 52 个形状,以 ARKit 形状命名。

  5. 用代码驱动

    Unity 中的权重范围是 0 到 100。

    代码
    // Unity (C#): the head's SkinnedMeshRenderer; Unity blend shape weights run 0–100
    var smr = GetComponentInChildren<SkinnedMeshRenderer>();
    var mesh = smr.sharedMesh;
    for (int i = 0; i < mesh.blendShapeCount; i++)
        if (mesh.GetBlendShapeName(i).EndsWith("jawOpen"))
            smr.SetBlendShapeWeight(i, 60f);

更想用 GLB?Unity 可以通过 glTF 导入包(例如 glTFast)读取它。

Godot 4:导入 GLB

  1. 导入 GLB

    下载带 ARKit 形状的 GLB,复制到你的项目中。Godot 会把它作为场景导入,单位为米。

  2. 找到形状

    打开场景,选中头部的 MeshInstance3D。检查器在 Blend Shapes 下按 ARKit 名称列出混合变形。

  3. 用代码驱动

    Godot 中的权重范围是 0 到 1。

    代码
    # Godot 4 (GDScript): the head's MeshInstance3D; weights run 0–1
    @onready var head: MeshInstance3D = $Head
    func _ready():
        var i := head.find_blend_shape_by_name("jawOpen")
        if i >= 0:
            head.set_blend_shape_value(i, 0.6)

three.js:加载 GLB

  1. 用 GLTFLoader 加载

    头部会以多个网格打开(皮肤、眼睛、牙齿等);每个网格都带有同样的 52 个形状名称。

  2. 按名称设置形状

    morphTargetDictionary 把每个 ARKit 名称映射到它在 morphTargetInfluences 中的索引;权重范围是 0 到 1。

    代码
    // three.js: every mesh of the head carries the same 52 names; weights run 0–1
    import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
    const gltf = await new GLTFLoader().loadAsync('head.glb');
    gltf.scene.traverse((o) => {
      const i = o.morphTargetDictionary?.jawOpen;
      if (i !== undefined) o.morphTargetInfluences[i] = 0.6;
    });
    scene.add(gltf.scene);
  3. 清澈的眼睛

    要在 three.js 中得到清澈、有反光的眼睛,下载时使用 cornea=transmission 选项,或在加载文件时替换角膜材质(文档 EN)。

为了写这篇指南,我们在 three.js 中加载了这个样本的 GLB:它以 6 个网格打开,每个网格都列出了全部 52 个 ARKit 名称。

须知

  • 同一网格,同一绑定。 每个头部的顶点顺序和 UV 都相同,所以为一个头部做的设置适用于所有头部。
  • 尺寸。 每个文件都是真人大小。下载选项 measured 会把头部缩放到估算的本人尺寸。
  • 更轻的文件。 如果 4K 超出你的需要,可以用下载选项 texture_size 请求 2K 纹理。
  • 网页预览不适合用于引擎。 请使用 GLB 或 FBX,而不是网页应用显示的压缩预览。

关于在 Unity、Godot 和 three.js 中使用头部的问题

01可以在 Unity 中使用 MetaHuman 吗?
FaceNinja 头部是普通的 FBX 或 GLB,所以可以。自 2025 年 6 月起,按照 Epic 的许可,在 MetaHuman Creator 中创建的完整 MetaHuman 也可以在其他引擎中使用;请查看其条款。
0252 个混合变形会一起导入吗?
会,并保留 ARKit 名称:在 Unity 中是 Skinned Mesh Renderer 上的 BlendShapes,在 Godot 中是 MeshInstance3D 上的 Blend Shapes,在 three.js 中是变形目标(morph target)。
03有头发吗?
这些文件里没有。在 Unreal 中由 MetaHuman 的 groom 提供;在其他引擎中,请自行添加头发。
04哪种格式更小?
带 ARKit 形状的 GLB 在 4K 纹理下约 105 MB,静态 GLB 约 65 MB。用 2K 纹理两者都会更小。

能试试带全部 52 个形状的头部吗?

能。免费创建账号,下载 20 个示例头部:每个 GLB 和 FBX 都带有全部 52 个。