自定义虚拟化身创建#

高级工作流程从 ACE 动画管线模板场景开始。此场景已完全设置好,可以在 ACE 动画管线中按原样运行。在本节中,我们将引导您完成使用自定义虚拟化身模型更新此场景所需的步骤。

自定义虚拟化身模型要求#

自定义虚拟化身模型需要满足以下高级要求

  • 虚拟化身应为人型。

  • 虚拟化身需要为 USD 格式。

  • 虚拟化身的三角形总数应少于 100 万个(对于 A40 GPU 或类似产品)。

虚拟化身及其材质可以使用任何 DCC 工具(例如 Blender、Maya、Substance 3D 等)或任何第三方虚拟化身创建器(例如 Reallusion Character Creator、Ready Player Me 等)创建,只要它们具有 USD 导出器或 Omniverse 连接器,并且只要导出的资产可以修改以满足以下要求

  • 虚拟化身 USD 文件及其所有依赖项(如纹理)必须放置在自包含目录中。对纹理和其他资源的所有引用都必须仅使用相对文件路径。

  • 虚拟化身场景包含多个类型为 Mesh 的几何图元。

  • 确保头部由单个网格图元表示,该图元与身体分离。此头部网格需要是单流形的,包含眼窝和口腔。

  • 确保眼球、下牙、上牙、牙龈和舌头是单独的网格,而不是头部网格的一部分。

  • 应设置与各种网格关联的多个材质图元。

  • 类型为 SkelRoot 的骨架图元,其中包含类型为 Skeleton 的骨架图元,而骨架图元又包含多个 SkelJoints,现有几何体已蒙皮到这些 SkelJoints。

  • SkelRoot 图元必须命名为“character”。

  • 类型为 Xform 的世界变换,它是上述所有图元的父级。

将虚拟化身导入到模板场景#

一旦您的模型满足上一节中列出的要求,我们就可以继续将自定义虚拟化身导入到模板场景。

  1. 在此处下载最新的 ACE 模板场景版本:NVIDIA/ACE

    注意

    如果您已检出整个 NVIDIA/ACE git 存储库,请确保您已启用 LFS。否则,当您尝试解压缩 template_scene.zip 存档时,您将收到错误。

    注意

    请注意,模板场景类似于虚拟化身配置器生成的场景。但是,虚拟化身配置器生成的场景包含许多额外的图元、变体和逻辑,这些图元、变体和逻辑是虚拟化身配置器特有的,因此,不应将此类场景用作设置自定义虚拟化身的基础。

  2. 安装 Omniverse Launcher https://www.nvidia.com/en-us/omniverse/download/#ov-download

  3. 使用 Omniverse Launcher 安装 Omniverse USD Composer

  4. 在 USD Composer 中打开名为 Custom_Scene.usda 的模板场景。

  5. 删除名为“Example_DELETE_THIS”的示例角色。

  6. 将您自己的角色模型导入到场景中。通过在“内容”窗口中找到 USD 文件,并将其拖动到场景中来完成此操作。

  7. 确保虚拟化身的位置在 (0, 0, 0) 处居中。旋转使其面向相机。

设置动画#

Tokkio Custom Avatar Creation Tutorial: Using the Template Scene: https://youtu.be/h2DPfDL-fv0

视频教程:https://youtu.be/h2DPfDL-fv0#

