VRM官方文档-汉化加强版-【VRM】

VRM-面向 VR 的 3Davatar(化身) 文件格式
「VRM」是一种用于处理 VR 应用程序的人形3D化身(3D模型)数据的文件格式。它基于 glTF2.0,并且任何人都可以自由使用它。

此外,还提供了用于在 Unity 中进行 VRM 文件读写的基于 C# 的标准化的实现方式(UniVRM),并且它是开源的。

内容来源于VRM官方文档,修改了原文部分牛头不对马嘴的部分,结合了英文与日文两个版本,并根据个人经验进行精修(官方文档两个语言版本内容有不一致的地方,甚至互相缺少某些内容)。

官方文档中的例图使用的插件为旧版本,与新版本有所差异,针对这一问题,在翻译文档的过程中,对官方所有的操作进行了复现,补充了官方缺少的很多操作细节。

因此,本文档并非一板一眼的翻译,针对部分词汇和文本,会根据情况进行调整或重写,以尽量符合国内CG行业用语和中文语言习惯。

关于VRM:VRM是什么?VRM能做什么?

什么是VRM

VRM 是处理 [人形] 的 [character avatars(角色化身)] 的一种文件格式。

内容

综上所述,VRM 的构成不仅限于简单的模型数据,还可以被应用程序加载并立即使用。

你可以用VRM做什么?


您可以在兼容VRM的不同应用程序之间使用同一个 avatars(3D模型)数据。当各种应用程序都支持VRM时,这将创造出这样的未来...

通过使用你自己的VRM格式的 avatars(3D模型数据),您可以在各种兼容 VRM 的应用程序和游戏中互相切换。

直播、视频创作、游戏、聊天......虚拟世界彼此之间没有连接。使用 VRM 是连接这些虚拟世界的第一步。

VRM介绍-by.北溟瞬息

VRM 的特征

在 VR(Virtual Reality)和 VTuber 等相关情景中,如果想要处理“角色和人型的虚拟形象(的3D模型)”的话,以前每个应用程序、3D模型数据都需要开发自己的系统或进行细致的调整。

因为…

随着在虚拟现实应用中使用 avatars 越来越普遍,如果上述情况不改变,应用程序开发人员和3D模型创作者将不得不付出两倍或三倍的努力。为改善当前的情况,基于人形角色和 avatars,我们可以采取以下措施改善这种情况:

因此 VRM联盟 提出了一个独立于平台的、具有上述特点的 3D avatars 文件格式-VRM

上传/下载VRM文件

此外,在将 VRM 文件上传到 Nikoni 3D时,还有一个选项「バーチャルキャスト連携」(virtual cast cooperation),这使用户可以在Virtual Cast 中使用VRM模型。

VRM应用程序开发

VRM development(VRM开发相关)

如何制作VRM

如何制作VRM

如何制作VRM文件

使用 UniVRM 制作 VRM 文件的工作流程大致如下:

  1. 将 3D 模型导入 Unity 项目调整为T-Pose,并添加许可证信息。启用归一化后,输出 VRM 文件。
  2. 读取上面输出的 VRM 文件,在 Unity 中进行 VRM 特有的设置(许可晃动物体表情视线第一人称等),然后在不进行归一化的情况下输出VRM文件。

译者补充:T-pose 和 A-pose 是3D模型常用的角色模型初始姿势,人物动作呈现直立状态,主要区别在于 T-pose 为两手向身体两侧平举,A-pose 的双手为身体侧下方摆放。两种 Pose 在不同的地方可能也有细微区别,比如两腿并拢的程度,不同地方并拢的程度可能不同。一般读取动作数据时,并不是读取每个关节当前夹角多少度,而是相对于初始动作变化了多少变化量,因此会因为初始姿势的不同,导致最终动作也不一致。

重点是:

VRM_changeVRM_ZH.png

如何制作VRM

0.创建一个Unity项目并安装 UniVRM

下载 UniVRM

https://github.com/vrm-c/UniVRM/releases

请下载最新版本。文件名为UniVRM-0.XX.0_YYYY.unitypackag

XX 为 UniVRM的版本。YYYY 是版本识别ID。UniVRM版本号

补充:
UniVRM 0.99.x 是 unity 20019.4 的最终版本。
从 UniVRM 0.100.x 开始,需要至少 2020.3 的 Unity。
UniVRM 0.111.x 是最后一个自带 UMP 的版本,是 Unity 2020 的最后一个版本。
*从 UniVRM 0.112.0 开始,Univrm 不再自带 URP,需要单独安装,不然会报错!并且 Unity 版本要求至少是 2021.3 LTS。


安装Unity

https://unity.com/releases/editor/archive

请安装 UniVRM 对应版本的 Unity。对应的 Unity 版本请在相关页面查看说明。

不要使用国内 Unity 网站的链接下载的 Unity!!

如果使用的是国内的链接,即使你使用的是国际版的 UnityHub,你下载的 Unity 仍然是国内特供版的 Unity。
中国版的版本版本号后缀是“c1”,国际版版本号后缀是“f1
请使用国际版网站的链接进行下载,上面提供的链接是国际版的下载页面。

或者你可以查看跳转 UP 主整理的国际版历史版本汇总专栏
Unity国际版下载链接分享(非c1国内版)【点击此处进行跳转】
只要下载的 Unity 是国际版就OK,你安装的 UnityHub 是中国版还是国际版都没关系。

用Unity创建空项目

