模型动画参数(Animator Parameters)
阅读本篇文章需要特定的前置知识
您需要先了解 Unity 动画控制器 ,这样能帮助您更好的了解本文。
模型动画参数是一个用于 VRChat 模型可播放层动画器的参数列表,参数名称区分大小写。
模型动画参数包含预设参数与玩家参数
预设参数,也就是 VRChat 已经预置好的参数,可以被添加到任意可播放层中(FX,Action等),当这些参数的值因 VRChat 内部机制发生变动时,对应的新值就会同步给包含它们的可播放层动画控制器。
玩家参数,也就是您自创的参数,其值不会被 VRChat 内部机制更改,根据您为它们安排的位置,其新值可能取决于:
- 您在模型菜单中的按钮操作
- 模型可播放层中的状态机行为。
您需要将这些参数添加到可播放层动画控制器中才能使用它们。注意,这些参数名称区分大小写!
不要让您的动画器卡死!!
您应该假设参数值可能会发生变化。如果您的动画控制器“卡死”——也就是说,您没有为某个特定状态添加一个出口,或者下一个过渡状态——那么您的模型就可能会出问题。
模型动画参数列表
名称 | 描述 | 数值类型 | 同步类型 | 参数类型 |
---|---|---|---|---|
VelocityX | 横向移动速度(米/秒) | Float | IK | 预设 |
VelocityY | 纵向移动速度(米/秒) | Float | IK | 预设 |
VelocityZ | 前向移动速度(米/秒) | Float | IK | 预设 |
AngularY | Y 轴(垂直于地面的轴)上的角速度 | Float | IK | 预设 |
Grounded | 如果模型的脚部接触到地面,则为 True ,反之则为false | Bool | IK | 预设 |
AFK | 如果玩家暂时不在游戏中(当头显未检测到人体或您已按下 End 键时),则为 True | Bool | IK | 预设 |
Upright | 您的身体直立程度。0 表示卧倒,1 表示完全直立于地面 | Float | IK | 预设 |
TrackingType | 请参阅下文描述 | Int | Playable | 预设 |
VRMode | 如果玩家处于 VR 模式中,则为 1 ;反之则为 0 | Int | IK | 预设 |
MuteSelf | 如果玩家关闭了自己的语音开关,则为 true ;反之则为 false | Bool | Playable | 预设 |
Voice | 当前麦克风音量(0.0-1.0 ) | Float | Speech | 预设 |
Earmuffs | 如果玩家已打开耳罩功能,则为 true ;反之则为 false | Bool | Playable | 预设 |
VelocityMagnitude | 模型当前总移动速度(矢量)的大小 | Float | IK | 预设 |
ScaleFactor | 当前模型高度与默认高度之间的比例。例如当默认视角球高度为 1 米的模型缩放到 2 米时,将表现为2 | Float | Playable | 预设 |
ScaleFactorInverse | 当前模型高度与默认高度之间的倒数比例(1/x )。例如当默认视角球高度为 1 米的模型缩放到 2 米时,这个参数的值为 0.5 。该参数值在极端情况下可能不准确。 | Float | Playable | 预设 |
ScaleModified | 如果玩家缩放了当前模型,则为 true ;反之,则为 false | Bool | Playable | 预设 |
EyeHeightAsPercent | 模型的视角球高度与默认缩放限制(0.2 -5.0 )之间的关系。例如当模型缩放为 2 米,那么这个参数的值是 (2.0 - 0.2) / (5.0 - 0.2) = 0.375 | Float | Playable | 预设 |
EyeHeightAsMeters | 当前模型的视角球高度(以米为单位)。 | Float | Playable | 预设 |
IsOnFriendsList | 如果查看模型的玩家与使用模型的玩家互为好友,则为 true 。如果是其他情况,则向模型为 false | Bool | 其他 | 预设 |
Viseme | 表示口型,大小范围为0-14 。当模型的 Viseme 模式使用 Jawbone/Jawflap 时,则表示您的当前麦克风音量,大小范围为 0-100 。 | Int | Speech | 预设 |
GestureLeft | 左手当前手势,范围为 0-7 | Int | IK | 预设 |
GestureRight | 右手当前手势,范围为 0-7 | Int | IK | 预设 |
GestureLeftWeight | 左手手柄的扳机按压幅度,0.0 表示不按下扳机,1.0 表示完全按下扳机 | Float | Playable | 预设 |
GestureRightWeight | 右手手柄的扳机按压幅度,0.0 表示不按下扳机,1.0 表示完全按下扳机 | Float | Playable | 预设 |
Seated | 如果模型已就座(姿态处于 Seated 状态),则为 True | Bool | IK | 预设 |
InStation | 如果玩家在 VRCStation 中,则为 True ;如果不在 VRCStation 中,则为 false | Bool | IK | 预设 |
IsLocal | 如果该模型是由本地玩家(您自己)使用的,则为 True ;否则为 False | Bool | 无同步 | 预设 |
AvatarVersion | 如果该模型上传时,SDK 版本在 2020.3.2 后,则为 3 ,反之则为 0 | Int | IK | 预设 |
任意名称 | 玩家自定义模型参数(Expression Parameters) | Bool,Int 或 Float | IK 或 Playable | 玩家 |
关于部分参数的附加说明
† GestureLeftWeight
和 GestureRightWeight
的值会根据扳机的按压力度从 0.0 变化到 1.0。
举例来说,如果您使用左手握住了手柄,但大拇指不按压扳机,GestureLeft
的值将为 1,但 GestureLeftWeight
的值将为 0.0。当您开始按压扳机时,GestureLeftWeight
的值将从 0.0 逐渐增加到 1.0。您可以使用这种特性来条件性的检测某些东西。
预设参数只能被读取,无法被玩家手动写入。
参数类型(Parameter Types)
在定义参数时,您可以使用三种类型的变量。
定义参数。在这里所指的“内存限制”为同步参数时使用的带宽限制,而不是模型的内存使用限制。
参数类型 | 范围 | 内存使用 | 备注 |
---|---|---|---|
int | 0 -255 | 8 位 | 无符号 8 位整数。 |
float | -1.0 到 1.0 | 8 位 | 有符号 8 位定点小数。 |
bool | True (1) 或 False (0) | 1 位 | 1 位逻辑数 |
† 由远程同步来的 float
值有 255 个可能的值,其跨网络精度值为 1/127
,可以精确存储 -1.0
、0.0
和 1.0
。当在本地更新时,例如使用 OSC,浮点值以原生(32 位)浮点值存储在动画控制器中。
GestureLeft
和 GestureRight
参数值解释列表
它们的值及这些值对应的手势名称如下:
参数值 | 手势名称 |
---|---|
0 | Neutral |
1 | Fist |
2 | HandOpen |
3 | FingerPoint |
4 | Victory |
5 | RockNRoll |
6 | HandGun |
7 | ThumbsUp |
译者注释
您可以在这里了解这些手势及它们在不同平台上的触发方法:
Viseme
参数值解释列表
该参数的值遵照 Oculus 口型标准,以下供参考:
Viseme 参数 | Viseme |
---|---|
0 | sil |
1 | pp |
2 | ff |
3 | th |
4 | dd |
5 | kk |
6 | ch |
7 | ss |
8 | nn |
9 | rr |
10 | aa |
11 | e |
12 | i |
13 | o |
14 | u |
同步模式
- Speech - 仅用于
Viseme
,该参数由您的语音驱动,使用 Oculus Lipsync 标准输出值。参数值在本地更新,不直接同步给其他玩家(当您的音频同步到其他人后,它就会驱动参数,并在他们的本地完成更新值)。 - Playable - 一种比 Speech 更慢的同步模式,适用于不频繁变动的参数。它会根据具体情况,每 0.1 到 1 秒更新一次值(也就是每秒 1 到 10 次更新)。不建议您依赖它进行快速同步。
- IK - 一种比 Speech 更快的同步模式,适用于频繁变动的参数。每 0.1 秒更新一次。它会根据具体情况,将一部分的值在远端玩家的本地插值为
float
,一部分的值会仅基于模型的本地渲染 IK 状态来计算。
当您在 Puppet 菜单中使用模型参数时,它会自动从 Playable 同步切换到 IK 同步,以保证快速的更新速率和平滑的插值。关闭操控轮盘后,数值将切换回 Playable 同步模式。
驱动模型参数
此外,在动画控制器中,可以通过状态行为中Avatar Parameter Driver
将模型参数固定到某个值,或进行一些其他的设置参数操作。
AFK 状态
AFK 状态由以下情况触发:
- (VR) 玩家摘下头显,头显传感器未检测到用户
- (VR) 打开 VR 系统菜单。这取决于您使用的具体头显平台 -- 例如,打开 Oculus Dash 菜单不会被判定为 AFK,但打开 SteamVR 菜单会被判定为 AFK。这个效果并非预期设计,而是一种间接的结果。
- 玩家按下 End 键,切换 AFK 状态。
TrackingType
参数值解释列表
参数 | 描述 |
---|---|
0 | 模型未初始化,该值一般仅在玩家切换模型且其 IK 数据尚未被发送时出现。 |
1 | 模型骨架类型为通用骨骼,该值一般在玩家启用了某种追踪(例如头显或追踪器),但由于模型骨架类型被设置为通用骨骼,导致追踪被关闭时出现。如果同时 VRMode 的值为 0,则表明玩家是桌面用户,而不是 VR 用户。 |
2 | 仅手部追踪,没有手指追踪,该值只会在过渡状态中临时出现—— TrackingType 可能马上会变化到另一个值,并不会恒为该值。 |
3 | 头部和手部追踪,如果 VRMode 为 1 ,则玩家处于 3 点追踪的 VR 端中。如果 VRMode 为 0 ,则玩家处于桌面电脑端中。 |
4 | 4 点追踪 VR 用户,头部、手部和腰部追踪。 |
6 | 全身追踪 VR 用户,头部、手部、腰部和脚部追踪。 |
因此,当 VRMode
为 1 时,请注意对 TrackingType
的值的使用:
- 如其值为 3,4 或 6,则代表当前玩家佩戴的 VR 追踪设备数量。当设备数量发生变化,这个值也会发生变化,在设计动画控制器时您需要考虑到这一点。
- 如其值为 0,1 或 2,则代表模型仍在初始化。请勿使用这些值来组合设计动画控制器,而是使用 3,4 或 6 等有效值来设计。
Expression 参数名称
如果您在 Expression Parameter
文件中新建参数,请务必重命名这些新参数。因为新建的参数名会继承列表中最后一个已有参数的名字。
您可根据自己的标准,来命名这些新参数。命名好后,您可直接在动画器中使用这个参数。此外,菜单中按钮名称与动画器中的参数名称不必一一对应。只要它们使用的 Expression 参数名称相同即可。因此您可以随意修改您的菜单按钮名字,而不必担心按钮名字和 Expression 参数冲突。
在命名自己的参数时,您可加入斜杠符号(/
)来归类它。
例如:将参数命名为 Toggles/Hat
,那么在动画器的过渡(Transitions)和 Expression 菜单中,选择该参数时将显示为: Toggles -(光标停留时展开下拉菜单)-> Hat,选择完毕后,参数的名字是Toggles/Hat
。这种命名方式不会改变参数的工作方式,但是会使得管理大型参数列表更加方便。
VRChat 动画器默认参数
VRChat Avatar(模型)模板动画器中预留了一些默认参数。如果您打算使用这些模板动画器,那么其中的预留参数不会与您自创的参数产生冲突,只要它们的名字不雷同。
作为例子,Action 和 FX 层的模板动画器就包含了一些默认参数。您不需要担心怎么配置这些层里的模型功能。
其中,Action 使用的默认参数名为 VRCEmote
,是一个范围为 1 到 16 的整数。
而 FX 使用的默认浮点参数名为 VRCFaceBlendH
(-1,1)和 VRCFaceBlendV
(-1,1),如果您打算使用这些模板动画器,那么您可在模型菜单中使用这些参数。 此外,默认的 FX 层动画器的表情动画要求您有一个名为 Body
的蒙皮网格,其中包含 mood_happy
、mood_sad
、mood_surprised
和 mood_angry
等形态键。
再次强调,如果您将一个模型上传为虚拟形象,而 ta 没有自定义的可播放层,那么只要您的模型拥有上述形态键,您就可以使用动画器的预制表情。
如果还有一个名为 eyes_closed
的形态键,当您使用默认的 Die 表情或进入 AFK 状态时,这个形态键会使得您的模型闭眼。
跨平台参数同步
当您使用的模型同时有 PC 和 Quest 版时,那么对于这两个版本,参数不是通过参数的名称,而是通过它们在参数列表中的位置和参数类型进行同步的。要使给定参数在 PC 和 Quest 之间同步,它必须在参数列表中的相同位置,并且具有相同的参数类型。
鉴于这一点,建议在 PC 和 Quest 版本的模型中使用相同的 Expression Parameters 资源,即使其中某个版本不会使用所有参数。