注意

  • 视频中显示的图元层次结构已稍微过时,在您的场景中看起来会有所不同。“Rig_Retarget”和“main_camera”图元也不再位于视频中显示的位置。

  • 在视频中,重定向绑定显示在角色的侧面,但现在位于舞台的中心。这意味着打开骨架可视化将显示与您角色的骨架位于同一位置的“Retarget_Rig”。看到两个重叠的骨架不要惊慌,这是预期的。

  • 演示动画不再为眼睛制作动画。眼睛仍然需要像视频中显示的那样进行标记,但您可能只会在部署之前看到它们移动。

  1. 打开窗口“窗口/动画/重定向”。这将在 UI 中创建一个名为“动画重定向”的新选项卡。单击该选项卡。

  2. 从下拉菜单“骨架”中,选择新的虚拟化身的骨架图元。根据您的绑定,这将自动找到您角色的大部分所需关节。但有些需要手动添加。使用按钮“添加标签”可以添加更多标签。这些是您将从“身体”列表中需要的标签(添加未自动找到的标签):头部、左手、右手、左脚、右脚、左肩、左肘、左食指、左拇指、左中指、左无名指、左小指、右手、右肩、右肘、右食指、右拇指、右中指、右无名指、右小指。它们将出现在列表中,然后您可以分配您角色的相应关节。对于手指,您需要分配指尖。

  3. 重定向眼睛:使用“添加标签”按钮选择“自定义”两次。将添加两个自定义标签。将这些标签命名为“Left_eye”和“Right_eye”(确切的拼写至关重要),然后分配您角色的眼睛关节。这仅在您的角色在每只眼睛中都有一个关节放置在眼球的枢轴处时才有效。

  4. 在“舞台”选项卡中,找到并选择您角色的骨架。它将是类型为“Skeleton”的子图元。在此图元的属性的“动画和姿势模式”下,您可以通过单击文件夹图标来分配动画。找到名为“DemoAnimation”的动画。

  5. 按屏幕左侧的播放按钮,您应该会看到角色在移动。如果重定向结果看起来很糟糕,这里有一些已知的问题以及如何修复它们

    • 角色的躯干以不自然的方式扭曲:这意味着重定向不确定如何解决脊椎问题。在重定向选项卡中,添加一个自定义标签并将其命名为“胸部”(确切的拼写)。如果结果仍然扭曲,请添加另一个名为“腰部”的标签。

    • 角色的眼睛漂浮在头部之外。这很可能意味着眼睛关节并非直接以头部为父级。为您的角色添加一个新的重定向标签,并将其命名为“Head2”。分配眼睛关节的父关节。

    • 角色的手臂在其体内剪切。这将是因为角色的重定向姿势。在重定向选项卡中的“重定向姿势”下,单击“查看”按钮。这可能会将您的角色置于 T 姿势。如果不是,您可以选择“与...匹配”,选择“biped_tpose.usd”并单击“应用”。如果重定向姿势已经是 T 姿势,但手臂仍然剪切到体内,则可能是因为您角色的臀部或腹部比肩膀宽。为了补偿这一点,您必须在重定向姿势中向上倾斜角色的手臂。如果您没有看到角色骨架的可视化效果,您应该通过单击视口右上角的眼睛图标并选择“按类型显示/骨架”来启用此功能。在重定向选项卡中,再次单击“查看”。然后单击视口中角色的上臂关节,并将它们向上旋转几度。然后在重定向选项卡中单击“应用”。如果手臂在动画播放时仍然剪切到臀部,请再次调整姿势,直到不再剪切为止。

    • 手部姿势看起来很奇怪。使用与上述要点中描述的方法相同的方法,您可以调整手指的重定向姿势。手指应伸展开,拇指降低约 15°。

  6. 当您对重定向感到满意时,您可以再次选择您之前分配演示动画的角色骨架。相反,您现在需要分配名为“ACE_Animation_Target”的动画。分配此动画后,一旦场景部署,角色将由 ACE 控制。

添加自定义动画#

Tokkio Custom Avatar Creation Tutorial: Adding Custom Animations: https://youtu.be/pqfm50e3hpA

视频教程:https://youtu.be/pqfm50e3hpA#

注意

  • 自此视频以来,动画图已变得更加复杂。现在有三个状态机需要在重新生成之前删除。

  • 使用此工作流程只能添加姿势和手势动画。图中的其他动画具有更具体的要求,不应替换。