创建Unity项目-by.北溟瞬息

以前版本的 Unity 似乎可以直接打开 Unity引擎 进行创建项目。

但是现在的基本都被 UnityHub 接管了,所以这里我只演示在 UnityHub 中创建。

先选择你要使用的 Unity 的版本,然后选择 3D 模板,最后确认创建就行。记得根据自己实际情况修改项目文件位置。

项目文件很大,创建项目需要可能等待几分钟。

在 Unity 中导入 UniVRM unitypackage

在菜单点击 Assets -> Import Package -> Custom Package 导入预先下载好的 UniVRM-0.XX.0_YYYY.unitypackage
导入的文件将在 ../Assets/VRM../Assets/UniGLTF ../Assets/VRMShaders 文件夹中。在 Unity 中导入 UniVRM unitypackage-by.北溟瞬息

点击右下角的 import 按钮。

检查 UniVRM 是否导入成功

如果 UniVRM 导入成功,菜单栏会显示“VRM”菜单。

下面分别是新旧两种版本的样子。

新:

新版本VRM菜单-by.北溟瞬息.png

旧:

旧版本VRM菜单-by.北溟瞬息.png

如果您使用的是Unity-2018,而VRM菜单没有显示:
进入“ProjectSettings-Player-Other Settings-Scripting Runtime Version”,查看“Scripting Runtime Version”是否设置为“.Net4.X equivalent”。


Console(控制台)

在 Unity 项目中发生的错误可以在控制台窗口中显示:

在Unity中打开控制台-by.北溟瞬息.png

单击 Console 窗口左上角的 clear 按钮,查看控制台中是否留下任何错误(红色消息)。在大多数情况下,错误是由 UniVRM 安装失败引起的。安装UniVRM报错-by.北溟瞬息.png

手册

➡ 安装

如何制作VRM

1.从 Humanoid 模型创建 VRM 文件

准备一个可在 Unity 中以 Humanoid 形式处理的 3D 模型

初次准备

因为

然后,确保包含必要的骨骼,使模型可以被识别为 Humanoid。

Humanoid
你可以将 Humanoid 简单地理解为一种骨骼结构标准,用于对人型模型进行统一,以便于进行重定向,会有比如:骨骼的名称、骨骼链接顺序于骨骼必要性之类的规范化标准。

基本模型
有关可用的基础模型的详细信息,请参见 BaseModel

所需的骨骼

将 FBX 模型导入 Unity

将 FBX 文件夹拖放到 Unity 的 Assets 文件夹中

将FBX模型导入Unity-by.北溟瞬息.png

补充:
官方文档中并没有提供文档中使用的模型资源。官方使用的角色模型是由 黑星红白 创作并由 ニコニ立体 官方发布的免费可商用模型,模型可以在 ニコニ立体 找到。
https://3d.nicovideo.jp/alicia/
请注意下载的文件格式,虽然直接提供了 VRM 格式,但是如果为了学习使用,建议还是和文档中一样使用 FBX 格式进行学习。

Unity

补充:
以下其中一个是我自己打开 Unity 的界面截图(深色界面),另一个是官方文档提供的例图(浅色界面)。由于 Unity 版本不同,文件浏览界面的显示方式不同。
官方例图(旧版本)中,可以直接在列表中点击三角形将资源展开。
而在较新版本的左侧 Project 窗口中,需要选中“alicia”文件夹,然后在右边的文件预览窗口中找到“Alicia_Solid_Unity”。
这个预览的地方在文件名太长的情况看不全文件名,注意区分文件,有一个后缀是 MMD,可以进入修改文件名称状态查看完整名称(双击文件名或按 F2),或者选中文件后在右边的 Inspector (检查器) 窗口查看文件名称。

新版Unity资源界面-by.北溟瞬息.png

旧版Unity资源界面-by.北溟瞬息.png

在 Project 窗口中,选中Alicia_Solid_Unity,这是FBX的资产 Prefab(预制件)。

(新版 Unity 请在旁边的窗口中查找相应资源)

FBX 的材质设置

FBX的材质设置1-by.北溟瞬息.png

如上图所示,默认情况下,FBX 的材质设置为带有默认参数的 StandardShader(仅分配了标准着色器的Color和ColorTexture,没有半透明设置等)。
为了尽量简单地演示 “FBX 转换为 VRM” 的操作,在接下来的示例中我们将材质的着色器设置为 MToon,并将颜色设置为白色。
具体操作方法请继续往下浏览。

补充:
上面的官方示例中是没有丢失贴图的,我复现官方操作时一直是丢失了贴图的状态(模型通体白色)。FBX的材质设置2-by.北溟瞬息.png

下图内容为找回贴图的方式:
根据 FBX 文件实际情况不同,相关设置可能不一样。调整完设置以后,点击 Apply 应用设置,下面的预览窗口才会刷新。找回丢失的贴图-by.北溟瞬息.png

着色器(Shader)
VRM支持三种类型的着色器:MToon,  Unlit 和 Standard。

点击 Extract Materials 按钮,在 FBX 文件中创建 Materials 文件夹。

Extract Materials-by.北溟瞬息.png

补充:这时会弹出选择文件夹的窗口,记得自己手动创建一个文件夹,并且选择这个文件夹,不然之后提取出来的文件是散的,会很乱。示例路径为 /Assets/FBX/Materials
材质导出路径-by.北溟瞬息.png

