# VRM官方文档-汉化加强版 -【UniVRM】 # Install(安装) # Unity 的版本 ### **UniVRM-0.80.0 ~**[](https://vrm.dev/univrm/install/unity_version/#univrm-0800- "UniVRM-0.80.0 ~ への直接リンク") 结束了对 Unity-2018.4LTS 的支持,开发版本更新为 `Unity-2019.4LTS` 。
**Unity 版本** | **备注** |
---|---|
Unity-2019.4 LTS | 用于开发 UniVRM 的版本 |
Unity-2020.4 LTS | 用于发布时进行 UPM 测试的版本 |
Unity-2021 | 如果发生了问题,请到 [github](https://github.com/vrm-c/UniVRM/issues) 报告 |
Unity 版本 | 兼容性 | Scripting Runtime Version | UPM | 备注 |
---|---|---|---|---|
Unity-2017 | × | - | ||
Unity-2018.1 | × | - | ||
Unity-2018.2 | × | - | ||
Unity-2018.3 | △ | .Net4.X equivalent | C#7.3。可能可以工作,但未经验证 | |
Unity-2018.4 LTS | ◎ | .Net4.X equivalent | 用于当前的 UniVRM 开发 | |
Unity-2019.1 | ○ | .Net4.X equivalent | ||
Unity-2019.2 | ○ | - | 由于不再支持 .Net3.5,因此不需要设置 Scripting Runtime Version 版本 | |
Unity-2019.3 | ○ | - | 从 2019.3.4f1 开始, UPM(github的子文件夹)可正常运行 | |
Unity-2019.4 LTS | ◎ | - | ○ | 用于发布时进行 UPM 的测试 |
Unity-2020 | ○ | - | ○ | Editor機能(Prefabなど)が一部動作せず。`UniVRM-0.69.0` で修正 |
UniGLTF\_VRMShaders | UniVRM | VRM | |
---|---|---|---|
for GLTF | install | ||
for VRM | install | install | |
for VRM1 | install | install |
**如果你的Unity版本是(Unity-2018.3, Unity-2018.4, Unity-2019.1)** 请将 `ProjectSettings` - `Player` - `Other Settings` - `Scripting Runtime Version` 设置为 `.Net4.X equivalent`。
**现有项目** 如果存在旧 UniVRM 版本,请在安装前删除 `Assets/VRM`、`Assets/UniGLTF` (如果存在)、`Assets/VRMShaders` (如果存在) 和 `Assets/Meshutility` (如果存在)。有关更多信息,请参阅[卸载UniVRM](https://vrm.dev/en/univrm/install/univrm_uninstall/)
### **导入 unitypackage** 在菜单栏找到 `Assets` - `Import Package` - Custom Package...,并选择 `UniVRM-0.XX.X_XXXX.unitypackage`。 `Assets/VRM`、`Assets/UniGLTF` 和 `Assets/VRMShaders` 三个文件夹将会被导入到Unity项目中。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/WAJP8wOhcIC80ZVm-univrm1-by.png) ### **检查UniVRM是否导入成功** 如果UniVRM导入成功,菜单栏显示“VRM”菜单。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/GB8Udiqy07Hrhk8P-univrm-by.png) 旧版本的菜单: [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/Z8t5uOxgSIyk4YQB-univrm-by.png) 如果菜单未显示: - 打开 Console:点击 Console 窗口左上角的clear 按钮,查看是否出现任何错误(红色消息) [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/hvHlUxBORpLLl8pJ-console-by.png)[](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/xOiZAte4Cf2yVTR1-console-by.png) ### **相关章节** [如何制作VRM文件](https://docs.vrcd.org.cn/books/vrm-vrm/chapter/vrm) [导入VRM](https://docs.vrcd.org.cn/books/vrm-univrm/page/vrm-rCZ) # UPM [upm](https://vrm.dev/en/api/upm/)这种安装方式涉及 Git 以及其他相关知识。如果不想学,那直接用 [.unitypackage](https://vrm.dev/en/univrm/install/univrm_install/) 安装就行。
# 卸载UniVRM 请删除以下文件夹:文件夹 | 版本 | 备注 |
---|---|---|
Assets/VRM | UniVRM-0.XX.0.unitypackage | |
Assets/UniGLTF | v0.63.0 及以上 | UniVRM-0.XX.0.unitypackage |
Assets/VRMShaders | v0.56.0 及以上 | UniVRM-0.XX.0.unitypackage |
Assets/MeshUtility | v0.59.0 至 v0.63.0 | UniVRM-0.XX.0.unitypackage |
文件夹 | 版本 | 备注 |
---|---|---|
Assets/VRM.Samples | UniVRM-samples-0.XX.0.unitypackage | |
Assets/StreamingAssets/VRM.Samples | UniVRM-samples-0.XX.0.unitypackage |
术语 | 含义 |
---|---|
Root | 对象的最顶层父级 |
Hierarchy | 包含 Root 及其子项 |
以下这些选项可能和新版本的选项有细微的差别
##### **Force T Pose(强制 T-Pose )** 在导出之前强制将模型调整为 T-Pose。如果您已经手动将模型调整为了大致的 T-Pose,那么无需勾选此项。 ##### **Pose Freeze(姿势冻结 )** 对模型进行规范化处理。如果模型已经被规范化处理过,则不需要再次进行处理,但如果添加了未经规范化处理的部件,则需要进行处理。判断模型是否已经被规范化的方法是检查所有GameObject的旋转是否为0,缩放是否为1。在 v0.58 版本中,系统可以自动识别导出目标是否需要 PoseFreeze。
##### **UseExperimentalExporter(使用实验性导出器)** 这是导出器的序列化程序版本。无论是否选择此选项,都不会影响输出。 ##### **UseSparseAccessor (使用稀疏访问器)** 如果有很多 BlendeShape,则可以减小文件大小。 ##### **OnlyBlendshapePosition (仅导出BlendShape位置)** 仅导出 BlendShape 的位置信息,不包括法线和切线。可以缩小文件大小。请注意,如果导出目标是由 UniVRM-0.53 或更早版本创建的,则在导入时可能会出现错误。 ##### **ReduceBlendshape (减少BlendShape)** 不导出未被 BlendShapeClip 设置所引用的 BlendShape。可以减小文件大小。 ##### **ReduceBlendshapeClip(减少BlendShapeClip)** 不导出预设为 Unknown的BlendShapeClip。与 ReduceBlendshap 配合使用。 ##### **RemoveVertexColor(移除顶点颜色)** 不导出顶点颜色。在GLTF中,并没有禁用顶点色的设置。在UniVRM中,只有unlit材质支持顶点色。 #### **错误项** 每个版本的判定message | 0.56 | 0.57 | 0.58 |
---|---|---|---|
The Root translation, rotation and scale will be dropped. Root 的平移、旋转、缩放将被删除 | error | warn | error(移動は可) (允许有位移) |
Jaw bone 下巴骨骼 | warn | warn | warn |
Same name bone 同名骨骼 | error | warn(自動リネーム) (会自动重命名) | warn |
Vertex color 顶点颜色 | warn | warn | warn |
Unknown shader 为止着色器 | warn | warn | warn |
Require source 需要源文件 | error | error | error |
Require no parent 不需要父级 | ok | ok | error(NEW) |
Require Z+ forward 需要 Z+ 朝向 | ok | ok | error(NEW) |
Require animator 需要动画器 | error | error | error |
Require humanoid avatar 需要人形虚拟形象 | error | error | error |
Require Title/Version/Author 需要标题/版本/作者(缺少必要的元数据) | error | error | error |
No active mesh 没看有活动网格 | error | error | error |
Prefab export 预制体导出 | error | error | ok(NO\_ACTIVE\_MESHだった) (无活动网格) |
Springbone validation 弹簧骨骼验证 | ok | ok | warn |
有Error提示会阻止导出,有Warn提示依然能导出,且一部分情况程序会自动修正。
##### **Require source【需要源文件】** 请在场景中选择一个可以导出为 VRM 文件的有效对象 ##### **Require animator.【需要动画器】** Root 的 Animator 没有 Avatar(非人形化身/non-humanoid)。 ##### **Require animator.avatar【需要 Animator.avatar 】** Root的Animator中找不到avatar(非人形化身/non-humanoid)。 ##### **Animator.avatar is not valid.【Animator.avatar 无效】** Root的Animator.avatar不正常(非人形化身/non-humanoid)。 ##### **Animator.avatar is not humanoid. Please change model's AnimationType to humanoid.** **【Animator.avatar 不是人型化身。请将模型的 AnimationType (动画类型)更改为 humanoid】** Root 的 Animator 的 avatar 不是 `humanoid`。请在 FBX 的 import 设置中的 rig 中改为 `humanoid`。 从检查器(Inspector)面板更改设置:`FBX Import` -> `rig` -> `AnimationType` ##### **Require Title【需要标题信息】** 请在对话框中输入此模型的标题。 ##### **Require Version【需要版本信息】** 请在对话框中输入此模型的版本。 ##### **Require Author【需要作者信息】** 请在对话框中输入此模型的作者。 ##### **No active mesh【无活动网格】** 层级中没有活动网格。 ##### **FileName ‘{0}’ is too long.【文件名“{0}”太长】** 材质、纹理和网格的名称太长。 请重命名。 ##### **The Root translation, rotation and scale will be dropped【根平移、旋转和缩放将被删除】** Root 中设置了移动、旋转和缩放值。如果直接导出,Root 的 TRS 将会被移除。关于移动,可能大部分情况下没有问题,但是对于旋转和缩放,可能不会按照预期进行,请注意。TRS 指 Translation(平移)、Rotation(旋转)和Scale(缩放)
##### **Jaw bone is included. It may not what you intended. Please check the humanoid avatar setting screen【包含下巴骨骼。这可能不是你想要的。请查看 humanoid.avatar 设置界面】** humanoid设置中包括了下巴。在导入FBX文件时,有可能会自动分配下巴骨骼。因此,面部的部分(例如刘海)可能会被错误地识别为下巴并分配给下巴骨骼。如果错误地将前发等部位分配给下巴,并且下巴的姿势进行变化,刘海可能会出现异常的运动。请在检查器中的 Inspector FBX Importer -> rig 中移除这个设置。 ##### **There are bones with the same name in the hierarchy. They will be automatically renamed after export【在层级结构中存在相同名称的骨骼。它们将在导出后自动重命名】** 如果模型中存在相同名称的骨骼,允许导出该模型。在导出对话框中只会给出警告消息,这些骨骼将被自动重命名。 ##### **This model contains vertex color【此模型包含顶点色】** 如果看到此消息,则表示层次结构中存在包含顶点颜色的网格。顶点色 | 处理方式 | 行为 |
---|---|---|
UniVRM-0.53以前 | 不支持 | 忽略顶点色效果 |
UniVRM-0.54~ | 应用 | 显示顶点色效果 |
在 v0.56 中,模型中的大纹理(例如 4096x4096)无法导出为较小的纹理(例如通过纹理导入器设置将其设置为 1024x1024 -> MaxSize)。我们已在 v0.58 中修复了此问题。
[https://github.com/vrm-c/UniVRM/issues/502](https://github.com/vrm-c/UniVRM/issues/502) #### **Mesh** 包括索引缓冲区(Index Buffer)和顶点缓冲区(Vertex Buffer)。 索引缓冲区(Index Buffer) 索引缓冲区使用整数(Int)数组。 对于一个含有5万个三角形的模型, `50000 x 4(Int = 4字节) x 3(三角形的3个顶点)=> 使用0.6MB 的容量。`虽然GLTF规范中也支持无符号短整数(unsigned short),但UniVRM的导出器目前不支持。由于最多只能存储65536个顶点,因此无法存储50000个三角形。
#### **顶点缓冲区(Vertex Buffer)** 一个顶点包括以下内容: ``` { float3 Position; // 頂点位置 4(floatサイズ) x 3(xyz) => 12byte float3 Normal; // 頂点法線 4(floatサイズ) x 3(xyz) => 12byte float2 TEXCOORD_0; // 頂点UV 4(floatサイズ) x 2(xy) => 8byte short4 JOINTS_0; // 頂点BoneIndex 2(shortサイズ) x 4(4boneまで) => 8byte float4 WEIGHTS_0; // 頂点Weight 4(floatサイズ) x 4(4boneまで) => 16byte } ```某些模型可能包含顶点颜色或辅助 UV(不支持),因此所需大小可能会有所变化。
在 UniVRM 中,切线(float4)可以在 Unity 中计算,而不是存储在 GLTF 中。通过给定顶点法线和 UV,可以使用 MIKK T Space 算法获取切线。
对于一个含有5万个顶点的模型 `50000 x (12 + 12 + 8 + 8 + 16) => 2.8MB` 的使用容量。 #### **基本大小** 如上所述,模型的基本大小是 `总图像大小 + 索引缓冲区 + 顶点缓冲区`。具有 50k 个顶点和 50k 个三角形的模型的基本大小为 `3.4MB + 总图像大小`。接下来,我们将介绍 BlendShape 的大小计算,它在某些情况下可能导致总大小爆炸。 #### **BlendShape(MorphTarget)的容量** ``` // ブレンドシェイプ頂点 { float3 Position; // 頂点位置 4 x 3 => 12byte. 必須 float3 Normal; // 頂点法線 4 x 3 => 12byte. オプション float3 Tangent; // 頂点Tangent 4 x 3 => 12byte. 記録しない } ``` 每个BlendShape使用的容量为 `50000 x (12 + 12) => 1.2MB`。 假设有20个BlendShape,则使用的容量为 `50000 x (12 + 12) x 20 => 24MB`。 假设有60个BlendShape,则使用的容量为 `50000 x (12 + 12) x 60 => 72MB`。 注意,在以下情况 - 当存在大量 BlendShape - BlendShape 所在的位置与非 BlendShape 所在的位置未分割时 容量会变得很大。接下来是关于减少BlendShape容量的方法。译者补充: 曾经看过小K直播姬官方提供的一个规范文档,里面就有提到过要把面部网格单独分开(不予其他网格合并在一起),虽然不分开也能使用,且不会有任何问题,但依然为了省资源做了规范。
##### **减少BlendShape容量的方法** 在[导出对话框](https://docs.vrcd.org.cn/books/vrm-univrm/page/vrm)中,有几个与BlendShape大小优化相关的选项。 **导出选项** 为了减小 BlendShape 的大小,前两个选项 `ReduceBlen dshape` 和 `ReduceBlendshapeClip` 是最安全的方法(no errors)。我们正在使用 `UseSparseAccessor` 来解决一些 VRM loaders的导入问题(UniVRM loader 没有问题)。如果模型是由UniVRM-0.53或更早版本制作的,则 `OnlyBlendshapePosition` 会导致导入错误。 **ReduceBlendshape(减少BlendeShape)** 未被BlendShapeClips引用的BlendShapes将不会被导出。可以减小文件大小。 **ReduceBlendshapeClip(减少BlendeShapeClip)** 属于Preset.Unknown的BlendShapeClip将不会被导出。与ReduceBlendshape结合使用。 **UseSparseAccessor(使用稀疏访问器)** 在GLTF中使用稀疏访问器功能:仅记录具有非零值的BlendShape顶点。 如果模型包含多个BlendShape,启用此选项可以帮助减小文件大小。正在修复中:存在GLTF的兼容性问题,会导致非UniVRM的加载器出现错误。
``` // ブレンドシェイプ頂点 { int Index; // 有効なブレンドシェイプの index => 4 float3 Position; // 頂点位置 4 x 3 => 12byte. 必須 float3 Normal; // 頂点法線 4 x 3 => 12byte. オプション float3 Tangent; // 頂点Tangent 4 x 3 => 12byte. 記録しない } ``` `BlendShape的有效顶点数 x (12 + 12 + 4) => ?MB` - 只是保存方式有所变化 **OnlyBlendshapePosition(仅导出BlendeShape Position)** 不导出 BlendShape 的 Normal 和 Tangent。可减小文件大小。请注意,UniVRM-0.53 之前的版本在导入时会出现错误。
**MESHUTILITY:拆分带/不带BlendShape的网格** 例如,一个模型的网格包含50k个顶点。其中有10k个(带有BlendShape)在面部,40k个(不带BlendShape)在身体上。 分割后设置一个BlendShape只需要:`10000 x (12 + 12) => 0.24MB` 分割前设置一个BlendShape需要:`50000 x (12 + 12) => 1.2MB`运行时性能也将受益于这种网格分割。但是由于渲染网格的数量增加,Draw调用可能会增加。
[Mesh Utility(面向开发,无翻译)](https://vrm.dev/gltf/mesh_utility/) #### **总结** 如果你的 VRM 文件体积过大,首先请检查 BlendShape,其次是纹理图像和预览图。 # Import(导入) # VRM导入 ### **在编辑器模式下导入VRM文件** ##### **1.在Unity中创建一个空项目** **[](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/veTLf5QZgSRzDhvA-a1ae387d7a8b2080d45798f3f2b71194140465531.png)** ##### **2.将UniVRM包导入到新建的工程中** 从[UniVRM/releases](https://github.com/vrm-c/UniVRM/releases)下载最新的`unitypackage`并安装,会生成路径为 `Assets/VRM`、`Assets/UniGLTF`和`Assets/VRMShaders` 的文件夹。如果要替换新版本的 UniVRM,建议在导入包之前删除现有的 `VRM`、`UniGLTF`、`VRMShaders` 和 `MeshUtility` 文件夹(如果有的话)。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/jEs6kwp792XtoakM-unitypackage-by.png) ##### **3.导入 VRM 文件到 Unity** **只要将VRM文件拖拽到Unity的Assets中,会自动生成与VRM文件关联的预置文件(prefab)。** [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/wvrF6aOiOPW3oIdO-vrm-by.png) 通过 `File` - `New Scene` 创建一个新的场景,或者使用一个现有的场景,然后将 VRM 生成的 Prefab 放置在场景中。将资源拖到层级窗口,就可以看到模型,如下图所示: [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/CQDCfjYc8P5fvgho-prefab-by.png) 在左边的层级窗口(Hierarchy)中选择读取的模型数据,就会在右边的监测器(Inspector)中显示各种信息。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/ImeaWu35lwDzudz0-vrm-settings.png) #### **相关部分** - [VRM的设置](https://docs.vrcd.org.cn/books/vrm-vrm/page/2vrm) - [VRM导出 ](https://docs.vrcd.org.cn/books/vrm-univrm/page/vrm) # Prefab导入和覆盖问题的注意事项 ### **0.49:** 当使用 Unity 编辑器导入 VRM 文件时,如果 `Assets` 文件夹中已存在 Material 和 BlendShapeAvatar,则不会进行覆盖。在这种情况下,Prefab 中的 Material 和 BlendShapeAvatar 的引用将设置为引用现有文件。 ### **0.46:** 当使用 Unity 编辑器导入 VRM 文件时,如果 `Assets` 文件夹中已存在 Material、BlendShapeAvatar 和 BlendShapeClip,则不会进行覆盖。但是,Mesh、Texture 和 Prefab 将被覆盖。 考虑到用户可能对 Material、BlendShapeAvatar 和 BlendShapeClip 进行了自定义设置,已存在的 Material、BlendShapeAvatar 和 BlendShapeClip 文件不会被覆盖。如果要进行覆盖,请在导入之前将它们删除。 ### **0.45 及之前版本:** 当使用 Unity 编辑器导入 VRM 文件时,Material、Mesh、Texture、BlendShape 和 Prefab 将被覆盖。 # BlendShape(混合形状) # BlendShape的设置 UniVRM v0.45 引入的新特性 - [在检查器中设置BlendShape](https://docs.vrcd.org.cn/books/vrm-univrm/page/blendshape-v045) - [BlendShape 状态](https://docs.vrcd.org.cn/books/vrm-univrm/page/blendshape-pIb) 在检查器中设置 BlendShape 的状态。 ### **VRMBlendShapeProxy(VRM混合形态代理)** **[](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/5rXxif23ZwSr9lHR-vrmblendshapeproxy-by.png)**VRMBlendShapeProxy 列表需要在播放模式才会在检查器中显示。
使用方法如下: - 在 BlendShapeAvatar 的检查器中进行设置(Editor 选项卡)。 - 将 BlendShapeClip 的值更改为0~1之间的值(在运行时)。**译者补充:** 这里新手可能难以理解,你第一次调这些滑块的时候,角色的表情可能是没有发生任何变化,这是因为目前这些 BlendShape 里面的内容是空的,你需要在别的地方先进行设置。这一个滑块实际同时控制着多个不同的面部动作(一个表情是由多个 BlendShape 混合而成的)。 **设置方法如下:** 双击图上的 BlendShapeAvatra 字段(直接双击圆点左边的文字,会给你跳转到 BlendShapeAvata 的检查器界面),然后会有一个按钮列表一样的界面一一对应刚才这个滑块列表,这个界面就是给你设置每个表情的地方,具体看后面的图,每个表情下面还能下拉出很多滑块,这个时候你就需要根据你目前制作的表情调整这一堆的滑块,然后你再回之前的滑块列表就会发现你设置过的表情就有变化了。这一部分初学者可能搞不明白。
### **BlendShapeAvatar** 可以在角色资源的检查器中创建表情 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/WUMiYR091rxw9dx7-1-by.png) 双击“Blend Shape Avatar”字段 或者 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/qY7rPb3yzqcPSgJQ-blendshapeeditor-by.png) 选择你想调整的表情的名称来切换显示。接下来以 Fun 为例子。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/xRxcN1pw7de2D7AP-vrm-fun-by.png) 将mouth\_smile、eye\_smile和eyeblow\_smile设为100译者补充:实测要完成做出官方演示的表情还需要叠加75左右的 mouth\_a 这个模型只调整 mouth\_smile 的话只会让嘴角上抬,不会让嘴张开。
可以将眉毛、眼睛和嘴巴等各个 BlendShape(混合形状) 合并成一个表情,并指定创建的 BlendShape 名称,如上图所示。 在更改滑块并创建 BlendShape 之后,请按“Apply”以记录参数。新版本似乎取消了这个地方的“Apply”按钮,不需要手动应用,老版本在滑块列表上面可以找到两个按钮。
### **BlendShape的预设** [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/EkmVj4EUR92tSJ3b-blendshape-by.png) 这是给BlendShapeClip预设的一些名字。下面是可用的预设: ##### **NEUTRAL(中性/常态/默认表情)** 作为标准的面部表情,一般是待机状态的表情。所有表情都是在这个表情的基础上进行变化,如果这个表情发生变化,为基底的其他表情全都会收到影响。
##### **A, I, U, E, O** 对应对口型同步的 あ・い・う・え・お(aa·ih·ou·E·oh)的嘴型。因为 VRM 是由日本发起的,所以这几个发音是五十音的韵母发音(啊,一,呜,欸,哦),不是英语字母或拼音的发音。但在 VRM1.0 中,将(A・I・U・E・O)替换成了国际音标(aa·ih·ou·E·oh),但发音基本是一样的。
##### **Blink** 双眼眨眼。 ##### **Blink\_L, Blink\_R** 分别是左右眼单独眨眼。 ##### **Joy, Angry, Sorrow, Fun** 喜,怒,哀,乐。 ##### **LookUp, LookDown, LookLeft, LookRight** 当使用 BlendShape 控制视线时,需要使用这些预设。也就是说如果你不用 BlendShape 控制视线,那么可以不用设置这几个 BlendShape。
##### **Unknown(未定义)** 其他非 VRM 预设的表情。如果你要制作其他表情,则需要使用这个分类。比如ARkit
### **改变 BlendShapeProxy 的值(在运行时/run time)** [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/BoNO3RdTYs8tb3vX-blendshapeproxy-by.png) 可以通过 Inspector(检查器) 进行操作。 ### **\[可选\] 追加表情** **[](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/7YEQAOh2T900UiBI-vrmblendshapeproxyruntime.png)** 确定保存文件。请选择最后面的按钮,输入名称来创建设置。 **[](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/d2mfA194mra6e1uG-blendshapeclipoption.png)** 你可以使用下面的代码调用它(非开发人员用不到这个): ``` // unknownなのでstringで呼び出し proxy.ImmediatelySetValue("びっくり", 1.0f); // 0から1で指定 ```官方文档演示用的 UniVRM 是旧版,我用的新版,UI不一样,官方文档就只有这么一句话和两张图,完全没讲清楚。新版追加新表情是点底下的“+”号,旧版应该是点那个“Add BlendShapeClip”按钮。我这里演示一下新版本的操作。
[](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/X5QS3O5pb8EwtKh2-univrm-by.png) ### **\[可选\] 变换材质颜色** **[](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/oEUGMDv0IK1vvJou-by.png)** 要设置材质变换,需要切换到 Material List 选项卡,或者在 Project 视图中选择 BlendShape 文件进行编辑。(例如预设的 BlendShape.XXX 之类的,或你自己创建的名称)。材质变换的相关细节后面会讲。 # BlendShape 的设置(v0.45) ### **BlendShape 关联的资源****详细信息** 如果BlendShape的法线为(0, 0, 0),则表面的法线将不会发生变化。但看起来重新计算的法线取代了原来的BlendShape法线,导致模型出现了意外的变化。当基础网格的法线被改变时,在镜像之后左右分界处等位置会更明显。
#### **您可以使用 MToon 的法线调试显示来检查法线。** 您可以执行 fbx 文件中 `Materials` 标签下的 `Extract Materials...` 操作,以提取材质。 将FBX文件拖动到 Hierarchy(层级) 窗口并选中它。 在 Inspector(检查器) 中,点击`Select(选择)`->`Materials(材质)`->`Extract Materials(提取材质)`,然后选择一个文件夹来保存这些材质。 接下来,选择所有材质 将 Shader 更改为 `VRM/MToon`。(前面的章节有详细提到这些操作)**确认法线** 因为只是为了确认法线而暂时 MToon 化,所以不需要纹理等的设定。
在 MToon 的 `Options(选项)` 中,选择 `Debugging Options`,然后将 `Visualize` 设置为 `Normal`。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-08/XZuiqGGLRYMADfl4-mtoon-normal.gif) 回到 SkinnedMeshRenderer 。 拖动 BlendShape 滑块,检查法线。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-08/Y5yDKodTxw1eGJRC-broken-normal.jpg) 示例中,**鼻尖** 和 **下唇** 的法线出现了明显的错误。**译者补充:** 此处示例模型不是之前使用的艾莉西亚的模型,因为艾莉西亚的模型各方面都比较正常,这里为了演示错误情况另外使用了其他模型,如果你用艾莉西亚的模型测试这些操作可能不够直观,本人用艾莉西亚的模型测试的时候,只在眼部周围和耳朵上发现了法线的变化。
> **模型信息** > 这个模型是 > > - 将 Vroid 的 VRM 导入到 Blender > - 再从 Blender 导出为 FBX > - 最后将 FBX 导入到 Unity > > 得到的结果 #### **修复 BlenderShape 的法线** 用上述方法发现 BlendShape 有问题时,修复的方法。 选择 fbx 的 `Model` 标签。 检查并应用 `Legacy Blend Shape Normal`。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-08/WIrupg2atc5jx5Yb-legacy-normal-fixed.jpg) 确保 BlendShape 是正确的。**与修正前的区别** 除了鼻尖和下唇外,舌头的法线也变得完全不同。
# Material(材质) # Material ## **Material** VRM 支持的 材质(着色器) 有三种,`unlit`, `standard`, `MToon`。 UniGLTF 支持 `unlit` 和 `standard` 两种版本。 ### **export / import 对应表**[](https://vrm.dev/univrm/shaders/#export--import-%E3%81%AE%E5%AF%BE%E5%BF%9C%E8%A1%A8 "export / import の対応表 への直接リンク")support | export | gltf | import | |
---|---|---|---|---|
✅ | Standard(Unity标准) | PBR | Standard | |
❌v0.xx.0 | UniGLTF/StandardVColor | UniUnlit 支持顶点色 | ||
✅ | Unlit/Color(Unity标准) | KHR\_materials\_unlit | UniGLTF/UniUnlit | |
✅ | Unlit/Texture(Unity标准) | KHR\_materials\_unlit | UniGLTF/UniUnlit | |
✅ | Unlit/Transparent(Unity标准) | KHR\_materials\_unlit | UniGLTF/UniUnlit | |
✅ | Unlit/Transparent Cutout(Unity标准) | KHR\_materials\_unlit | UniGLTF/UniUnlit | |
✅ | UniGLTF/UniUnlit(VRMShaders) | KHR\_materials\_unlit | UniGLTF/UniUnlit | |
❌v0.76.0 | VRM/UnlitTexture(UniVRM) | KHR\_materials\_unlit | UniGLTF/UniUnlit | 请使用 UniUnlit |
❌v0.76.0 | VRM/UnlitTransparent(UniVRM) | KHR\_materials\_unlit | UniGLTF/UniUnlit | 请使用 UniUnlit |
❌v0.76.0 | VRM/UnlitCutout(UniVRM) | KHR\_materials\_unlit | UniGLTF/UniUnlit | 请使用 UniUnlit |
❌v0.76.0 | VRM/UnlitTransparentZWrite(UniVRM) | 无法在 gltf 中表现 | 在MToon 中 有TransparentZWrite 功能 | |
✅ | VRM/MToon | extensions.VRM.materialProperties | VRM/MToon | |
🚧 | VRM10/MToon10 | VRMC\_materials\_mtoon | VRM10/MToon10 |
功能 | color | texture | vertex\_color | alpha/cutout | no culling |
---|---|---|---|---|---|
glTF | ✅ | ✅ | ✅ | ✅ | ✅ |
UniGLTF/UniUnlit | ✅ | ✅ | ✅ | ✅ | ✅ |
Unlit/Color | ✅ | ||||
Unlit/Texture | ✅ | ||||
Unlit/Transparent | ✅ | blend | |||
Unlit/Transparent Cutout | ✅ | cutout |
⚠反射太强 闪闪发光 Shader 类型为 `Standard`(Unity 标准),且 `metallic` 和 `smooth` 值较高。将材质的着色器更改为 `Unlit/UniUnlit`,可以直接显示纹理。
### **Metallic, Roughness, Occlusion 对应表**用途 | glTF material | Unity Standard Shader | ||
---|---|---|---|---|
Occlusion | occlusionTexture | R | G | \_MetallicGlossMap |
Roughness | pbrMetallicRoughness.metallicRoughnessTexture | G | A | \_MetallicGlossMap (smoothness = 1 - roughness) |
Metallic | pbrMetallicRoughness.metallicRoughnessTexture | B | R | \_OcclusionMap |
这是 Application(应用程序) 的设置,而不是针对 VRM 模型设置的。
这是模型眼睛要追踪的目标。如果设置为摄像头,模型将始终注视着摄像头。 ### **视线计算的基准位置** 在 VRMFirstPerson 的 FirstPersonOffset 中,您可以设置相对于 head 骨骼的基准位置。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/kvMPf7UjahzHuog0-firstperson.png)译者补充:Unity酱是一个由Unity官方开发的虚拟角色模型,用于展示Unity引擎的功能和潜力。
译者补充: \_MainTex\_ST\_S只控制水平效果,Y轴设置的数值不会产生影响 \_MainTex\_ST\_T只控制垂直效果,X轴设置的数值不会产生影响
Center 节点必须是其 SpringChain(骨骼链) 的第0个 Joint(关节) 或者其上层节点。此外,Center 节点不能指定为其他 SpringChain的 Joint 节点及其次级。
### ### **VRMSpringBoneColliderGroup(VRM弹簧骨骼碰撞组)** 为了防止 摇摆物 穿透特定部位,可以为骨骼添加碰撞检测。 在单个骨骼上添加的 VRMSpringBoneColliderGroup(弹簧骨骼碰撞组) 可以同时拥有多个碰撞目标。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/RqsiajOlFpt4KNmD-collider.png) 在头上添加碰撞检测(VRMSpringBoneColliderGroup) 在添加了 VRMSpringBoneColliderGroup之后,请将其注册到 VRMSpringBone 的 ColliderGroups 中。 例如,点击 `Add Component` 为 `head`添加 VRMSpringBoneColliderGroup 脚本,并将`head`拖拽到 `Collider Groups` 中的 `Element 0` 字段。你可以通过双击 `Collider Groups`中的 `Element 0`字段来更改其偏移量和半径值。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/nAwOGU47OSSD0MzL-set-collider.png) 在头部添加VRMSpringBoneColliderGroup,并将其指定给VRMSpringBone的ColliderGroups。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/4YFSGqMgaAPVOVeb-spring-gizmo.png) 活动时的Gizmo ### ### **添加组件的位置** #### **VRMSpringBone[](https://vrm.dev/univrm/springbone/univrm_secondary/#vrmspringbone-2 "VRMSpringBone への直接リンク")** 在导入 VRM 模型时,会自动生成一个名为 `secondary` 的 GameObject(游戏对象) ,VRMSpringBone 组件会被添加到这个对象中。 请注意,与导出时不同,有时可能找不到 VRMSpringBone 组件。 #### **VRMSpringBoneColliderGroup[](https://vrm.dev/univrm/springbone/univrm_secondary/#vrmspringbonecollidergroup-1 "VRMSpringBoneColliderGroup への直接リンク")** 在导入VRM时,VRMSpringBoneColliderGroup 将被添加到导出时添加的 GameObject(游戏对象) 中。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/H3FLDdTFD7wYR38c-vrm-settings.png) # 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](https://docs.unity3d.com/Manual/AvatarCreationandSetup.html) 此外,为了简化程序处理,VRM 的 Humanoid 规范增加了以下内容 - 所有的 Gltf Node (Unity GameObject) 的旋转设置为0时,就会变成初始姿势。 - 缩放值不变**备注** 特别是缩放是一个很复杂的问题,如果缩放中心不是原点、存在负缩放、以及XYZ轴分别有不同的缩放的话,编写程序时处理这些问题非常麻烦。
### ### **T-Pose** **[](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/PeYMqOnKhUpkTm7E-t-pose.png)** 对手腕和手指的初始姿态进行了规范。 - 手心朝下 - 大拇指水平放置,在 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](https://docs.vrcd.org.cn/books/vrm-univrm/page/humanoidcomponent) ### **与 BVH 的兼容性** 与初始姿势为 `T-Pose` 的 BVH 文件兼容。 - 将位移数据赋予 hips。 - 以 hips 为起始,逐级为子节点设置局部旋转值。 ### **详情** 骨骼列表与 [Unity 文档中的 HumanBodyBones](https://docs.unity3d.com/cn/2019.4/ScriptReference/HumanBodyBones.html) 相同。 - 对象节点的选择,与蒙皮(例如 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)。 ### **相关问题** - [https://github.com/vrm-c/vrm-specification/issues/87](https://github.com/vrm-c/vrm-specification/issues/87) ### **参考** - [Mecanim Humanoids](https://unity.com/cn/blog/engine-platform/mecanim-humanoids) - [从 Blender 导出与 Unity 的 Humanoid 兼容的 fbx 文件](https://qiita.com/ousttrue/items/aead1c943855561b62e7) # BaseModel(基础模型) 满足以下条件的 GameObject 可以导出为 VRM 格式: - 附加了 Animator 组件。 - Animator 组件设置了 HumanoidAvatar ### **FBX** 要满足上述条件,请在 `fbx importer` 的 `rig` 设置中将模型设置为 `humanoid`。fbx 的 prefab 在设置为 humanoid 后,会附加Animator 组件,并且会设置 HumanoidAvatar。 要让 fbx 转化为 Humanoid,需要满足以下2个条件 - 需要有必要的骨骼 - 确保骨骼父子关系正确 此外 - 骨骼的名称可以自由设定。 参考 [从 Blender 导出与 Unity 的 Humanoid 兼容的 fbx 文件](https://qiita.com/ousttrue/items/aead1c943855561b62e7) ### **在场景中加工 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。 [HumanoidComponent](https://docs.vrcd.org.cn/books/vrm-univrm/page/humanoidcomponent) 使用这个的话, - 人型 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](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中。)  正确配置骨骼。 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/gTbU6f0rTEFZuKOH-create-avatar.jpg) 按下 `Create UnityEngine.Avatar` 按钮 [](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/HDlrodeMaGzUnN1S-humanoid-animator.jpg) 将创建一个新的 humanoid avatar。 保持这样,可以将其设置为 T-Pose 并进行 VRM 化。 # UniHumanoid Unity humanoid 工具与 BVH 导入器。 ### **BVH runtime loader**[](https://vrm.dev/unihumanoid/#bvh-runtime-loader "BVH runtime loader への直接リンク") ``` var context = new BvhImporterContext(); context.Parse(path); context.Load(); // create Skeleton hierarchy and mesh for visualize GameObject root = context.Root; ``` ### **RuntimeLoader[](https://vrm.dev/unihumanoid/#runtimeloader "RuntimeLoader への直接リンク")** - Scenes/RuntimeBvhLoader.unity ### **RuntimeLoader 和 PoseTransfer**[](https://vrm.dev/unihumanoid/#runtimeloader-and-posetransfer "RuntimeLoader and PoseTransfer への直接リンク") 加载 BVH 文件,并将姿势转移到任何具有人形特征的模型上。 - Scenes/PoseTransfer.unity关于许可证类型,可以[【点击此处】](https://creativecommons.org/)查看每种许可证的含义,同时,这个网站内有一个根据需求想你推荐适合你的许可证的程序。 上面括号里的每一个缩写都是一种许可证名称的缩写,是可以根据需求自己组合使用的。 如果选择 CC0 协议,意味着你放弃一切权力并将作品贡献给全球公有领域。
# FirstPerson(第一人称) # VRMFirstPerson ### **概要[](https://vrm.dev/univrm/firstperson/univrm_firstperson/#%E6%A6%82%E8%A6%81 "概要 への直接リンク")** VRMFirstPerson 有两项设置,分别是头戴设备的位置定位和VR的可视设置。 **只有在程序支持的时候,这个设置才会有效。** ### **设置头戴设备的位置[](https://vrm.dev/univrm/firstperson/univrm_firstperson/#%E3%83%98%E3%83%83%E3%83%89%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E4%BD%8D%E7%BD%AE%E6%8C%87%E5%AE%9A "ヘッドセットの位置指定 への直接リンク")** 在 VRM 模型中设置 VR头戴式显示器(HMD) 的位置。可以调整 HMD 和Avatar头部的跟随。 #### **FirstPersonBone[](https://vrm.dev/univrm/firstperson/univrm_firstperson/#firstpersonbone "FirstPersonBone への直接リンク")** 第一人称时,追踪 HMD 的骨骼。请指定头部骨骼。 #### **FirstPersonOffset[](https://vrm.dev/univrm/firstperson/univrm_firstperson/#firstpersonoffset "FirstPersonOffset への直接リンク")** 以 FirstPersonBone 的位置为基准调整跟随位置。请调整到角色的双眼之间。 ### **VR的可见性设定[](https://vrm.dev/univrm/firstperson/univrm_firstperson/#vr%E3%81%AE%E5%8F%AF%E8%A6%96%E8%A8%AD%E5%AE%9A "VRの可視設定 への直接リンク")** 这是用于VR应用程序的设置,可以为每个网格单独设置相机的可见性。假设 VR 应用程序有两种相机。 为了应对在第一人称视角的相机中看到自己的模型时可能遇到的不便,可以为每个网格设置可见性。 #### **第一人称相机[](https://vrm.dev/univrm/firstperson/univrm_firstperson/#%E4%B8%80%E4%BA%BA%E7%A7%B0%E3%82%AB%E3%83%A1%E3%83%A9 "一人称カメラ への直接リンク")** 输出到 HMD(头戴式显示器) 的图像。也就是用于获取玩家视角看到的画面的摄像机。 #### **第三人称相机[](https://vrm.dev/univrm/firstperson/univrm_firstperson/#%E4%B8%89%E4%BA%BA%E7%A7%B0%E3%82%AB%E3%83%A1%E3%83%A9 "三人称カメラ への直接リンク")** 这种视角不通过HMD显示,而是用于其他目的,比如直播、录像、镜子中的反射,或者在多人游戏中显示其他玩家的视角。 #### **可见性设置**设定 | 第一人称相机 | 第三人称相机 | 备注 |
---|---|---|---|
Auto(自动) | △(不可见) | △(不可见) | 这是初始设置,后续会有更详细的说明。 |
Both(两者) | 〇(可见) | 〇(可见) | 通常适用于身体、手、脚等远离头部的部分。 |
ThirdPersonOnly(仅第三人称) | 〇(可见) | 一般用于头部、头发、帽子等。 | |
FirstPersonOnly(仅第一人称) | 〇(可见) | 通常可能不需要这个设置。 |