如果您希望添加自己的动画,您可以添加它们或替换现有动画。但是,这将更具挑战性。在舞台选项卡中,您可以扩展图元“动画”。有一个也名为“动画”的子图元,您可以在其中找到放置在不同作用域(文件夹)中的动画列表。放置它们的作用域决定了每个动画分配到的状态。“姿势”下的状态将在虚拟化身交互时自动播放。“手势”下列出的状态必须显式触发。您不能仅在此处添加自己的动画。所有这些动画都需要使用默认骨架才能兼容。因此,您希望添加的任何动画都必须首先进行转换。您可以在重定向和简单脚本的帮助下转换动画。

  1. 将您的动画拖动到场景中。您还需要此动画所基于的角色的骨架。

  2. 如果此动画不是基于您已重定向的自定义角色,您将需要为此动画来自的任何角色设置重定向。(请参阅以上步骤)

  3. 打开“脚本编辑器”窗口,该窗口位于“窗口”下拉菜单中。在脚本编辑器窗口中,单击“文件/打开”,然后在脚本文件夹中打开文件“animation_conversion.py”。

  4. 在舞台中,选择类型为“Skeleton”的图元,该图元属于您的新动画。右键单击,然后选择“复制图元路径”。然后将其粘贴到脚本中,其中显示“YOUR_SKELETON_PATH”。接下来找到类型为“SkelAnimation”的图元。也复制该图元路径,并使用它替换“YOUR_ANIMATION_PATH”。最后,您需要决定此动画应在哪个状态中使用。单击您希望添加此动画的动画列表中的作用域(例如“/World/Animations/Animations/Postures/Talking”或“/World/Animations/Animations/Gestures”)。复制该作用域的图元路径,并将其粘贴到其中显示“TARGET_STATE_SCOPE”的位置。

  5. 在脚本编辑器窗口中,点击“运行”。这可能需要几秒钟。之后,动画应已转换,现在应位于您选择的作用域内。

  6. 删除以下图元

    • “/World/AnimationGraph/PositionsAndPosturesAndGesturesStateMachine/PositionState/PositionStateMachine”

    • “/World/AnimationGraph/PositionsAndPosturesAndGesturesStateMachine/PosturesAndGesturesState/PosturesAndGesturesStateMachine”

    • “/World/AnimationGraph/FacialPosturesAndGesturesStateMachine”

  7. 保存并重新打开您的场景,以便使用新动画自动重新生成状态机。再次保存。

如果您已将动画添加到其中一个姿势状态,它将自动用作这些状态的一部分。如果您已将其添加到手势,则只有在动画管线专门触发时才会播放。

设置 Audio2Face#

本章的目标是为您的角色生成 ARKit BlendShape。如果您使用的是第三方模型,这些形状可能已经存在。您可以通过单击角色的头部网格并查看它是否具有类型为“Blendshape”的子图元来检查这一点。Audio2Face 流式传输依赖于这些形状的精确命名。如果您使用 A2F 生成形状,这将是正确的,但如果您使用的是遵循不同命名约定的第三方虚拟化身的形状,您将不得不使用脚本来转换它们。

重新分配现有 Blendshape#

Tokkio Custom Avatar Creation Tutorial: Using the Template Scene: https://youtu.be/h2DPfDL-fv0?t=503

视频教程:https://youtu.be/h2DPfDL-fv0?t=503#

注意

视频示例使用了 Reallusion 角色,该角色带有 ARKit BlendShape。但是,这不会为 A2F 产生令人满意的嘴部运动,因为 Reallusion 的“jawOpen”BlendShape 实际上并没有张开下巴。因此,如果您使用的是 Reallusion 角色,您可能需要创建或找到不同的 BlendShape 来分配给 jawOpen,例如“Mouth_Open”。如果您使用的是 Reallusion 角色,您还会遇到更多麻烦,因为有些角色不带有牙齿的 blendshape,并且没有将上牙和下牙分成单独的网格。要正确准备您的 Reallusion 角色,请按照本教程(仅第 1 部分)操作 https://www.youtube.com/watch?v=K2-lPje9T2A

如果您使用的是已经具有 ARKit 兼容 BlendShape 的模型,请按照以下步骤操作。

  1. 在打开自定义场景的情况下,转到“脚本编辑器”窗口。

  2. 在脚本编辑器窗口中,从“DefaultAssets”文件夹中打开名为“reassign_blendshapes.py”的文件。

  3. 在此脚本中,您将必须填写一些值:在名为“facial_meshes_paths”的列表中,您应该添加使用面部 BlendShape 的每个角色网格的图元路径。您可以通过检查它们是否具有类型为“BlendShape”的子图元来找出哪些网格适用。典型的例子是:头部、眉毛、面部毛发、牙齿、舌头等。一旦您找到类型为“Mesh”的图元,该图元具有类型为“BlendShape”的子图元,右键单击网格图元并选择“复制图元路径”。然后您可以将此路径粘贴到脚本中,替换示例字符串“World/YOUR_CHARACTERS_FACIAL_MESH_1”(保留引号)。使用所有面部网格的路径完成此列表。

  4. 名为“blendshape_name_mapping”的列表是一个字典。在右列中是 BlendShape 的所需名称,在左列中您可以写入您角色的 BlendShape 的对应名称。

  5. 填写完这些值后,您可以使用“运行”按钮运行脚本。

  6. 要测试您的 BlendShape 现在是否已被识别,请将“DemoAnimation”分配给您角色的骨架,然后点击播放。面部现在应该正在改变其表情。验证后,将“ACE_Animation_Target”动画重新分配给您角色的骨架。