然后将提取的材质保存到刚创建的 Materials 文件夹中。如果在On Demand Remap(按需重映射)部分已经为每个材质分配了引用,则可以跳过这一步骤。

英文文档中提到:
另一种设置材质的方法是将 Location 为 Use External Materials (Legacy)。但官方文档只关注前一种方法。

进入材质文件夹-by.北溟瞬息.png

进入这个文件夹,把里面的所有材质的 Shader 改成 VRM/Mtoon

将材质地shader改成VRM-Mtoon-by.北溟瞬息.png

补充:可以在文件夹内同时选中所有材质,然后在查看器中同时修改。


Shade Color 切换为白色:

将shader的颜色改成白色-by.北溟瞬息.png

正确设置后的预览效果如下图所示:

正确设置着色器后的效果-by.北溟瞬息.png

关于如何设置 MToon 着色器的更多细节,请参考MToon设置

因为是步骤说明,所以我们先继续往后。

将 fbx 设置为 humanoid

fbx 的 Animation Type 默认设置是 generic。

fbx 的 Animation Type 默认设置是 generic-by.北溟瞬息.png

将它切换为 Humanoid。

将它切换为 Humanoid-by.北溟瞬息.png

并且点击 Apply 按钮应用设置。

你需要重新选中 Alicia_Solid_Unity 这个资源文件才能找到这个设置。(官方没说,搞得我找半天)
上面两图一个是旧版界面,一个是新版界面,除了颜色,基本没什么区别。

Humanoid
此时,fbx importer(FBX导入器) 会自动推测 Humanoid 骨骼的分配。有时可能会失败,并且,即使程序成功执行,也可能出现最终效果错误的情况。

点击 Configure 以配置你的模型。

将弹出一个消息框,询问您是否要保存当前场景。单击 save 保存它。

点击【Configure】配置模型-by.北溟瞬息.png

补充:我复刻操作但是没看到所说的这个保存当前场景的询问,可能是演示人员修改了其他设置没有保存,所以进入 Configure 界面时弹出了提示。

BoneMapping(骨骼映射)-by.北溟瞬息.png

请检查并确认骨骼分配情况。

上面这个图,在官方文档里就像这样这么圈了划了几下,也没说怎么设置之类的,估计意思就是让你把错误的骨骼重新配置以下,这东西我也不会用,反正设置完以后点右下角的 Done 就可以退出这个界面了。

BONE(骨骼)
下巴骨骼可能被分配到前发际。
眼睛骨骼可能被分配到眼睛高光。
注意这些细节是否符合你需要的效果。


将 prefab(预制件) 放入场景中

将 prefab(预制件) 放入场景中-by.北溟瞬息.png

将预制件从 “Project”(项目) 窗口拖到 “Hierarchy”(层次结构) 窗口。

新版本 Unity 直接把资源从 Poject 窗口拖到 Hierarchy 的层级菜单里,这样的话,角色会被放置在空间原点。如果直接拖动到3D窗口,角色会被放置在鼠标位置。

老版本的 Unity 直接从左边的大纲(文件树状图)里把 FBX 文件拖拽进去(文章开头也有提到两个版本的界面区别),官方文档放的老版本 Unity 的截图太长了这里就不放了。
官网的页面大改过一次(大概24年初),这一改,居然把这个位置的老版本 Unity 的示例截图弄丢了。这官方真就是个草台班子啊。本来还想把老版本的例图放上来对比的。


确认 fbx 的 blendshpae 法线是否混乱


以下是 BlendShape 中出现奇怪阴影时的对策。

检查并确认BlendShape

从菜单中将模型导出为VRM

新版本UniVRM导出-by.北溟瞬息.png

点击“VRM0”->Export to VRM 0.X”,弹出对话框。

旧一点的版本是,点击“VRM0”->“xport UniVRM-0.XX.X”。如下图:
旧版本UniVRM导出-by.北溟瞬息.png
再老一点的版本是,点击“VRM” -> “UniVRM-0.XX.X” -> “Export humanoid” 如下图:
更旧版本UniVRM导出-by.北溟瞬息.png


【Export Root】-by.北溟瞬息.png

点击将 Export Root 栏右边的圈,选中 prefab 展开的 GameObject ,将其设置到 Export Root。

ERROR(错误)
在导出对话框中执行各种错误检查。
    1.必须要解决的错误消息会显示为“红色”
    2.如果要立即导出VRM,则可以忽略警告的消息显示为“黄色”
导出对话框

补充:
如果导出前你没选中角色模型,下面则会提示:
中文:请为模型导出设置 ExprotRoot
日语:ExportRoot をセットしてください
英语:Please set up a ExportRoot for model export
右上角可以切换语言,但是窗口界面可能不会立刻刷新,需要重新打开窗口。
如果你在导出时已经选中了角色模型,则会跳过这个窗口进入下一个阶段

VRM导出时的错误信息-by.北溟瞬息.png

请输入许可证信息。如果没有红色消息,则可以点击 Export(导出) 按钮。为了进行下一步操作,请创建 Assets/models/vrm 文件夹并将其导出到该文件夹中。

导出位置
您可以选择将导出的文件放置在 Unity 中的 Assets 文件夹内或外。如果选择放置在 Assets 文件夹内,导出后会立即进行导入(导入较为耗时)。并且如果选择放置在 Assets 文件夹内,建议创建一个新的、专门的文件夹,以便更清晰地管理。


导出设置

制成T-Pose-by.北溟瞬息.png

