如何制作VRM
如何制作VRM文件
使用 UniVRM 制作 VRM 文件的工作流程大致如下:
- 将 3D 模型导入 Unity 项目调整为T-Pose,并添加许可证信息。启用归一化后,输出 VRM 文件。
- 读取上面输出的 VRM 文件,在 Unity 中进行 VRM 特有的设置(许可、晃动物体、表情、视线、第一人称等),然后在不进行归一化的情况下输出VRM文件。
译者补充:T-pose 和 A-pose 是3D模型常用的角色模型初始姿势,人物动作呈现直立状态,主要区别在于 T-pose 为两手向身体两侧平举,A-pose 的双手为身体侧下方摆放。两种 Pose 在不同的地方可能也有细微区别,比如两腿并拢的程度,不同地方并拢的程度可能不同。一般读取动作数据时,并不是读取每个关节当前夹角多少度,而是相对于初始动作变化了多少变化量,因此会因为初始姿势的不同,导致最终动作也不一致。
重点是:
- 首先创建一个临时的 VRM 文件,然后重新加载该文件进行详细的调整和设置。这样处理会更加方便。
0.创建一个Unity项目并安装 UniVRM
下载 UniVRM
https://github.com/vrm-c/UniVRM/releases
请下载最新版本。文件名为UniVRM-0.XX.0_YYYY.unitypackag
补充:
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 似乎可以直接打开 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
文件夹中。
点击右下角的 import
按钮。
检查 UniVRM 是否导入成功
如果 UniVRM 导入成功,菜单栏会显示“VRM”菜单。
下面分别是新旧两种版本的样子。
新:
旧:
如果您使用的是Unity-2018,而VRM菜单没有显示:
进入“ProjectSettings
-Player
-Other Settings
-Scripting Runtime Version
”,查看“Scripting Runtime Version
”是否设置为“.Net4.X equivalent
”。
Console(控制台)
在 Unity 项目中发生的错误可以在控制台窗口中显示:
单击 Console 窗口左上角的 clear 按钮,查看控制台中是否留下任何错误(红色消息)。在大多数情况下,错误是由 UniVRM 安装失败引起的。
手册
➡ 安装
1.从 Humanoid 模型创建 VRM 文件
准备一个可在 Unity 中以 Humanoid 形式处理的 3D 模型
初次准备
- 请务必准备自己制作的模型,或者加工后被允许作为 VR avatar(化身)使用的模型数据。
因为
- VRM文件中嵌入的许可证设置,用户需要根据作者(自己或他人)的权限使用情况进行设置。
然后,确保包含必要的骨骼,使模型可以被识别为 Humanoid。
Humanoid
你可以将 Humanoid 简单地理解为一种骨骼结构标准,用于对人型模型进行统一,以便于进行重定向,会有比如:骨骼的名称、骨骼链接顺序于骨骼必要性之类的规范化标准。
基本模型
有关可用的基础模型的详细信息,请参见 BaseModel。
将 FBX 模型导入 Unity
将 FBX 文件夹拖放到 Unity 的 Assets 文件夹中
补充:
官方文档中并没有提供文档中使用的模型资源。官方使用的角色模型是由 黑星红白 创作并由 ニコニ立体 官方发布的免费可商用模型,模型可以在 ニコニ立体 找到。
https://3d.nicovideo.jp/alicia/
请注意下载的文件格式,虽然直接提供了 VRM 格式,但是如果为了学习使用,建议还是和文档中一样使用 FBX 格式进行学习。
Unity
补充:
以下其中一个是我自己打开 Unity 的界面截图(深色界面),另一个是官方文档提供的例图(浅色界面)。由于 Unity 版本不同,文件浏览界面的显示方式不同。
官方例图(旧版本)中,可以直接在列表中点击三角形将资源展开。
而在较新版本的左侧 Project 窗口中,需要选中“alicia”文件夹,然后在右边的文件预览窗口中找到“Alicia_Solid_Unity”。
这个预览的地方在文件名太长的情况看不全文件名,注意区分文件,有一个后缀是 MMD,可以进入修改文件名称状态查看完整名称(双击文件名或按 F2),或者选中文件后在右边的 Inspector (检查器) 窗口查看文件名称。
在 Project 窗口中,选中Alicia_Solid_Unity,这是FBX的资产 Prefab(预制件)。
(新版 Unity 请在旁边的窗口中查找相应资源)
FBX 的材质设置
如上图所示,默认情况下,FBX 的材质设置为带有默认参数的 StandardShader(仅分配了标准着色器的Color和ColorTexture,没有半透明设置等)。
为了尽量简单地演示 “FBX 转换为 VRM” 的操作,在接下来的示例中我们将材质的着色器设置为 MToon,并将颜色设置为白色。
具体操作方法请继续往下浏览。
补充:
上面的官方示例中是没有丢失贴图的,我复现官方操作时一直是丢失了贴图的状态(模型通体白色)。
下图内容为找回贴图的方式:
根据 FBX 文件实际情况不同,相关设置可能不一样。调整完设置以后,点击 Apply 应用设置,下面的预览窗口才会刷新。
着色器(Shader)
VRM支持三种类型的着色器:MToon, Unlit 和 Standard。
点击 Extract Materials
按钮,在 FBX 文件中创建 Materials
文件夹。
补充:这时会弹出选择文件夹的窗口,记得自己手动创建一个文件夹,并且选择这个文件夹,不然之后提取出来的文件是散的,会很乱。示例路径为 /Assets/FBX/Materials
然后将提取的材质保存到刚创建的 Materials 文件夹中。如果在On Demand Remap(按需重映射)部分已经为每个材质分配了引用,则可以跳过这一步骤。
英文文档中提到:
另一种设置材质的方法是将 Location 为 Use External Materials (Legacy)。但官方文档只关注前一种方法。
进入这个文件夹,把里面的所有材质的 Shader 改成 VRM/Mtoon
补充:可以在文件夹内同时选中所有材质,然后在查看器中同时修改。
将 Shade Color
切换为白色:
正确设置后的预览效果如下图所示:
关于如何设置 MToon 着色器的更多细节,请参考MToon设置。
因为是步骤说明,所以我们先继续往后。
将 fbx 设置为 humanoid
fbx 的 Animation Type 默认设置是 generic。
将它切换为 Humanoid。
并且点击 Apply
按钮应用设置。
你需要重新选中 Alicia_Solid_Unity 这个资源文件才能找到这个设置。(官方没说,搞得我找半天)
上面两图一个是旧版界面,一个是新版界面,除了颜色,基本没什么区别。
Humanoid
此时,fbx importer(FBX导入器) 会自动推测 Humanoid 骨骼的分配。有时可能会失败,并且,即使程序成功执行,也可能出现最终效果错误的情况。
点击 Configure
以配置你的模型。
将弹出一个消息框,询问您是否要保存当前场景。单击 save
保存它。
补充:我复刻操作但是没看到所说的这个保存当前场景的询问,可能是演示人员修改了其他设置没有保存,所以进入 Configure 界面时弹出了提示。
请检查并确认骨骼分配情况。
上面这个图,在官方文档里就像这样这么圈了划了几下,也没说怎么设置之类的,估计意思就是让你把错误的骨骼重新配置以下,这东西我也不会用,反正设置完以后点右下角的 Done
就可以退出这个界面了。
BONE(骨骼)
下巴骨骼可能被分配到前发际。
眼睛骨骼可能被分配到眼睛高光。
注意这些细节是否符合你需要的效果。
将 prefab(预制件) 放入场景中
将预制件从 “Project
”(项目) 窗口拖到 “Hierarchy
”(层次结构) 窗口。
新版本 Unity 直接把资源从 Poject 窗口拖到 Hierarchy 的层级菜单里,这样的话,角色会被放置在空间原点。如果直接拖动到3D窗口,角色会被放置在鼠标位置。
老版本的 Unity 直接从左边的大纲(文件树状图)里把 FBX 文件拖拽进去(文章开头也有提到两个版本的界面区别),官方文档放的老版本 Unity 的截图太长了这里就不放了。
官网的页面大改过一次(大概24年初),这一改,居然把这个位置的老版本 Unity 的示例截图弄丢了。这官方真就是个草台班子啊。本来还想把老版本的例图放上来对比的。
确认 fbx 的 blendshpae 法线是否混乱
以下是 BlendShape 中出现奇怪阴影时的对策。
从菜单中将模型导出为VRM
点击“VRM0
”->Export to VRM 0.X
”,弹出对话框。
旧一点的版本是,点击“VRM0
”->“xport UniVRM-0.XX.X
”。如下图:
再老一点的版本是,点击“VRM
” -> “UniVRM-0.XX.X
” -> “Export humanoid
” 如下图:
点击将 Export Root
栏右边的圈◉
,选中 prefab 展开的 GameObject ,将其设置到 Export Root。
ERROR(错误)
在导出对话框中执行各种错误检查。
1.必须要解决的错误消息会显示为“红色”
2.如果要立即导出VRM,则可以忽略警告的消息显示为“黄色”
导出对话框
补充:
如果导出前你没选中角色模型,下面则会提示:
中文:请为模型导出设置 ExprotRoot
日语:ExportRoot をセットしてください
英语:Please set up a ExportRoot for model export
右上角可以切换语言,但是窗口界面可能不会立刻刷新,需要重新打开窗口。
如果你在导出时已经选中了角色模型,则会跳过这个窗口进入下一个阶段
请输入许可证信息。如果没有红色消息,则可以点击 Export(导出) 按钮。为了进行下一步操作,请创建 Assets/models/vrm 文件夹并将其导出到该文件夹中。
导出位置
您可以选择将导出的文件放置在 Unity 中的 Assets 文件夹内或外。如果选择放置在 Assets 文件夹内,导出后会立即进行导入(导入较为耗时)。并且如果选择放置在 Assets 文件夹内,建议创建一个新的、专门的文件夹,以便更清晰地管理。
导出设置
Make T-Pose(制成 T-Pose)
如果模型不处于T形姿势,请单击“Make T-Pose ”以制作一个T形站姿姿势。
该功能可以将角色模型自动转换为 T-Pose。如果不使用此选项,自己在场景中手动调整成 T-Pose 的外观也没有问题。
Pose Freeze(姿态冻结选项框)
“Pose Freeze”用于导出过程中的模型规格化。新版本将自动勾选此复选框,以检查将自动检查导出目标是否需要规范化(在设置 ExportRoot 后自动检查是否存在旋转和缩放)。
2.设置VRM模块
VRM模型
上一节中,我们介绍了如何将模型输出为 VRM 格式的 prefab(预制文件)。
只要将 VRM 文件拖拽到 Unity 的 Assets 文件夹中,就会自动生成与 VRM 文件关联的 prefab(预制文件)。
只要将 VRM 文件拖拽到 Unity 的 Assets 文件夹中,就会自动生成与 VRM 文件关联的 prefab(预制文件)。
在上一节中,我按照官方文档说明,创建了“/Assets/models/vrm”文件夹并把VRM导出到这个文件夹,但是官方给的图有点对不上。官方的在图例是放在了“/Assets/vrm”。
- normalized(规范化)
- 选中 Prefab 文件(标准化模型),查看检查器窗口。如上图所示,一些组件被附加到了模型上(VRMMeta、Animator、VRMBlendShapeProxy、VRMFirstPerson、VRMLookAtHead、VRMLookAtBoneApplyer 等组件)。
以防图片看不清,再次特别提醒:在上图中,你选中文件以后,可以在资源管理器窗口底下一栏查看到文件的后缀名(红字标注位置)。
在场景中打开VRM预制件
File
→ New Scene
。
将 Prefab(预制文件) 展开到场景中。
新建场景时会提示你是否保存当前的场景,如果保存了的话,场景文件会存在 Assets\Scenes 文件夹里。
一个场景在没做任何变动的情况下,你切换或者新建一个其他场景时,不会提示你保存,如果是新建且未变更的场景,会直接被丢弃掉,不会保存。
你也可以使用之前导入了 FBX 的场景文件,但是要 Hierarchy(层级) 窗口中把角色模型移除,这个角色模型是之前的 FBX 文件预制件,没有 VRM 预制件的那些脚本组件。不要从 Project 窗口删除,这会直接把文件从你的文件夹丢进回收站,从而导致你的层级窗口的对象找不到文件,导致文件名件变成红色。
编辑VRM独有的设置
在菜单栏点击 【File 】→【New Scene 】创建一个新场景或使用现有场景。
然后将 Prefab(预制文件) 拖到 Hierarchy 窗口(这样的话,角色模型会自动放置在场景中间)。
通过在 Hierarchy(层级) 窗口中点击选中 VRM 预制件,可以在 Inspector(检查器) 窗口中显示出 VRM 模型的信息。请注意,物理骨骼设置在名为 secondary 的游戏对象中。此外,在VRM元数据中,请确保设置了标题、作者和授权信息 特别是许可证信息,这至关重要!(实际上不影响在程序上的使用,这是出于版权的尊重。)
补充:
图里文件右上角的蓝色加号似乎是代表新文件的意思,我之前从Project窗口删过一次文件,从回收站还原文件以后被识别成了新文件。
除此之外,要使VRM模型完全功能正常,请设置以下组件:
- 表情和口型的设置(BlendShape)
- 第一人称视角的设置(在VR应用中排除模型的头部,以及设置标准视角位置)
- 视线和眼球的活动范围以及可动曲线设置。不仅支持通过骨骼旋转眼球,还支持通过BlendShape实现眼球动画。
- 物理骨骼/碰撞组(SpringBone/SpringBoneCollider)的设置
请根据需要进行设置。
再次导出VRM文件
所有设置完成后,在 Hierarchy 中选择模型(导入的角色的 Prefab,选中最上层的父级游戏对象,不要选成展开的次级文件),然后再次从 VRM0
-> export UniVRM-0.XX
导出模型。
老一点的版本则是 VRM
- UniVRM-0.XX
- Export humanoid
不同版本的导出菜单稍有不同,上一节中有提过,之后不会再赘述,之后关于导出的文字描述我一般会直接复制官方文档的版本,但是截图我会使用自己截的。所以可能会出现,文字描述和图片的版本不一致的情况.
Pose Freeze (姿态冻结)
“Pose Freeze” 用于在导出过程中对模型进行规范化。
当设置ExportRoot
时,会检查层次结构中是否存在旋转和缩放,从而自动设置这个复选框。
即便进行了初次的标准化,但是
•如果之后添加了附件(如配饰),那么也需要进行姿态冻结。
只需重新设置ExportRoot
,系统就会自动进行判断。
•此外,还支持 BlendShape 烘焙功能。
完成!
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
作为追踪目标。
配置Head组件:
在 VRMLookAtHead 组件中找到 Head 部分,并确保已经正确配置了头部组件。设置好这个选项以后,你可以在下面的独立预览窗口中看到,视角所动到了角色的头部。
这个 Head 选项用于定位模型的头部,以便在下面的预览窗口中聚焦显示头部模型,可以在编辑与测试时提供一个预览视角,除此之外暂时不清楚有没有别的作用。
在Unity中测试动态效果:
点击窗口上方的三角形播放按钮进入播放模式,3D视图会自动切换到 Game 标签。在这个标签中,你无法移动视角或编辑物体。请切回 Scene 标签,然后拖动你所设置的 GameObject
来测试模型的视线追踪效果。
你可以在之前设置 Head 选项后出现的预览窗口中检查视线追踪效果。
或者在进入播放模式前,调整好摄像机的位置。通过 game 标签页查看效果。或直接在 Scene 标签页查看。
如果你发现眼睛没有跟随运动,请检查 【VRM Look At Applyer 】中的设置。如下图所示。
将相关组件配置好以后,在场景中检查模型的运动情况。模型的眼睛将在播放模式下追踪目标位置。你可以拖动对象的位置来测试模型的眼睛是否不断追踪对象。您可以在 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 设置正确,才能实现表情动画。
添加脚本: