肢体语言如何工作
了解 Body Language 如何在每个 tick 中驱动 Convai 角色的姿态、呼吸和手势,以及它如何让位于脚本化手势。
每个 tick, ConvaiBodyLanguageController 读取角色的对话状态和情绪,确定它此刻的行为应当呈现为什么样子,并将该行为与 Body Animation 和 Gaze 已经写入的内容一起合成到骨架上。本页说明是什么驱动该决策、哪些部分产生动作,以及防止 Body Language 与脚本化手势相互冲突的规则。关于这些机制所构建其上的 composition-root 模型,请参见 角色 Embodiment.
每个 tick 驱动身体的因素
在 embodiment 中 认知 tick 中,控制器读取角色当前的 对话状态 以及其情绪读数,然后解析该状态下配置文件的策略——手势强度、聆听前倾、姿态偏置、呼吸频率和深度、坐立不安频率。状态变化从不会让策略骤然跳变:各项值会在配置文件的 策略过渡秒数 中平滑过渡,这样角色在开始说话的瞬间就不会明显地突然一震。
在后面的 表情 在 Animator 或 PlayableGraph 已经为骨架摆好姿势、而在 Gaze 之前,控制器的求解器会朝该 tick 的目标推进,并将每个通道——脊柱、肩膀、骨盆、头部手势回退——累积到一个共享合成器上,该合成器对每根骨骼恰好执行一次受保护写入。两个 Body Language 行为绝不可能在同一根骨骼上形成无界增量,因为始终只有一个写入者。
合成到身体上的行为
姿态
当前状态和情绪下持续的开放感、前倾和肩部紧张轮廓。
呼吸
持续的胸部和肩部扩张循环,以及屏气、叹息和开口前吸气事件。
手势
说话时与语音能量同步的头部节拍和姿态脉冲,以及手势之间的空闲手部和手腕微动。
聆听姿态
角色在聆听时会进入的前倾与静止状态。
小动作
缓慢的空闲重心转移,让静止的角色看起来不像僵住了。
站姿
站立身体执行的周期性骨盆重心转移和偏航循环。
姿态摆动
脊柱上持续的、不到一度的漂移,看起来像持续的微平衡,而不是抖动。
空闲宏周期
在呼吸深度、摆动和小动作节奏上极慢、持续数分钟的漂移,使长时间空闲永远不会稳定成一个明显循环的基线。
反应
由突发情绪激增自动触发或按需触发的一次性受惊退缩和愉悦弹跳。
头部手势
点头、摇头和歪头,无论来自随说话节拍、聆听时的倾斜保持,还是脚本化请求。
这些行为旁还运行着一个相机距离缩放:主摄像机离角色越远,摆动和手部微动的呈现就越大,因此小幅摆动在远处不会消失,在特写中也不会显得过度。它从不影响呼吸、姿态或手势——只影响环境质感。
它如何与 Gaze 和 Body Animation 共享骨骼
Body Language、Gaze 和 Body Animation 都可能同时关注同一条脊柱、肩膀和头部。Convai 通过协同而不是让一个模块压制另一个模块来解决这一点:Gaze 自己的躯干瞄准行为也是通过 Body Language 所写入的同一个共享合成器进行合成,因此二者从不会持有可能在同一根骨骼上竞争的独立写入保护。当 Body Animation 播放走路循环或全身动作时,它会在该段时间内接管身体——这是有意的交接,而不是冲突。
它如何让位于脚本化手势
Body Animation 的 talk-clip 系统可以每个 tick 报告一个抑制级别,而 Body Language 的整个伴随说话系统会先读取它,再决定要做多少:
无(或未注册表演者)
完全
完全
可执行
完全权重
上半身(正在播放上半身 talk clip 或移动)
完全
降低
拒绝
姿态减弱,呼吸保持完全权重
全身(正在播放全身动作或转身)
无
无
拒绝
两者都淡出至零
这就是为什么这两个模块看起来从不在互相争抢:当 Body Animation 播放一个预设的上半身手势时,Body Language 会让角色继续呼吸并保持头部节拍,但不会在同一动作上再叠加自己的姿态脉冲。呼吸被刻意设计为永不被抑制,即使在完全抑制下姿态和手势也会淡出——一个在做手势时停止呼吸的角色,会以一种其他任何表现都无法达到的方式显得异常。
下一步
肢体语言快速入门调整表现力肢体语言故障排查最后更新于
这有帮助吗?