Make T-Pose(制成 T-Pose)
如果模型不处于T形姿势,请单击“Make T-Pose ”以制作一个T形站姿姿势。
该功能可以将角色模型自动转换为 T-Pose。如果不使用此选项,自己在场景中手动调整成 T-Pose 的外观也没有问题。

Pose Freeze(姿态冻结选项框)
“Pose Freeze”用于导出过程中的模型规格化。新版本将自动勾选此复选框,以检查将自动检查导出目标是否需要规范化(在设置 ExportRoot 后自动检查是否存在旋转和缩放)。

如何制作VRM

2.设置VRM模块

VRM模型

上一节中,我们介绍了如何将模型输出为 VRM 格式的 prefab(预制文件)。

只要将 VRM 文件拖拽到 Unity 的 Assets 文件夹中,就会自动生成与 VRM 文件关联的 prefab(预制文件)。

导入VRM后的文件结构官方例图-by.北溟瞬息.png

导入VRM后的文件结构新版例图-by.北溟瞬息.png

只要将 VRM 文件拖拽到 Unity 的 Assets 文件夹中,就会自动生成与 VRM 文件关联的 prefab(预制文件)。

在上一节中,我按照官方文档说明,创建了“/Assets/models/vrm”文件夹并把VRM导出到这个文件夹,但是官方给的图有点对不上。官方的在图例是放在了“/Assets/vrm”。

以防图片看不清,再次特别提醒:在上图中,你选中文件以后,可以在资源管理器窗口底下一栏查看到文件的后缀名(红字标注位置)。


在场景中打开VRM预制件

FileNew Scene

将 Prefab(预制文件) 展开到场景中。

新建场景时会提示你是否保存当前的场景,如果保存了的话,场景文件会存在 Assets\Scenes 文件夹里。

一个场景在没做任何变动的情况下,你切换或者新建一个其他场景时,不会提示你保存,如果是新建且未变更的场景,会直接被丢弃掉,不会保存。

你也可以使用之前导入了 FBX 的场景文件,但是要 Hierarchy(层级) 窗口中把角色模型移除,这个角色模型是之前的 FBX 文件预制件,没有 VRM 预制件的那些脚本组件。不要从 Project 窗口删除,这会直接把文件从你的文件夹丢进回收站,从而导致你的层级窗口的对象找不到文件,导致文件名件变成红色。


编辑VRM独有的设置

在菜单栏点击 【File 】→【New Scene 】创建一个新场景或使用现有场景。

然后将 Prefab(预制文件) 拖到 Hierarchy 窗口(这样的话,角色模型会自动放置在场景中间)。

编辑VRM独有的设定-by.北溟瞬息.png

通过在 Hierarchy(层级) 窗口中点击选中 VRM 预制件,可以在 Inspector(检查器) 窗口中显示出 VRM 模型的信息。请注意,物理骨骼设置在名为 secondary 的游戏对象中。此外,在VRM元数据中,请确保设置了标题、作者和授权信息 特别是许可证信息,这至关重要!(实际上不影响在程序上的使用,这是出于版权的尊重。)

补充:
图里文件右上角的蓝色加号似乎是代表新文件的意思,我之前从Project窗口删过一次文件,从回收站还原文件以后被识别成了新文件。

除此之外,要使VRM模型完全功能正常,请设置以下组件:

请根据需要进行设置。

再次导出VRM文件

所有设置完成后,在 Hierarchy 中选择模型(导入的角色的 Prefab,选中最上层的父级游戏对象,不要选成展开的次级文件),然后再次从 VRM0 -> export UniVRM-0.XX 导出模型。

新版本UniVRM导出-by.北溟瞬息.png

老一点的版本则是 VRM - UniVRM-0.XX - Export humanoid

不同版本的导出菜单稍有不同,上一节中有提过,之后不会再赘述,之后关于导出的文字描述我一般会直接复制官方文档的版本,但是截图我会使用自己截的。所以可能会出现,文字描述和图片的版本不一致的情况.

Pose Freeze (姿态冻结)
“Pose Freeze” 用于在导出过程中对模型进行规范化。
当设置ExportRoot时,会检查层次结构中是否存在旋转和缩放,从而自动设置这个复选框。
即便进行了初次的标准化,但是
        •如果之后添加了附件(如配饰),那么也需要进行姿态冻结。
只需重新设置ExportRoot,系统就会自动进行判断。
        •此外,还支持 BlendShape 烘焙功能。

完成!

VRM 文件已经准备好。尝试将 VRM 文件导入到支持 VRM 的应用程序中!

如何制作VRM

在播放模式检查你的VRM

官方文档这一节的各种细节严重缺失,我补充了大量细节,并重写了一部分内容。如果对内容有疑问,可以适当参考官方文档。

在本节中,我们假设您已经制作了一个 VRM 模型,并希望在 Play mode(播放模式)下进行测试。

播放模式
如果没进入播放模式,场景就像是游戏被暂停了一样,场景中的东西虽然可以编辑,但不会自发运动。
只有进入播放模式,vrm 相关功能才会开始运作。比如视线跟随、物理骨骼模拟。同时,请确保模型相关功能设置正常。

检查视线追踪效果

在 VRMLookAtHead->target 中设置 AnimationClip/AnimationController(该步骤可忽略):

首先,您可以为模型创建或选择适当的 AnimationClip(动画剪辑) 和 AnimationController(动画控制器),以便控制模型的动作。

