glTF三次样条曲线中内外切线的视觉含义及贝塞尔控制点构建方法
glTF中的关键帧动画支持“三次样条”插值,其规范描述如下(已添加重点标记):
定义:
n为关键帧总数,n>0;
tk为第k个关键帧的时间戳,k ∈ [1,n];
vk为第k个关键帧的动画属性值;
tc为当前(请求的)时间戳,满足tk<tc<tk+1;
*td = tk+1 − tk*为插值段的时长
*t = (tc − tk) / td*为归一化后的插值因子。动画采样器中存储的每个时间戳都对应三个关键帧值:
内切线、属性值和外切线。设ak、vk、bk分别为第k帧的内切线、属性值和外切线。
时间戳*tc处的插值采样值vt*计算方式如下:
vt = (2t3 − 3t2 + 1) × vk + td(t3−2t2+t) × bk + (−2t3+3t2) × vk+1 + td(t3−t2) × ak+1
传统二维三次贝塞尔曲线中,每个顶点和切线都有二维坐标。
但glTF规范将内、外切线与它们之间的顶点关联到同一时间戳。在传统曲线中,这会对应图中的垂直段,显然不合理——因为关键帧图是时间-值关系,垂直线段意味着同一时间对应多个值,存在歧义。

我的问题是:这些切线值在传统三次贝塞尔样条中代表什么?或者更明确地说:
给定每个关键帧的切线值,如何构建贝塞尔曲线的控制点,以准确呈现上述公式生成的时间-值曲线?
更新:我制作了Desmos图表来执行上述计算并测试曲线。我发现切线值似乎不代表实际目标值,而是作为关键帧值的偏移量:
- 曲线从*vk出发,向vk + bk*方向延伸
- 曲线终止于vk+1,途中向*vk+1 - ak+1*方向延伸
通过实验绘制匹配Desmos曲线的贝塞尔曲线,发现控制点的时间值应始终为t=1/3和t=2/3(与相关问题的回答猜测一致)。
我仍在寻找包含td的公式,但已有进展:当td = 3时,控制点似乎恰好位于*(0.333, vk + bk)和(0.666, vk+1 - ak+1)*,但这可能只是实验中的巧合。
内容的提问来源于stack exchange,提问作者Phrogz