使用 Audio2Face 生成 Blendshape#

Tokkio Custom Avatar Creation Tutorial: Generating Facial BlendShapes: https://youtu.be/8rwAs2q_DTE

视频教程:https://youtu.be/8rwAs2q_DTE#

如果您想为您的角色模型生成新的 BlendShape,请按照以下步骤操作。

  1. 要设置 A2F,您必须离开 Omniverse Composer 并使用 Omniverse Audio2Face 2023.1.1

  2. 您可以按照在线教程之一为您的角色设置 Audio2Face。理想情况下,您应该在单独的场景中执行此操作,这样您就不会弄乱当前的场景。

  3. 完成角色的 A2F 设置后,您可以使用“角色转移”选项卡中的“Blendshape 生成”功能生成 BlendShape。选择“52 ARKit 姿势”并按“导出”。

  4. 这将保存两个文件:一个名为 *.usd,另一个名为 *_usdSkel.usd。第一个只是所有 BlendShape 作为单独的网格,第二个已经设置为具有 BlendShape 的单个网格。

  5. 您可以通过两种方式将 BlendShape 分配给您的原始角色

    • 无 DCC 工具
      1. 将 *_usdSkel.usd 文件导入到您的 Custom_Scene 文件中。

      2. 打开“窗口/脚本编辑器”下的脚本编辑器窗口,并从“Scripts”文件夹加载名为“transfer_blendshapes.py”的脚本。

      3. 在舞台窗口中,在您刚导入的网格中找到头部网格,右键单击它并选择“复制图元路径”。将此路径粘贴到脚本中,其中显示“MESH 1 ORIGIN PATH”。现在找到您原始角色的对应头部网格,复制其图元路径并将其粘贴到脚本中,其中显示“MESH 1 TARGET PATH”。对其余导入的网格也执行此操作(您可以根据需要向列表中添加任意数量的元素)。

      4. 您现在应该有两个列表:“facial_meshes_origin_paths”应列出所有导入网格的路径,“facial_meshes_target_paths”应按相同顺序列出您的原始角色网格的所有对应路径。如果完成此操作,您可以单击“脚本编辑器窗口”中的“运行”。这可能需要几秒钟。之后,您的原始角色网格应具有多个类型为“BlendShape”的子图元。如果是这种情况,则传输成功。

      5. 您可以删除从 A2F 导入的内容。

      6. 您仍然缺少眼睛和下巴网格的 BlendShape。要生成这些,您需要使用另一个名为“generate_non-skin_blendshapes.py”的脚本。在您的脚本编辑器窗口中打开该脚本并填写以下值

      7. 在列表“eye_left_mesh_paths”中,填写属于左眼的所有网格的图元路径(例如,左角膜、左眼球)。在列表“eye_right_mesh_paths”中,对右眼执行相同的操作。在列表 jaw_mesh_paths 中,为与下颌一起移动的网格添加路径(例如,下牙和舌头)。

      8. 对于变量“eye_left_pivot_path”、“eye_right_pivot_path”和“pivot_jaw_path”,分配场景中放置在这些形状的旋转枢轴处的图元:对于眼睛,枢轴图元应位于每个眼球的中心,而下巴枢轴应水平居中于头部内,略微在耳朵前方。

      9. 如果您的角色是从不同的坐标系(如 Blender)导入的,您可能需要调整“axis_forward”、“axis_up”和“axis_right”以及“scale_factor”的值。Blender 模型的典型设置:axis_forward= (0, -1, 0), axis_up = (0, 0, 1), axis_right = (-1, 0, 0), scale_factor = 0.01。

      10. 设置好此功能后,您可以运行脚本。

    • DCC 工具
      1. 如果您在例如 Maya 或 Blender 中创建了角色,您可以在原始文件中添加 BlendShape。

      2. 将 A2F 创建的 *.usd 文件导入到您的原始角色文件中,将网格作为 BlendShape(或 Blender 中的“Shape Keys”)分配给您的角色。

      3. 您可能必须重命名它们以遵循下面列出的确切命名约定。如果名称不同,则它们将无法识别。

      4. 对于您的眼睛和下巴网格,您仍然必须手动制作 BlendShape。d. 然后重新导出模型。确保您像第一次一样导出它,但启用导出 BlendShape 的设置。保持导出设置一致非常重要,这样您就不会更改角色的命名、方向或层次结构,从而可能破坏您之前的重定向设置。

  6. 要检查您的 BlendShape 是否正常工作,您可以将“DemoAnimation”分配给您角色的骨架,并且当您点击播放时,他们的脸会做出表情。测试后,不要忘记再次分配“ACE_Animation_Target”。

    注意

    在更高版本的 A2F 中进行了更新:“mouthOpen”blendshape 现在以不同的方式使用,需要进行调整。您可以使用脚本“correct_mouthClose_blendshape.py”自动进行此更改。在“target_mesh_paths”下,填写使用此形状的网格的路径并运行脚本。