其实可以不需要 AnimationClip/AnimationController,这相当于是自己做一套预设动作,以检查模型在运动时的状态。不知道这是什么东西也没关系,因为这不属于VRM的内容, 所以不影响后续工作。因为在后续的操作中,我们可以自己手动去控制视线目标。因此可以不需要这个动作预设。

设置 VRMLookAtHead 的 Target:

接着,您需要在 Hierarchy(层级) 中选中角色模型,随后在软件右边的 Inspector(检查器) 里找到 VRMLookAtHead 组件。在组件中设置目标对象。这个目标对象是角色视线跟踪的焦点

您可以创建一个简单的 GameObject,例如Cube(立方体),作为追踪的目标

创建方法如下图所示,你可以使用其他 GameObject。但此处我们使用Cube作为追踪目标。

创建GameObject-Cube-by.北溟瞬息.png

设置Target-by.北溟瞬息.png

配置Head组件:

在 VRMLookAtHead 组件中找到 Head 部分,并确保已经正确配置了头部组件。设置好这个选项以后,你可以在下面的独立预览窗口中看到,视角所动到了角色的头部。

这个 Head 选项用于定位模型的头部,以便在下面的预览窗口中聚焦显示头部模型,可以在编辑与测试时提供一个预览视角,除此之外暂时不清楚有没有别的作用。

放置摄像机-by.北溟瞬息.png

在Unity中测试动态效果:

点击窗口上方的三角形播放按钮进入播放模式,3D视图会自动切换到 Game 标签。在这个标签中,你无法移动视角或编辑物体。请切回 Scene 标签,然后拖动你所设置的 GameObject 来测试模型的视线追踪效果。

你可以在之前设置 Head 选项后出现的预览窗口中检查视线追踪效果。

或者在进入播放模式前,调整好摄像机的位置。通过 game 标签页查看效果。或直接在 Scene 标签页查看。

在播放模式中测试-by.北溟瞬息.png

如果你发现眼睛没有跟随运动,请检查 【VRM Look At Applyer 】中的设置。如下图所示。

正确设置眼睛高光-by.北溟瞬息.png          区分眼睛左右-by.北溟瞬息.png

将相关组件配置好以后,在场景中检查模型的运动情况。模型的眼睛将在播放模式下追踪目标位置。你可以拖动对象的位置来测试模型的眼睛是否不断追踪对象。您可以在 Inspector 窗口下方的预览窗口查看模型的近距离面部细节。

确认角色表情

为了测试模型的表情,我们提供了两个简单的测试脚本,名为"AIUEO" 和 "Blinker"。在设置好 Blender Shape 后,在角色模型的 Inspector(检查器) 窗口底部点击 Add Component(添加组件),然后添加 AIUEO 脚本,或者直接将脚本拖放到 Inspector(检查器) 中。

设置 AIUEO 脚本后,可以在场景中创建依次切换aa、ih、ou、E、oh的嘴唇动画。同样,如果设置 Blinker,则可以创建自动定期播放的眨眼动画。有关如何使用这些脚本的更多详细信息,请参阅 runtime VRM loader sample(下载UniVRM-RuntimeLoaderSample-0.XX)。”

我找来找去只找到 Blinker 的脚本,根本没有 AIUEO 的脚本,看描述应该是需要另外下载 UniVRM-RuntimeLoaderSample。

双击 BlendShapeAvatar 字段进入 BlenderShape 编辑界面,设定角色的表情。(不是点右边的圆圈,而是直接双击文字)只有将 BlendShape 设置正确,才能实现表情动画。

双击 BlendShapeAvatar 字段进入BlenderShape编辑界面-by.北溟瞬息.png

添加脚本:

添加Blinker脚本-by.北溟瞬息.png

VRM表情测试1.png

将 VRM 导入到查看器

单击此处获取 VRM 查看器应用程序。

或者您可以使用 UniVRMTest 的查看器:

  1. 从 UniVRMTest/releases 下载 VRM 查看器 (VRMViewer_v0.xx.x.zip)
  2. 运行程序 (VRMViewer_v0.xx.x.exe) 并单击【VRM Model】按钮
  3. 选择一个 VRM 模型,该模型将出现在场景中

译者补充:
UniVRMTest 的版本目前已经过时,暂停维护了。相关功能似乎被合并到了 【UniVRM_Samples-0.XXX.0_XXXX.unitypackage】 里,这个东西你可以在 UniVRM 的发布页找到。 我也没用过 VRMViewer,但是从界面来看,好像和 UniVRM_Samples 差不多,应该是集成进去了。

VRM 的许可证设置

VRM 是一种 VR 时代的 3D avatar 格式,如果要在多个应用程序之间相互使用。例如,如果“通过网络使用 avatar 进行 VR 交流”,则需要将自己的 avatar 数据发送给其他用户,以便“让别人那里看到自己的样子”。然而,可能存在一些情况,仅凭基于传统思维的再分配规则是无法处理的。因此,VRM 中具有

除此之外,还有

这可以使 VRM 成为一个适应虚拟现实时代的格式。

以下是 VRM 文件中关于许可信息的标准选项。你可以设置以下这些许可信息。

虚拟形象/角色的各项使用许可【Personation / Characterization Permission


授权的范围/谁可以使用这个形象进行活动-(A person who can perform with this avatar)

是否允许使用这个形象进行暴力性质演出-(Permission to perform violent acts with this avatar)
是否允许使用这个形象进行性行为的表现-(Permission to perform sexual acts with this avatar)

