VRM官方文档-汉化加强版-【VRM】
VRM-面向 VR 的 3Davatar(化身) 文件格式
「VRM」是一种用于处理 VR 应用程序的人形3D化身(3D模型)数据的文件格式。它基于 glTF2.0,并且任何人都可以自由使用它。
此外,还提供了用于在 Unity 中进行 VRM 文件读写的基于 C# 的标准化的实现方式(UniVRM),并且它是开源的。
内容来源于VRM官方文档,修改了原文部分牛头不对马嘴的部分,结合了英文与日文两个版本,并根据个人经验进行精修(官方文档两个语言版本内容有不一致的地方,甚至互相缺少某些内容)。
官方文档中的例图使用的插件为旧版本,与新版本有所差异,针对这一问题,在翻译文档的过程中,对官方所有的操作进行了复现,补充了官方缺少的很多操作细节。
因此,本文档并非一板一眼的翻译,针对部分词汇和文本,会根据情况进行调整或重写,以尽量符合国内CG行业用语和中文语言习惯。
- 关于VRM:VRM是什么?VRM能做什么?
- 如何制作VRM
- 将 VRM 导入到查看器
- VRM 的许可证设置
- VRM 开发相关
- VRM-1.0
- vrm-1.0
- VRM-1.0 的变更点
- gltf 存储细节
- VRMC_vrm: meta
- VRMC_vrm: humanoid
- VRMC_vrm: expression
- lookat & firstperson
- VRMC_springBone
- VRMC_springBone_extended_collider
- emission(自发光)
- VRMC_materials_mtoon
- VRMC_node_constraint
- VRM Animation(动画)
关于VRM:VRM是什么?VRM能做什么?
什么是VRM
VRM 是处理 [人形] 的 [character avatars(角色化身)] 的一种文件格式。
- 该格式基于glTF,因此是跨平台的,适用于游戏引擎和Web环境。
➡plugins(外部程序) - 提供了用于在 Unity 中读取和写入 VRM 文件的标准化实现方式。
➡UniVRM
内容
- VRM 是基于 3D 标准格式 glTF2.0 构建的,用于处理人形模型。由于 VRM 定义了人形角色的标准构成方式,可以根据 VRM 中定义的人形骨骼来重现人形动作(例如使用动作捕捉数据或其他适用于人形角色的通用动作数据)。
- 可以轻松地在运行时加载:VRM 的所有的纹理、材质等数据都打包在一个文件中。
- 定义了标准的面部操作,例如 "喜怒哀乐"、"眨眼"、"あいうえお"(的口型)等,由此可以实现以下功能:
- 通过用户操作选择表情。
- 通过声音实现嘴型同步。
- 随机眨眼。(不需要人为控制的自动眨眼)
- 分配面捕数据。
- ➡BlendShape
- VRM 支持3种类型的 materials (shaders)【材质(着色器)】。
- VRM 支持3种类型的视线控制方式
- 针对角色的头发、布料等需要物理晃动效果的部分,提供了不依赖于物理引擎的标准化实现方式。
- VRM 中包含“第一人称视角信息”,以便于在 VR 中使用 VRM 作为 avatars,
- VRM 不仅包含标题和作者等 Meta(元数据),还可以包含缩略图和针对 avatars 的特定许可证信息,以适应VR时代。
综上所述,VRM 的构成不仅限于简单的模型数据,还可以被应用程序加载并立即使用。
你可以用VRM做什么?
您可以在兼容VRM的不同应用程序之间使用同一个 avatars(3D模型)数据。当各种应用程序都支持VRM时,这将创造出这样的未来...
- 使用 VRM 兼容的角色制作工具创建自己的 avatars。
- 在直播中使用自己的 avatars,然后发现朋友也开始直播,于是前去参与朋友的直播。
- 直播结束后直接启动 VR 游戏,使用自己的 avatars 在虚拟世界中探索。
- 玩腻了游戏后,转移到虚拟世界的聊天室。与朋友一起使用相同的 avatars 进行游戏。
- 第二天参加了虚拟现实学习会议。当然,avatars 保持不变。
通过使用你自己的VRM格式的 avatars(3D模型数据),您可以在各种兼容 VRM 的应用程序和游戏中互相切换。
直播、视频创作、游戏、聊天......虚拟世界彼此之间没有连接。使用 VRM 是连接这些虚拟世界的第一步。
VRM 的特征
在 VR(Virtual Reality)和 VTuber 等相关情景中,如果想要处理“角色和人型的虚拟形象(的3D模型)”的话,以前每个应用程序、3D模型数据都需要开发自己的系统或进行细致的调整。
因为…
- 根据制作3D模型的创作者和使用的建模工具,“作法”不同,导出数据的状况各不相同。
- 坐标系不同(Y-UP,Z-UP,右手系,左手系)。
- 衡量尺度不同(如:以米为单位,以厘米为单位)。
- 初始姿势不同(T-Pose、A-Pose、Z+朝向、Z-朝向)。
- 表情的表现方法不同(Morph,Bone,识别方法)。
- Bone(骨骼) 的设置也根据状况而不同(形态、父子关系、识别方式)。
- 每家公司都有自己的处理3D模型数据的规范,这些数据比平时复杂得多。此外,关于他们文件格式的必要信息通常没有完全提供。
- 广泛使用的"FBX文件"在不同应用程序中的可读性可能有所不同。很多人可能会关注是在哪个应用程序的哪个版本中导出的FBX。
补充:FBX 是非开源格式,目前所属 Autodesk,该格式能存储包括模型、骨骼、灯光、相机等数据。但是很多格式细节并未公开,因此会导致一些兼容性问题。比如开源程序 Blender 的 FBX 模块好像就是自研的,因此对 FBX 格式的兼容并不完美。故而导致 即使格式都是 FBX,但文件实际上也会有所区别。并且在 Blender 不同版本中的 FBX 也有区别。且 FBX 格式本身也存在 2006~2019 等多个版本,之间的功能特性和兼容性均有不同。
- 游戏引擎能够将3D模型作为资产导入,但往往不会考虑游戏运行时动态加载这些资产的情况。
- 广泛使用的"FBX文件"在不同应用程序中的可读性可能有所不同。很多人可能会关注是在哪个应用程序的哪个版本中导出的FBX。
- 从"以3D模型数据作为角色"的视角来看,缺乏必要的信息。
- 例如,为了实现第一人称视角,如何获取正确的视点位置。为了正确的显示效果,需要单独隐藏头部的模型,但具体要消除哪部分等等。
随着在虚拟现实应用中使用 avatars 越来越普遍,如果上述情况不改变,应用程序开发人员和3D模型创作者将不得不付出两倍或三倍的努力。为改善当前的情况,基于人形角色和 avatars,我们可以采取以下措施改善这种情况:
- 将必要数据存储在 Humanoid Character 和 avatars 中
- 有效地吸收和统一模型数据的差异
- 使应用程序端处理3D模型变得简单
因此 VRM联盟 提出了一个独立于平台的、具有上述特点的 3D avatars 文件格式-VRM。
上传/下载VRM文件
此外,在将 VRM 文件上传到 Nikoni 3D时,还有一个选项「バーチャルキャスト連携」(virtual cast cooperation),这使用户可以在Virtual Cast 中使用VRM模型。
VRM应用程序开发
如何制作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 设置正确,才能实现表情动画。
添加脚本:
将 VRM 导入到查看器
单击此处获取 VRM 查看器应用程序。
或者您可以使用 UniVRMTest 的查看器:
- 从 UniVRMTest/releases 下载 VRM 查看器 (VRMViewer_v0.xx.x.zip)
- 运行程序 (VRMViewer_v0.xx.x.exe) 并单击【VRM Model】按钮
- 选择一个 VRM 模型,该模型将出现在场景中
译者补充:
UniVRMTest 的版本目前已经过时,暂停维护了。相关功能似乎被合并到了 【UniVRM_Samples-0.XXX.0_XXXX.unitypackage】 里,这个东西你可以在 UniVRM 的发布页找到。 我也没用过 VRMViewer,但是从界面来看,好像和 UniVRM_Samples 差不多,应该是集成进去了。
VRM 的许可证设置
VRM 是一种 VR 时代的 3D avatar 格式,如果要在多个应用程序之间相互使用。例如,如果“通过网络使用 avatar 进行 VR 交流”,则需要将自己的 avatar 数据发送给其他用户,以便“让别人那里看到自己的样子”。然而,可能存在一些情况,仅凭基于传统思维的再分配规则是无法处理的。因此,VRM 中具有
- 对模型数据本身 修改/再分发 的规定。(可通过 Creative Commons 等设定)
除此之外,还有
- 关于使用 avatar 进行各种活动的许可,
这可以使 VRM 成为一个适应虚拟现实时代的格式。
以下是 VRM 文件中关于许可信息的标准选项。你可以设置以下这些许可信息。
虚拟形象/角色的各项使用许可【Personation / Characterization Permission】
授权的范围/谁可以使用这个形象进行活动-(A person who can perform with this avatar)
- 仅限模型创建者使用 (The avatar may only be manipulated by its creator)
- 仅授权给明确指定的人 (Authorized only to explicitly specified person)
- 授权给所有人 (Authorized to anyone)
是否允许使用这个形象进行暴力性质演出-(Permission to perform violent acts with this avatar)
- 不许可 (Disallow)
- 许可 (Allow)
是否允许使用这个形象进行性行为的表现-(Permission to perform sexual acts with this avatar)
- 不许可 (Disallow)
- 许可 (Allow)
是否允许用于商业用途-(For commercial use)
- 不许可 (Disallow)
- 许可 (Allow)
其他许可条件-(Other License Url)
在存在除上述许可条件以外的许可条件的情况下,可以写入外部许可文档的URL。
再分发或修改的许可范围-(Redistribution / Modifications License)
许可证类型(License Type)
- Redistribution Prohibited(禁止再分发)
- Copyright wavier (CC0)(放弃著作权)
- Creative Commons CC BY License (CC_BY)
- Creative Commons CC BY NC License (CC_BY_NC)
- Creative Commons CC BY SA License (CC_BY_SA)
- Creative Commons CC BY NC SA License (CC_BY_NC_SA)
- Creative Commons CC BY ND License (CC_BY_ND)
- Creative Commons CC BY NC ND License (CC_BY_NC_ND)
- Other(其他)
关于许可证类型,可以【点击此处】查看每种许可证的含义,同时,这个网站内有一个根据需求想你推荐适合你的许可证的程序。
上面括号里的每一个缩写都是一种许可证名称的缩写,是可以根据需求自己组合使用的。
如果选择 CC0 协议,意味着你放弃一切权力并将作品贡献给全球公有领域。
VRM 开发相关
VRM 的特征 (面向开发者)
vrm-0.x
vrm-1.0
右手坐标系(Y-UP)➡️ Coordinate(面向开发者,暂无翻译)vrm-0.x
vrm-1.0
以m(米)为单位➡️你不用担心1代表是1米还是1厘米。vrm-0.x
vrm-1.0
人型模型且骨骼结构已固定 ➡️ 便于使用通用的人型动作和动作捕捉技术。vrm-0.x
vrm-1.0
T-Pose(0.x Z-
1.0 Z+
)为初始姿势 ➡️ 可直接用于 TPS/第三人称射击游戏 等用途。vrm-0.x
在初始姿势下保证无旋转、缩放➡️ 可减轻考虑初始姿势的代码编写负担。
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-0.x
保证了在初始姿势下,骨骼和网格会完全重合(蒙皮绑定矩阵中仅包含移动变换)➡️ 可以在处理 Mesh 前减少 Bake 等操作的负担。- (日英两种语表达含义互相冲突,没法翻译,本句留空。)
vrm-0.x
vrm-1.0
表情、视线的控制方式进行了统一➡️BlendShapeProxy(面向开发者,无翻译)vrm-0.x
vrm-1.0
预设了非基于物理的晃动效果 ➡️ 在不干扰物理模拟的情况下实现晃动,不会乱动或干扰游戏机制。vrm-0.x
vrm-1.0
包含了 VR 的相关设置➡️FirstPerson(面向开发者,无翻译)vrm-0.x
vrm-1.0
可以在文件内写入许可证信息➡️避免使用在不符合模型作者意愿的地方。
与传统游戏开发不同,VRM 更适用于在运行时动态加载,而不是将其作为项目资产提前打包或加载。
在 UniVRM 中运行时加载
可以在运行时使用 UniVRM 加载功能。UniVRM 不创建 Asset(Prefab),而是直接在场景上创建 GameObject。加载的 GameObject 可以像安装的 Prefab 一样处理。
在 UniVRM 中运行时导出
可以在运行时使用 UniVRM 导出功能。您可以使用此功能实现角色创建工具。
Assets/VRM.Samples/Scenes/VRMRuntimeExporterSample.unity
上面就是一个例子。
UniVRM 以外的处理的 VRM 的方法
- https://github.com/ruyo/VRM4U
- https://github.com/saturday06/VRM_IMPORTER_for_Blender
- https://github.com/virtual-cast/babylon-vrm-loader/
- https://github.com/pixiv/three-vrm/
- https://github.com/V-Sekai/godot-vrm
VRM-1.0
传统 VRM 现在将被归类为 VRM 0.x 并在未来将被弃用,而 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 的人格许可问题。
实装
在Unity中,[UniVRM」作为正式的实现方案已经存在。
API
支持的应用程序
VRM-1.0 的变更点
相对于 VRM0.X 的变更点
- glTF: z- forward => z+ forward
- glTF: shared bufferView => divided bufferView
- VRM0: meta =>
VRMC_vrm
meta - VRM0: humanoid =>
VRMC_vrm
humanoid - VRM0: blendshape =>
VRMC_vrm
expression - VRM0: lookat =>
VRMC_vrm
lookat - VRM0: firstperson =>
VRMC_vrm
firstperson - VRM0: springBone =>
VRMC_springBone
新增
=>VRMC_materials_hdr_emissiveMultiplier
- VRM0: mtoon =>
VRMC_materials_mtoon
新增
>VRMC_node_constraint
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
加载程序没有问题。
VRMC_vrm: meta
TODO
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
中,但未被使用)。
- armStretch(手臂伸展)
- legStretch(腿部伸展)
- upperArmTwist(上臂扭转)
- lowerArmTwist(前臂扭转)
- upperLegTwist(大腿扭转)
- lowerLegTwist(小腿扭转)
- feetSpacing(脚间距)
- hasTranslationDoF(是否有平移自由度)
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 |
- 添加 overrideMouse(覆盖鼠标)、overrideLipSync(覆盖嘴型同步) 和 overrideBlink(覆盖眨眼) 设置。
- 将 VRM0 的 materialBind(材质绑定) 整理到 MaterialColorBind(材质颜色绑定) 和 TextureTransformBind(纹理变换绑定)。
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 头盔的参考位置。
VRMC_springBone
VRM0 | VRM1 | |
---|---|---|
设置单位 |
房(应该是指骨骼链) | 節(应该是指单段骨骼) |
子 | children[0] | children 中的任意一个 |
末端 | 自动添加到 7cm 的距离 | 不追加 |
- 将扩展分离 => 形成独立的
VRMC_springBone
扩展 - 给 Collider 形状添加了 Capsule(胶囊)
- 修正 Unity 坐标系的混杂问题
VRMC_springBone_extended_collider
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
。
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 来处理超出常规范围的自发光效果。
VRMC_materials_mtoon
VRMC_materials_mtoon
https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_materials_mtoon-1.0
- 将扩展分离 =>
VRMC_materials_mtoon
成为了一个独立的扩展
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
VRMC_node_constraint
https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_node_constraint-1.0
VRM Animation(动画)
VRM Animation
什么是“VRM Animation”?
VRM Animation 是一种格式,用于描述在 VRM 中定义的人型模型的动画。
- 同一个 VRM Animation 文件可以用于所有 VRM 文件。
- 该格式使用 glTF 描述,是一个跨平台格式。
- UniVRM 提供了在 Unity 中导入和导出 VRM Animation 的标准解决方案。
文件的内容
- 动画被描述为 glTF animation。
- 扩展中定义了将 VRM 的每个组件与要实现动画效果的 glTF 节点相关联的信息。
- 在
VRMC_vrm_animation
扩展中定义。 - 建议使用
.vrma
扩展名。
- 在
- 🦴 可以描述 Humanoid bone animation (骨骼动画)
- 扩展内指定了 glTF 节点与哪个 Humanoid 骨骼相对应。
- 实现将转换动画的骨骼旋转,以正确反映到目标 VRM。
- 😄 可以描述 Expression animation (表情动画)
- 文件中包含表情的动画权重,表示为 glTF 节点的坐标。
- 除了 VRM 中定义的预设表情,如果目标 VRM 定义了对应的表情,也支持 custom expressions(自定义表达式)。
- 👀 可以描述 Gaze control animation(视线动画)
- 在扩展内指定了代表视线方向的 glTF 节点。
VRM Animation 的用途
通过 VRM Animation,您可以在跨应用程序和模型使用人型模型的动画。
以下是一些 VRM Animation 可能的应用示例:
- 使用支持 VRM Animation 的 authoring tools 创建动画
- 在各种应用程序中使用通过 motion capture 记录的动画
- 在 live streaming 和 photo 应用中使用使用 VRM Animation 创建的动画
- 将使用 VRM Animation 创建的动画带到 Metaverse,播放、与其他用户分享并共同使用
- 在 game engines 中加载 VRM Animation 文件,并在 game development 中使用
支持 VRM Animation 的应用程序
警告
得益于社区的支持,许多应用程序在支持 VRM Animation 的 draft 规范方面进行了合作。VRM Animation 规范刚刚正式发布。如果您使用支持 draft 版本的应用程序,行为可能与正式版不同,或可能无法按预期工作。
备注
若希望在此列表中增加新的应用程序,
请通过 GitHub 提交 issues 或 Pull Request。
请务必提供应用程序的名称与网址。
- UniVRM
- @pixiv/three-vrm
- VRM Add-on for Blender
- bvh2vrma
- VRoid Hub
- AnimationClipToVrmaSample
- VMagicMirror
- VRM Posing Desktop
- VRM スプリングボーン調整ツール
- VRMA, BVH をアップロードして VRM を動かすやつ
使用 VRM Animation 开发应用程序
VRM-1.0 已支持 VRM-Animation。
import
请参考 import(开发相关) 和 retarget(开发相关)。
export
此外,如果 Unity 中存在 humanoid 动画,可以逐帧导出为 VRM-Animation。
EDITOR 专用
请参考 export(开发相关)。
VRM-Animation 导入
VRM-Animation 导出
请参考实装的 BVH Converter
Assets/VRM10/Editor/VrmAnimationMenu.cs
说明
输入
为了导出 VrmAnimation,需要以下条件:
- 符合 humanoid 规范的游戏对象 hierarchy(层级) 结构。
- 确保人体模型的 hierarchy(层级) 结构处于 T-Pose 状态。
- 随着时间的推移,humanoid 的层级结构姿态会发生变化。
为了简单地达到以上条件,我们使用了bvh 格式文件。
警告:
如果 BVH 的初始姿势不是 T-Pose,将无法正常工作。
UNITY HUMANOID 不是必须的
使用 Animator.GetBoneTransform 会更简单。
初始化
Transform humanoid_hierarchy;
var data = new ExportingGltfData();
using var exporter = new VrmAnimationExporter(
data, new GltfExportSettings());
exporter.Prepare(humanoid_hierarchy.gameObject);
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-0.X兼容的数据时,在某些情况下,问题可能不会显现出来,如果...
•模型骨架
•动画骨架
都符合VRM兼容的标准化T-Pose,那么无需转换即可运行。
使用 UniVRM 实装的解决方案
在 UniVRM 的 vrm-1.0 中,包含了 ControlRig 这一组件,它能够支持初始姿态的转换。在运行时加载的过程中,ControlRig会自动进行设置和初始化。
使用 ControlRig 操作未标准化的模型(开发相关,无翻译)
也可以让 UNITY 的 MECANIM HUMANOID 代替
如果为运动的源和目标都设置了 humanoid avatar
解决方案
在 UniVRM 之外,也可以实现动画转换。
模型和动画的骨架需要满足 HumanoidBone 规范并处于 T-Pose,这是必要条件。