自定义 Blendshape#

如果您是一位经验丰富的 3D 建模师,您可能希望创建自己的 BlendShape。如果您的角色与真实面孔相差太远,以至于 A2F 传输无法产生所需的结果,那么这样做可能更有意义。您可以在第三方应用程序中执行此操作。如果导出设置中启用了该选项,Maya 和 Blender 都支持使用 Omniverse Connector 将 BlendShape 导出到 USD。

BlendShape 命名和排序约定#

(不带数字)

  1. eyeBlinkLeft

  2. eyeLookDownLeft

  3. eyeLookInLeft

  4. eyeLookOutLeft

  5. eyeLookUpLeft

  6. eyeSquintLeft

  7. eyeWideLeft

  8. eyeBlinkRight

  9. eyeLookDownRight

  10. eyeLookInRight

  11. eyeLookOutRight

  12. eyeLookUpRight

  13. eyeSquintRight

  14. eyeWideRight

  15. jawForward

  16. jawLeft

  17. jawRight

  18. jawOpen

  19. mouthClose

  20. mouthFunnel

  21. mouthPucker

  22. mouthLeft

  23. mouthRight

  24. mouthSmileLeft

  25. mouthSmileRight

  26. mouthFrownLeft

  27. mouthFrownRight

  28. mouthDimpleLeft

  29. mouthDimpleRight

  30. mouthStretchLeft

  31. mouthStretchRight

  32. mouthRollLower

  33. mouthRollUpper

  34. mouthShrugLower

  35. mouthShrugUpper

  36. mouthPressLeft

  37. mouthPressRight

  38. mouthLowerDownLeft

  39. mouthLowerDownRight

  40. mouthUpperUpLeft

  41. mouthUpperUpRight

  42. browDownLeft

  43. browDownRight

  44. browInnerUp

  45. browOuterUpLeft

  46. browOuterUpRight

  47. cheekPuff

  48. cheekSquintLeft

  49. cheekSquintRight

  50. noseSneerLeft

  51. noseSneerRight

  52. tongueOut

设置相机#

相机“camera_main”将用作场景的视图。要查看此视图,请单击视口顶部附近的相机图标按钮。从下拉菜单中选择“相机/camera_main”。您会注意到名称旁边有一个锁定符号。如果您希望调整其位置,可以解锁此相机。现在您可以移动相机。如果您更改与角色的距离,您可能还需要调整相机属性中的“焦点距离”,以确保角色处于焦点中。但请注意不要停留在该视图中并意外再次更改它。对视图的取景感到满意后,您可以切换回“透视”相机。

运行场景#

要运行和测试场景,您必须将整个资产目录(包括 USD 场景文件及其所有依赖项)上传到二进制工件存储。然后更新 UCS 应用程序 YAML 文件以引用您的新场景。有关更多信息,请参见此处:资源下载器