VRM-1.0
传统 VRM 现在将被归类为 VRM 0.x 并在未来将被弃用,而 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-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