手指按在琴键上,手掌却在往右移——这一帧,指尖到底听谁的?
上一期讲完了位置和时间,还剩第三块拼图:谁说了算。这里的"权威"跟权力没关系,它只问一件事:这一帧的位置,以谁算出来的为准。
最早做的是吉他动画。品格是固定的,手指和手掌各算各的、彼此平级,看不出问题——弹吉他时手腕只转十来度,两种算法给出的轨迹差 0.4%。换到钢琴,手要跨很远,极端时从左转到右将近九十度;还是只连起终点,指尖就走成一条直线,跟真实轨迹差了 29.3%。
于是让手掌当父级,手指只记"相对手掌在哪"。代价马上来了:得先算手掌在哪、朝哪;要换算回世界坐标,才能判断手指够不够得着琴键;算完还得写回去。这三步的顺序不能换。
但挂成父子还不够。手指按在键上的时候不能跟着手掌跑:实测 75 帧里,指尖会被拖走将近一整个白键宽。所以分成两种权威——落点由琴键决定的那几段(预备、触键、按住)听琴键,其余时间听手掌。
后面是这两条规则各自的用处:一个负责把手钉在键上,一个负责检查路上会不会扎进琴键。检查点每 0.2 秒补一个,因为实测里手掌有四十多秒完全没有关键帧;修正也必须成段抬,一帧一帧各自改,画面就像手指不停被针扎。
最后讲这套东西为什么会长出来:吉他、钢琴、保留指,三件事凑齐才逼出它。
章节
0:00 序 · 还差一块:听谁的
1:04 第一章 · 一开始,手指和手掌是平级的
2:16 第二章 · 两条轨迹
4:11 第三章 · 挂下去的代价
5:01 第四章 · 什么时候该听琴键的
6:37 第五章 · 两条规则各自的用处
8:46 第六章 · 为什么会长出这套东西
9:51 尾声 · 三句话,和下一期
"钢琴演奏动画算法"系列第 3 期,共 4 期。片子里每个数字都来自真实角色和真实演奏数据——没有动捕,没有训练,也没有大模型。
画面用 three.js 与 Canvas 2D,解算在 Node 里跑,逐帧在无头浏览器里渲染。
MusicDoll · musicdoll.online