È possibile approssimare una soluzione a questo problema per la maggior parte delle traiettorie parametriche. L'idea è la seguente: se ingrandisci abbastanza in profondità su una curva, non puoi distinguere la curva stessa dalla sua tangente in quel punto.
Facendo questo presupposto, non è necessario pre-calcolare nulla di più di due vettori (tre per curve cubiche di Bezier, ecc .).
Quindi per una curva M( t ) calcoliamo il suo vettore tangente dMdtt∥ dMdT∥Δ t∥ dMdT∥ Δ tLL ÷ ∥ dMdT∥
Applicazione: curva quadratica di Bezier
Se i punti di controllo della curva di Bezier sono , e , la traiettoria può essere espressa come:UNBC
M( t )= ( 1 - t )2A + 2 t ( 1 - t ) B + t2C= t2( A - 2 B + C) + t ( - 2 A + 2 B ) + A
Quindi il derivato è:
dMdt= t ( 2 A - 4 B + 2 C) + ( - 2 A + 2 B )
Devi solo memorizzare vettori e da qualche parte. Quindi, per una data , se vuoi avanzare di una lunghezza , fai: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)
Curve cubiche di Bezier
Lo stesso ragionamento si applica a una curva con quattro punti di controllo , , e :UNBCD
M( t )= ( 1 - t )3A + 3 t ( 1 - t )2B + 3 t2( 1 - t ) C+ t3D= t3( - A + 3 B - 3 C+ D ) + t2( 3 A - 6 B + 3 C) + t ( - 3 A + 3 B ) + A
Il derivato è:
dMdt= t2( - 3 A + 9 B - 9 C+ 3 D ) + t ( 6 A - 12 B + 6 C) + ( - 3 A + 3 B )
Precalcoliamo i tre vettori:
v⃗ 1v⃗ 2v⃗ 3= - 3 A + 9 B - 9 C+ 3 D= 6 A - 12 B + 6 C= - 3 A + 3 B
e la formula finale è:
t = t + Ll e n gt h ( t2⋅ v⃗ 1+ t ⋅ v⃗ 2+ v⃗ 3)
Problemi di precisione
Se si esegue a un frame rate ragionevole, (che dovrebbe essere calcolato in base alla durata del frame) sarà sufficientemente piccolo per consentire l'approssimazione.L
Tuttavia, potresti riscontrare inesattezze in casi estremi. Se è troppo grande, è possibile eseguire il calcolo a tratti, ad esempio utilizzando 10 parti:L
for (int i = 0; i < 10; i++)
t = t + (L / 10) / length(t * v1 + v2);