Es ist möglich, eine Lösung für dieses Problem für die meisten parametrischen Trajektorien zu finden. Die Idee ist die folgende: Wenn Sie eine Kurve stark genug zoomen, können Sie die Kurve selbst nicht an der Tangente an diesem Punkt erkennen.
Wenn Sie diese Annahme treffen, müssen Sie nicht mehr als zwei Vektoren vorberechnen (drei für kubische Bézier-Kurven, usw. ).
Also berechnen wir für eine Kurve ihren Tangentenvektor am Punkt . Die Norm dieses Vektors ist und daher kann die für eine Dauer als . Daraus folgt, dass eine Strecke für eine DauerM(t)dMdtt∥dMdT∥Δt∥ dMdT∥ Δ tLL÷∥dMdT∥ .
Anwendung: quadratische Bezierkurve
Wenn die Kontrollpunkte der Bezier-Kurve , undABC , kann die Flugbahn folgendermaßen ausgedrückt werden:
M(t)=(1−t)2A+2t(1−t)B+t2C=t2(A−2B+C)+t(−2A+2B)+A
Die Ableitung lautet also:
dMdt=t(2A−4B+2C)+(−2A+2B)
Sie müssen nur die Vektoren und irgendwo . Dann, für ein gegebenes , wenn Sie eine Länge vorrücken möchten , tun Sie:v⃗ 1= 2 A - 4 B + 2 Cv⃗ 2= - 2 A + 2 BtL
t = t + Ll e n gt h ( t ⋅ v⃗ 1+ v⃗ 2)
Kubische Bezierkurven
Die gleiche Überlegung gilt für eine Kurve mit vier Kontrollpunkten , , und :EINBCD
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
Die Ableitung ist:
dMdt=t2(−3A+9B−9C+3D)+t(6A−12B+6C)+(−3A+3B)
Wir berechnen die drei Vektoren vor:
v⃗ 1v⃗ 2v⃗ 3=−3A+9B−9C+3D=6A−12B+6C=−3A+3B
und die endgültige Formel lautet:
t=t+Llengt h ( t2⋅ v⃗ 1+ t ⋅ v⃗ 2+ v⃗ 3)
Genauigkeitsprobleme
Wenn Sie mit einer vernünftigen Framerate laufen,L (das entsprechend der Bilddauer berechnet werden sollte) ausreichend klein, damit die Approximation funktioniert.
In extremen Fällen können jedoch Ungenauigkeiten auftreten. Wenn zu groß ist, können Sie die Berechnung stückweise ausführen, beispielsweise mit 10 Teilen:L
for (int i = 0; i < 10; i++)
t = t + (L / 10) / length(t * v1 + v2);