对于大多数参数轨迹,可以近似解决该问题。想法如下:如果在曲线上放大足够深,则无法从该点的切线知道曲线本身。
通过进行此假设,无需预先计算两个以上的向量(三次贝塞尔曲线等三个)。
因此,对于曲线中号(吨)我们计算其切线向量d中号dŤŤ∥ d中号dŤ∥Δ Ť∥ d中号dŤ∥ Δ 吨大号大号÷ ∥ d中号dŤ∥
应用:二次贝塞尔曲线
如果贝塞尔曲线的控制点是,和,则轨迹可以表示为:一种乙C
中号(吨)= (1 − t )2A + 2 吨(1 − t )B + t2C= 吨2( A − 2 B + C)+ t (− 2 A + 2 B )+ A
因此,导数为:
d中号dŤ= t (2 A - 4 B + 2 C)+ (− 2 A + 2 B )
您只需要将向量和某个位置。然后,对于给定的,如果要前进长度,则可以执行以下操作:v⃗ 1个= 2 A - 4 B + 2 Cv⃗ 2= − 2 A + 2 BŤ大号
t = t + L升È Ñ 克th(t⋅v⃗ 1+v⃗ 2)
三次贝塞尔曲线
相同的推理适用于具有四个控制点,,和的曲线:ABCD
M(t)=(1−t)3A+3t(1−t)2B+3t2(1−t)C+t3D=t3(−A+3B−3C+D)+t2(3A−6B+3C)+t(−3A+3B)+A
导数是:
d中号dŤ= 吨2(− 3 A + 9 B − 9 C+3D)+t(6A−12B+6C)+(−3A+3B)
我们预先计算了三个向量:
v⃗ 1v⃗ 2v⃗ 3=−3A+9B−9C+3D=6A−12B+6C=−3A+3B
最终公式为:
t=t+Llength(t2⋅v⃗ 1+t⋅v⃗ 2+v⃗ 3)
准确性问题
如果您以合理的帧速率运行,则(应根据帧持续时间进行计算)将足够小,以使其近似工作。L
但是,在极端情况下,您可能会遇到错误。如果太大,则可以分段计算,例如使用10个部分:L
for (int i = 0; i < 10; i++)
t = t + (L / 10) / length(t * v1 + v2);