Humanoid(人形)
Humanoid 概要
概要
VRM 的 Humaniod,主要根据能否接受运动捕捉中的 Forward kinematics(FK/正向运动学) 的运动作为标准来决定。
假设一帧的 动作(姿势) 由以下的信息来表示。:
- hips(髋骨) 的移动值
- 各骨骼的旋转值
为了让一个 Gltf Scene(Unity Hierarchy)接收这些数据并再现相同的姿势,需要满足以下条件:
- 明确 Gltf Node(Unity GameObject)和骨骼(如髋骨、脊柱、胸部等)之间的对应关系。
- 骨骼的父子关系统一。
- 接收动作前的姿势是统一的 => T-Pose。
备注
更具体地说,如果骨骼的长度不同,姿势就会有些偏差。针对这种问题的解决方案,我们称之为重定向,但在VRM中并没有专门的规范。如果 股骨、膝盖、脚踝 到 脚跟 的比例不一样,就会导致站立时脚跟在地面产生一些滑移。】
因为是以 Unity 的 HumanoidAvatar 为基础决定的,所以基本上是一样的。
https://docs.unity3d.com/Manual/AvatarCreationandSetup.html
此外,为了简化程序处理,VRM 的 Humanoid 规范增加了以下内容
- 所有的 Gltf Node (Unity GameObject) 的旋转设置为0时,就会变成初始姿势。
- 缩放值不变
备注
特别是缩放是一个很复杂的问题,如果缩放中心不是原点、存在负缩放、以及XYZ轴分别有不同的缩放的话,编写程序时处理这些问题非常麻烦。
T-Pose
对手腕和手指的初始姿态进行了规范。
- 手心朝下
- 大拇指水平放置,在 XZ平面上(从上方看) 与 Z轴夹角呈45度
Unity 的 Humanoid
在 Unity 中,有一个名为“Avatar”的对象。你可以将其设置为“Humanoid”模式。虽然 Avatar 是 Unity 的一个对象,但 Humanoid Avatar 的设置界面是 fbx importer(fbx导出器)
的一部分。因此,你不能从非 fbx 的数据创建包含 Humanoid Avatar 的模型。但是,由于存在能够从程序中创建 Humanoid Avatar 的功能,使得 UniVRM 能够创建 Humanoid Avatar。humanoid component
与 BVH 的兼容性
与初始姿势为 T-Pose
的 BVH 文件兼容。
- 将位移数据赋予 hips。
- 以 hips 为起始,逐级为子节点设置局部旋转值。
详情
骨骼列表与 Unity 文档中的 HumanBodyBones 相同。
- 对象节点的选择,与蒙皮(例如 GLTF 的 skin 和 joint,Unity 的 SkinnedMeshRenderer 等)无关
意思可能是,选择使用哪些骨骼时,可以不考虑这些骨骼是否参与蒙皮处理。 - 需要包含必要的骨骼
- 骨骼父子关系遵守 Humanoid 的定义(例如,LowerLeg 的第一个父级骨骼是 UpperLeg)
- 将“hips”作为 Root(根节点),建立以下父子关系。括号内为非必需骨骼。
-
hips - spine - chest - (upper chest) - neck - head
-
从 head 向左 - (eye)
-
从 head 向右 - (eye)
-
从 chest 或 upper chest 向左 - (shoulder) - upper arm - lower arm - hand - (fingers)
-
从 chest 或 upper chest 向右 - (shoulder) - upper arm - lower arm - hand - (fingers)
-
从 hips 向左 - upper leg - lower leg - foot - (toes)
-
从 hips 向右 - upper leg - lower leg - foot - (toes)
-
-
允许在骨骼间插入与 Humanoid 骨骼无关的节点(如 LowerLeg 的父节点为 empty,而 empty 的父节点为 UpperLeg)。
-
非必需的骨骼可以跳过(如 UpperArm的 父节点不是 shoulder 而是 chest)。
-
相关问题
参考
BaseModel(基础模型)
满足以下条件的 GameObject 可以导出为 VRM 格式:
- 附加了 Animator 组件。
- Animator 组件设置了 HumanoidAvatar
FBX
要满足上述条件,请在 fbx importer
的 rig
设置中将模型设置为 humanoid
。fbx 的 prefab 在设置为 humanoid 后,会附加Animator 组件,并且会设置 HumanoidAvatar。
要让 fbx 转化为 Humanoid,需要满足以下2个条件
- 需要有必要的骨骼
- 确保骨骼父子关系正确
此外
- 骨骼的名称可以自由设定。
参考
从 Blender 导出与 Unity 的 Humanoid 兼容的 fbx 文件
在场景中加工 FBX
不会产生问题的:
- 在 FBX Prefab 内添加子 GameObject
- 在 FBX Prefab 内禁用某些 GameObject
有时可能会遇到问题:
- 删除 FBX Prefab 内的 GameObject
- 移动 FBX Prefab 内的 GameObject(包括移动、旋转、缩放、改变父对象)
出现问题的原因
- HumanoidAvatar 与 GameObject 层级结构不一致。
HumanoidAvatar 记录了以下信息:
- 原始姿态
- Human Bone(如 hips 等)与 GameObject 的对应关系
如果对这此进行了更改,则需要重新创建。可以在下面的 HumanoidComponent 中来创建。
从 GameObject 手动创建 HumanoidAvatar
可以不依赖 fbx importer
来创建 HumanoidAvatar。
使用这个的话,
- 人型 GLTF
- 在场景上用立方体堆成的人形
对于像这样的 Hierarchy(层级结构),可以后续追加创建 HumanoidAvatar
。创建了 HumanoidAvatar 的游戏对象(无论在场景还是作为 Prefab)都可以被导出为 VRM 格式。
HumanoidComponent
HumanoidComponent
UniVRM-0.60.0
即使没有fbx文件,也可以直接从场景创建 humanoid avatar。
使用方法
准备一个有 Humanoid Bone 的场景。
举个例子
https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/RiggedFigure/glTF-Binary
接下来使用上面链接的资源来演示。
首先,请将 RiggedFigure.glb
导入到 Asset 文件夹中。使用 UniVRM 的 glb
导入功能,会生成一个prefab(预制件)。
在一个新的场景中将 RiggedFigure
的 prefab 实例化。
请使用 AddComponent 添加 Humanoid 组件。(MeshUtility.Humanoid。这包含在UniVRM中。)
正确配置骨骼。
按下 Create UnityEngine.Avatar
按钮
将创建一个新的 humanoid avatar。
保持这样,可以将其设置为 T-Pose 并进行 VRM 化。
UniHumanoid
Unity humanoid 工具与 BVH 导入器。
BVH runtime loader
var context = new BvhImporterContext();
context.Parse(path);
context.Load(); // create Skeleton hierarchy and mesh for visualize
GameObject root = context.Root;
RuntimeLoader
- Scenes/RuntimeBvhLoader.unity
RuntimeLoader 和 PoseTransfer
加载 BVH 文件,并将姿势转移到任何具有人形特征的模型上。
- Scenes/PoseTransfer.unity
加载 BVH 文件并创建带有 AnimationClip 的预制件
Drop bvh file to Assets folder. Then, AssetPostprocessor import bvh file.
将 BVH 文件拖动到 Assets 文件夹。然后,AssetPostprocessor 将导入 BVH 文件。
- 创建一个 hierarchy(层级)预制件
- 创建一个 humanoid Avatar
- 创建一个 legacy 模式的 AnimationClip
- 为 preview(预览)创建一个蒙皮网格
将预制体在场景中实例化。
这个 object 可以处理了.
骨骼映射
这段 script(脚本)可以帮助你从现有的 GameObject hierarchy(游戏对象层级)中创建一个 human avatar。首先,你需要将这个脚本附加到具有 Animator(动画控制器)的 root GameObject(根游戏对象上)。
然后按照下面进行配置
- 将模型位置设置到原点
- 模型朝向 +Z 轴
- 模型根节点没有旋转 Quaternion.identity
- 设置 hips bone
点击Guess bone mapping(猜测骨骼映射)。如果推测骨骼映射失败,你可以手动设置骨骼。
(可选步骤), 按下 Ensure T-Pose。创建 avatar。
这些 humanoid 通过 UniGLTF 导入,并利用 BoneMapping 技术创建了 human avatar。