是否允许用于商业用途-(For commercial use)

其他许可条件-(Other License Url)

在存在除上述许可条件以外的许可条件的情况下,可以写入外部许可文档的URL。


再分发或修改的许可范围-(Redistribution / Modifications License)

许可证类型(License Type)

关于许可证类型,可以【点击此处】查看每种许可证的含义,同时,这个网站内有一个根据需求想你推荐适合你的许可证的程序。
上面括号里的每一个缩写都是一种许可证名称的缩写,是可以根据需求自己组合使用的。
如果选择 CC0 协议,意味着你放弃一切权力并将作品贡献给全球公有领域。

VRM 开发相关

VRM 的特征 (面向开发者)

TIP:
从技术角度讲,VRM-0.X 是通过预先烘焙好的 T-Pose 来实现 FK(正向运动学) 的 humanoid motion 共享机制。
T-Pose bake 在 Vrm-0.X 中称为 正规化/规范化。
VRM-1.0 是通过 未烘焙(baked) 的 T-Pose 来实现 humanoid motion 共享的机制。因此,VRM-Animation 补充了不同 T-Pose 之间的 retarget(重定位) 方法。
       •VRM 1.0
       •VRM Animation
为了支持 VRM-1.0,需要实现 FK 的重定位功能。与VRM-0.x(仅替换每个骨骼的 rotation 旋转数据 )相比,RunTime 的实现难度稍高。
       •关于姿势数据的兼容性(面向开发者,无翻译)

与传统游戏开发不同,VRM 更适用于在运行时动态加载,而不是将其作为项目资产提前打包或加载。

在 UniVRM 中运行时加载

可以在运行时使用 UniVRM 加载功能。UniVRM 不创建 Asset(Prefab),而是直接在场景上创建 GameObject。加载的 GameObject 可以像安装的 Prefab 一样处理。

在 UniVRM 中运行时导出

可以在运行时使用 UniVRM 导出功能。您可以使用此功能实现角色创建工具。

Assets/VRM.Samples/Scenes/VRMRuntimeExporterSample.unity

上面就是一个例子。

UniVRM 以外的处理的 VRM 的方法

showcase

VRM-1.0

传统 VRM 现在将被归类为 VRM 0.x 并在未来将被弃用,而 VRM 1.0 将成为未来的官方标准。

这一部分很多都是面向开发人员的内容,因此对于普通用户来说,很多内容看不懂也无所谓。我翻译的可能也有问题。而且官方文档里,同一个地方,在两种语言的文档里可能意思还是互相冲突的。

VRM-1.0

vrm-1.0

VRM 1.0 介绍

VRM 1.0 是对2018年发布的3D头像文件格式“VRM”的更新,它修正了使用过程中发现的问题和错误,并增加了预计将来会需要的新功能。

原有的 VRM 将被重新分类为 VRM 0.x 并不再推荐使用,而 VRM 1.0 将成为新的正式标准

VRM 1.0 于2022年9月发布。

VRM 0.x 的结构被重新组织,并按功能进行了分割,包括核心的 humanoid、meta、expression 等在内的 VRMC_vrm-1.0 ,以及用于卡通材质表现的 VRMC_materials_mtoon-1.0,和用于模拟摇晃物体的 VRMC_springBone-1.0

此外,我们新增了 VRMC_node_constraint-1.0

备注
2020年2月VRMC_vrm_animation-1.0 发布。

注释
VRMC_materials_hdr_emissiveMultiplier-1.0 的内容与 KHR_materials_emissive_strength 基本相同,因此决定不再使用前者,转而采用后者。

公开文档

VRM 1.0 规格

使用文档和 SON Schema 定义的 VRM1.0 规范。

https://github.com/vrm-c/vrm-specification/tree/master/specification

示例模型

https://github.com/vrm-c/vrm-specification/tree/master/samples

VRM パブリック・ライセンス文書 1.0

这是,VRM 独自的许可证,特别考虑了 avatar 的人格许可问题。

VRM公共许可证文档1.0(日文)

实装​

