第四节还剩2.1秒,球队落后两分。玩家操控的小前锋在弧顶吸引包夹,把球分到左侧底角,控卫闻朔后撤一步出手,三分命中,全场起立。闻朔转身时笑了,眼睛眯起来,肩膀一下子松开,冲过来撞了玩家的胸口。三周后的一场客场比赛,第三节他连续两次运球失误,主教练叫了暂停把他换下,替他上场的是玩家上个月在训练中力荐的新秀程锐。闻朔走向替补席时也笑了一下。如果这两次笑用的是同一组嘴角弧度、同一段动画,玩家看一眼就会明白:屏幕里站着的只是一张会动的贴图,还算不上一个人。
先写清楚闻朔是谁,表情才有出处
一个体育数字人的脸型、发型、球衣号码和投篮动作,只是最外层。在乐鱼体育的角色设计思路里,闻朔首先是一份人物档案:二十九岁,首发控卫,合同只剩最后一个赛季;性格偏Reserved,场上话少,采访时习惯用短句;职业目标是再签一份长约,最好留在这支球队。
这些设定给他的表情划定了一个默认范围。外向的新秀在绝杀后可能跳上技术台,闻朔大概只会握拳、咬住护齿,再去找那个传球的人。被换下时,脾气外放的球员也许会把毛巾甩在地上,闻朔更可能把情绪压住,只露出一个很浅的笑。表情库可以共用,但哪一张脸在什么时刻被调出来,要由人物本身决定。缺了这一层,数字人做得再精细,也只是一套谁都能穿的皮肤。
情绪是一组叠在一起的状态
固定表情的问题在于把情绪当成开关:赢了播放“开心”,输了播放“失落”。真实球员的情绪至少有三层。第一层是比赛带来的即时反应,比如绝杀一刻的兴奋、失误之后的懊恼;第二层是持续一段时间的底色,比如合同年的焦虑、连续几场手感冰冷后的自我怀疑;第三层是他愿不愿意把情绪表现出来,这取决于性格和场合。
回到那两次笑。绝杀之后,即时反应是强烈的正向情绪,底色也在上扬,全场气氛又放大了表现欲,所以笑容会牵动眼周肌肉,身体完全打开。被换下时,即时反应是挫败和难堪,底色里还压着合同年的担忧,而他的性格要求他在镜头前保持体面,于是嘴角上扬,眼睛却没有跟着动,脚步比平时快,经过教练身边时没有停下来击掌。Facial Expression和Body Animation在这里是同一个情绪状态的两种输出,只改其中一个就会穿帮。
声音往往比脸更早暴露情绪
绝杀之后的更衣室里,闻朔的声音会比平时高半度,语速更快,还会主动点名:“那个球你看得真准。”被换下的那个晚上,队友问他怎么样,他照样说“没事,下场再来”。这句话单看文字和平时一模一样,差别藏在前面那半秒停顿、偏低的音量和提前收住的尾音里。Reserved性格的角色尤其如此,他们很少直接说出情绪,情绪都在节奏里。如果语音系统只会按文本朗读,这类人物最先失去可信度。
声音还要和场合匹配。赛后发布会上面对记者,他的回答会更平、更像标准答案;只有回到更衣室或坐上回程大巴,面对信任的人,他才会多说一句“今天是我的问题”。同一句台词放进不同的Context,用不同的声线说出来,往往比多录十句新台词更能让人物站住。
玩家的语气和表情,也是数字人读取的信号
数字人的互动是双向的。赛后玩家走到闻朔身边,可以点选对话选项,也可以直接开口。如果玩家那一侧接了摄像头和麦克风这类互动设备,数字人读到的就不止一行文字:玩家说“别往心里去”时语气是轻松还是敷衍,是笑着说还是皱着眉说,都会影响闻朔的回应。玩家笑着安慰他,而他刚刚被玩家力荐的新秀替下,他很可能把这当成一种居高临下的宽慰,回答会更短,视线也会移开。
设备只是输入渠道。玩家完全可以只用文字或手柄选项完成同样的对话,是否开启摄像头和麦克风应由玩家自己决定。更要紧的是数字人拿到信号之后怎么理解:它必须把玩家的表情放回关系和上下文里去读,不能简单地把“检测到笑容”换算成“玩家很友善”。
他愿意把哪张脸给你看,取决于你们的关系
闻朔对玩家的态度无法用一个好感数值概括。绝杀之前,两人已经配合了一个半赛季,信任很深;可玩家在训练里力荐程锐这件事,被他作为关系记忆保存了下来。所以被换下的那个晚上,他对玩家的笑是客气的、带着距离的;对一起打了五年球的老队友梁述,他会在替补席上低声说句真话。NPC之间也有自己的关系网络:梁述可能把闻朔的状态告诉教练组,程锐可能在下一次训练里刻意多给闻朔传球,想把关系缓和下来。
关系也会朝另一个方向变化。如果玩家在接下来几场比赛里坚持给闻朔做掩护,在采访中公开说“我们的控卫是闻朔”,他的表情会一点点松动:训练时重新开起玩笑,击掌时多停一秒。这种变化是连续的,玩家能直接从脸上读出来。关于这类事件该保存多久、哪些会淡化,可以参考NPC长期记忆的分层思路。
把两次笑容拆开看:七个输入缺一不可
| 维度 | 绝杀之后 | 被换下之后 |
|---|---|---|
| Voice | 音量偏高,语速快,主动点名传球的人 | 停顿变长,尾音收住,多用短句 |
| Facial Expression | 眼周和嘴角同时牵动 | 嘴角上扬,眼周几乎不动 |
| Body Animation | 身体打开,冲向队友 | 步子加快,避开教练的击掌 |
| Memory | 记住这记传球和这场胜利 | 记住被替换,也记住替换者是谁推荐的 |
| Personality | 兴奋但不失控 | 压住情绪,保持体面 |
| Relationship | 对玩家的信任上升 | 对玩家出现保留 |
| Context | 主场、合同年、关键战 | 客场、镜头在场、合同年压力 |
这张表里少了任何一行,笑容都会走样。只有外观没有Memory,他第二天就会忘记被换下这件事;有Memory却没有Context,他可能在发布会上对记者说出只该在更衣室里说的话;有了前面几项却没有Relationship,他会对程锐和梁述露出同一种表情。
几个月后,那个笑容会换一种方式回来
到了季后赛,闻朔在一场关键战里再次投进制胜球,这一次替补席上站着的是程锐。他冲向的第一个人是谁,采访里会不会提起那次被换下,他看向玩家时眼神里有没有一点复杂,这些都应该从前面几个月积累的情绪、记忆和关系里长出来,不需要编剧临时补一段台词。
固定表情的数字人只能重复同一个动作。有人物档案、有情绪状态、会读取玩家信号、记得关系变化的数字人,才能让玩家在第二次看到他笑的时候,想起第一次。这也是乐鱼体育把数字人和体育NPC大模型放在一起设计的原因:脸负责被看见,背后的记忆和关系负责让这张脸值得多看几眼。