朝向住在「圆」上,位置住在「平的空间」里。
圆上「插值」必须走最短的那一段弧;平的空间里「插值」就是连一条线段。 把这两个搞反,两个都会错。
一辆车在路口掉头。它车头的朝向角 yaw 一路往一个方向涨。
但数据里,yaw 一般只存 −180° ~ +180°。所以:
185° 和 −175° 是【同一个朝向】。只是同一个朝向有两套写法,数据里选了后一套。
于是那些数看起来「从 175° 掉到了 −175°」,但车其实一直在往同一个方向转。
现在让插值登场:如果你直接把两帧的数做线性插值(取平均), 你就会拿到 175° 和 −175° 的中间值,也就是 0°。
而车的真实朝向在那一刻是 180°。差 180°,车头正好指向反方向。
左边俯视图(车在掉头),右边是 yaw 随时间的曲线。
白 = 真值,红 = 线性插值,绿 = 短弧插值。
① 红线的"跳崖"只发生在一段里,就是跨过 ±180° 接缝的那一段。 关键帧加密到 8 段,也别指望它消失:只会让那一段变短。
② 绿线和白线完全重合,短弧插值的误差是 0.00°。因为它走的是"最短的那一段"。
③ 关键帧上三个车永远重合,那三个点本来是给你的。 插值的好坏只能在【两帧之间】看出来,这是检验插值的唯一方式。
刚才短弧插值(SLERP)救了 yaw。那它能不能拿去插位置?
不能。因为:
| 这个量 | 住在什么空间 | 该怎么插 |
|---|---|---|
| 朝向 yaw、速度方向、视线方向 | 弯的(圆 / 球面) | 沿最短弧(SLERP) |
| 位置、尺寸、速度大小、温度 | 平的 | 连线段(线性) |
下面把 SLERP 硬套到位置上,看它会把一条直线掰成什么。
为什么红的往外鼓?
绿色是两点之间连一条线段,这正是"位置"该有的插法。
红色是先把两点当成"方向"(压到同一个球面上),再沿球面走 于是整条路径被推到球面上去。
而球面比弦更远离原点,所以弧总是往外鼓。
夹角 = 0(两点同方向)时两者重合,那才是唯一"碰巧对"的情形。
SLERP 只接受"方向"(单位向量)。要把位置喂给它,你得先把位置当成"距原点的方向和距离"。
于是插值出来的路径,是一条以原点为中心的弧,而不是两点之间的直线。
偏差有多大:取决于这两个点到原点的夹角。夹角越大,弧越夸张。 ,这不是"精度差一点",是【形状错了】。
对,而且必须用。比如速度的方向:车在转弯,速度方向在改变, 而"方向"本身就住在球面上,这时线性插值会让方向不匀速地偏,SLERP 才对。
判据一句话:这个量加一倍还有意义吗?
朝向加一倍没意义(360° 就回到原点)→ 弯空间 → SLERP
位置加一倍有意义(走远了)→ 平空间 → 线性
| 问题 | 答案 |
|---|---|
| 掉头时数据里发生了什么 | yaw 一路涨,涨过 180° 后"翻号"成负数。这不是车掉头,是数字换了写法。 |
| 抽帧抽的是什么 | 只存那几个已经翻过号的数。于是两帧之间,数字上看起来"掉了 350°"。 |
| 线性插值为什么错 | 它在数轴上取中点,而数轴是直的,朝向住在圆上。 结果:车头指向反方向,误差 180°(这是最大可能的误差)。 |
| 短弧插值为什么对 | 它先算"往哪边转更近",再沿那段弧走。误差 0.00°。 |
| SLERP 能不能用在位置上 | 不能。位置住在平空间,SLERP 会把它当方向,凭空走出一条弧。 |
① 朝向住在圆上,所以它有"接缝",而接缝的位置是坐标系决定的,不是物理的。
② 圆上的插值必须走最短弧,直接对数字取平均,会在接缝处凭空转 180°。
③同一个工具,一个场景里对、一个场景里错,判据是"这个量加一倍还有意义吗"。