在Unity中,[UniVRM」作为正式的实现方案已经存在。

UniVRM-1.0

API

支持的应用程序

VRM-1.0

VRM-1.0 的变更点

相对于 VRM0.X 的变更点

VRM-1.0

gltf 存储细节

警告
进行 import、export 时需要注意。

glTF: z+ forward

模型应存储为 Z轴 正方向朝前。

  VRM0 VRM1
forward z- z+
right x+ x-

在将 vrm-0.x 转换为 vrm-1.0 时,请绕Y轴进行180度的旋转。

Vector3 vrm0;
var vrm1 = new Vector3(-vrm0.x, vrm0.y, -vrm0.z);

glTF: divided vertex buffer

停止共享 bufferView 之间的 primitive。 

  VRM0 VRM1
bufferView shared(共享) divided(分割)

优点

接近游戏引擎内存布局,转换较少 可用一般的 glTF 加载程序加载
缺点 在除UniVRM之外的glTF加载器中,内存使用可能激增(虽然可以加载,但顶点缓冲区中可能会出现未使用区域) 在导出时,可能会增加顶点并改变顺序。在导入时需要费力合并。处理morphTarget较为繁琐。

在将 vrm-0.x 转换为 vrm-1.0 时,请绕Y轴进行180度的旋转。

例:

  prim0 prim1
position 100 100
index 0..100 0..100

👇

  prim0 prim1
position 100 100

バッファーが連結されている

【连接缓冲区】

index 0..100 100..200

実装
不要在Vrm专用的 gltfPrimitive 之间共享缓冲区加载程序,一般的glTF加载程序没有问题。

VRM-1.0

VRMC_vrm: meta

TODO

VRM 公共许可证文档1.0

VRM-1.0

VRMC_vrm: humanoid

重新调整了必要的骨骼。

翻译参考   VRM0 VRM1
脖子 neck 必须  
头部 head 必须 必须
臀部 hips 必须 必须
脊椎 spine 必须 必须
胸部 chest 必须  
左/右上臂 left/right UpperArm 必须 必须
左/右下臂 left/right LowerArm 必须 必须
左/右手 left/right Hand 必须 必须
左/右大腿 left/right UpperLeg 必须 必须
左/右小腿 left/right LowerLeg 必须 必须
左/右脚掌 left/right Foot 必须 必须

以下的项目将被废除(虽然曾经记录在VRMHumanoidDescription中,但未被使用)。

VRM-1.0

VRMC_vrm: expression

将 VRM 中的 BlendShape 更名为 Expression 。

BlendShape
BlendShape 原本是指 Unity 中的 MorphTarget 功能,如果两个东西都叫 BlenderShape 的话会令人很困扰。

重新修订了 Preset(预设)

  VRM0 VRM1
joy(joy 和 fun 难以区分) happy
angry angry
sorrow(书面语) sad
fun(joy 和 fun 难以区分) relaxed
(新规追加) surprised
a(替换为更加通用的国际音标) aa
i(替换为更加通用的国际音标) ih
u(替换为更加通用的国际音标) ou
e(替换为更加通用的国际音标) ee
o(替换为更加通用的国际音标) oh

 

 

 

 

 

 

 

 

 

VRM-1.0

lookat & firstperson

提示
在 vrm-0.x 中,firstperson 和 lookat 的区分并不明显,但现在已经分开了。

VRMC_vrm: lookat

degreeMap.curve 被废弃了

VRMC_vrm: firstperson


firstPersonBone 被被废弃,并将固定为Head 。

firstPersonBoneOffset 将变为 lookAt.offsetFromHeadBone

提示
在 vrm-0.x 中,没有区分 VR 头盔的参考位置和 look At 的基准位置,二者共用了 firstPersonBone + firstPersonBoneOffset(先是创建了 firstPersonBoneOffset,之后在创建 lookat 功能时被复用了)。

在 vrm-1.0 中,lookAt.offsetFromHeadBone 被用来表示 look At 的基准位置。

vrm-1.0 并不包含 VR 头盔的参考位置信息,这是因为无法确定一个准确的位置。然而,应用开发者可以继续使用 lookAt.offsetFromHeadBone 作为参考,来估算 VR 头盔的参考位置。

VRM-1.0

VRMC_springBone

  VRM0 VRM1

设置单位

房(应该是指骨骼链) 節(应该是指单段骨骼)
children[0] children 中的任意一个
末端 自动添加到 7cm 的距离 不追加
VRM-1.0

VRMC_springBone_extended_collider

规范: https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_springBone_extended_collider-1.0

VRMC_springBone_extended_collider 是什么?

VRMC_springBone_extended_collider 是对 VRMC_springBone 的扩展,添加了可用的碰撞器形状。

追加的Collider(碰撞体)扩展

除了 VRMC_springBone 可以使用的 球体碰撞器 和 胶囊碰撞器 之外,还将添加以下碰撞器形状。

内部Collider(碰撞体)

添加了 球形内部碰撞体 和 胶囊形内部碰撞体。与普通的 球形碰撞体 和 胶囊碰撞体 不同,它不是将物体推向外侧,而是将物体推向内侧。

平面Collider(碰撞体)

​添加了一个 平面碰撞体 。平面碰撞体 被定义为无限平面,并且它的作用是限制物体的移动范围,使其只能在平面的一侧移动。


Fall Back​(备用兼容方案)

VRMC_springBone_extended_collider 是对 VRMC_springBone 的一种向前兼容的扩展。因此,使用 VRMC_springBone_extended_collider 扩展创建的模型,即使在只支持现有 VRMC_springBone 规范的应用程序中也可以使用。

以 UniVRM 输出的模型为例,许多情况下,定义了 VRMC_springBone_extended_collider 的模型同时具有按照传统 VRMC_springBone 规范定义的 备用碰撞器 。因此,即使在旧版本的应用程序中也可以使用。但是,请注意,备用碰撞器无法完全再现 VRMC_springBone_extended_collider 定义的 内部碰撞器 和 平面碰撞器 的行为。"

正在推进将其实装

警告
VRMC_springBone_extended_collider 是一个刚刚制定的扩展,因此许多应用程序还没有进行实装与支持。

以下程序实装并支持 VRMC_springBone_extended_collider

VRM-1.0

emission(自发光)

支持 KHR_materials_emissive_strength。

emission(自发光) 与 glow(辉光)【glTF相关,暂无翻译】

信息
vrm-1.0 可以与 KHR_materials_unlit 一样,同时使用 KHR_materials_emissive_strength。

信息
UniVRM 支持针对 gltf 和 vrm-1 的 KHR_materials_emissive_strength 的读写。

MTOON-0.X
在 vrm-0.x 中,不是使用 KHR_materials_emissive_strength,而是通过 mtoon-0.x 来处理超出常规范围的自发光效果。

VRM-1.0

VRMC_materials_mtoon

VRMC_materials_mtoon

https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_materials_mtoon-1.0

GLTF 的  MATERIAL 扩展

{
    "materials": [
        {
            "name": "MyUnlitMaterial",
            "pbrMetallicRoughness": {
                "baseColorFactor": [ 0.5, 0.8, 0.0, 1.0 ]
                // texture
            },
            // emission

            "extensions": {
                "VRMC_materials_mtoon": { // 👈
                    "specVersion": "1.0",
                    // ...
                }
            }
        }
    ]
}

TODO

VRM-1.0

VRMC_node_constraint

https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_node_constraint-1.0

VRM Animation(动画)

VRM Animation(动画)

VRM Animation

https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_vrm_animation-1.0

什么是“VRM Animation”?

VRM Animation 是一种格式,用于描述在 VRM 中定义的人型模型的动画。

文件的内容

VRM Animation 的用途

通过 VRM Animation,您可以在跨应用程序和模型使用人型模型的动画。

以下是一些 VRM Animation 可能的应用示例:

支持 VRM Animation 的应用程序

showcase

警告
得益于社区的支持,许多应用程序在支持 VRM Animation 的 draft 规范方面进行了合作。VRM Animation 规范刚刚正式发布。如果您使用支持 draft 版本的应用程序,行为可能与正式版不同,或可能无法按预期工作。

备注
若希望在此列表中增加新的应用程序,
请通过 GitHub 提交 issuesPull Request
请务必提供应用程序的名称与网址。

使用 VRM Animation 开发应用程序

VRM-1.0 已支持 VRM-Animation。

import

请参考 import(开发相关)retarget(开发相关)

export

此外,如果 Unity 中存在 humanoid 动画,可以逐帧导出为 VRM-Animation。

EDITOR 专用

请参考 export(开发相关)

VRM Animation(动画)

VRM-Animation 导入

详情请参考VRM10Viewer(开发相关,无翻译)

VRM Animation(动画)

VRM-Animation 导出

请参考实装的 BVH Converter 

Assets/VRM10/Editor/VrmAnimationMenu.cs

说明

输入

为了导出 VrmAnimation,需要以下条件:

为了简单地达到以上条件,我们使用了bvh 格式文件。

警告:
如果 BVH 的初始姿势不是 T-Pose,将无法正常工作。

UNITY HUMANOID 不是必须的
使用 Animator.GetBoneTransform 会更简单。

初始化

VRM Animation exporter 使用说明
Transform humanoid_hierarchy;

var data = new ExportingGltfData();
using var exporter = new VrmAnimationExporter(
            data, new GltfExportSettings());
exporter.Prepare(humanoid_hierarchy.gameObject);

VRM Animation exporter 使用说明
exporter.Export((VrmAnimationExporter vrma) =>
{
    // get human bones
    var map = new Dictionary<HumanBodyBones, Transform>();
    var animator = bvh.Root.GetComponent<Animator>();
    foreach (HumanBodyBones bone in Enum.GetValues(typeof(HumanBodyBones)))
    {
        if (bone == HumanBodyBones.LastBone)
        {
            continue;
        }
        var t = animator.GetBoneTransform(bone);
        if (t == null)
        {
            continue;
        }
        map.Add(bone, t);
    }

    vrma.SetPositionBoneAndParent(map[HumanBodyBones.Hips], bvh.Root.transform);

    foreach (var kv in map)
    {
        var vrmBone = Vrm10HumanoidBoneSpecification.ConvertFromUnityBone(kv.Key);
        var parent = GetParentBone(map, vrmBone) ?? bvh.Root.transform;
        vrma.AddRotationBoneAndParent(kv.Key, kv.Value, parent);
    }

推进时间并注册帧

// get animation
    var animation = bvh.Root.gameObject.GetComponent<Animation>();
    var clip = animation.clip;
    var state = animation[clip.name];

    var time = default(TimeSpan);
    for (int i = 0; i < bvh.Bvh.FrameCount; ++i, time += bvh.Bvh.FrameTime)
    {
        state.time = (float)time.TotalSeconds;
        animation.Sample();
        vrma.AddFrame(time);
    }

输出

});
var glb =  data.ToGlbBytes();

提示
这是在通常的 glb 基础上添加了 VRMC_vrm_animation 的版本

VRM Animation(动画)

解决初始姿态差异的问题

使用与VRM-0.X兼容的数据时,在某些情况下,问题可能不会显现出来,如果...
     •模型骨架
     •动画骨架
都符合VRM兼容的标准化T-Pose,那么无需转换即可运行。

使用 UniVRM 实装的解决方案

在 UniVRM 的 vrm-1.0 中,包含了 ControlRig 这一组件,它能够支持初始姿态的转换。在运行时加载的过程中,ControlRig会自动进行设置和初始化。

使用 ControlRig  操作未标准化的模型(开发相关,无翻译)

也可以让 UNITY 的 MECANIM HUMANOID 代替
如果为运动的源和目标都设置了 humanoid avatar

解决方案

在 UniVRM 之外,也可以实现动画转换。

https://github.com/vrm-c/vrm-specification/blob/master/specification/VRMC_vrm_animation-1.0/how_to_transform_human_pose.ja.md

模型和动画的骨架需要满足 HumanoidBone 规范并处于 T-Pose,这是必要条件。