Determina la lunghezza dell'arco di una spline Catmull-Rom per muoversi a velocità costante


18

Ho un percorso che è definito da una concatenazione di spline Catmull-Rom. Uso il metodo statico Vector2.CatmullRom in XNA che consente l'interpolazione tra punti con un valore compreso tra 0 e 1.

Non tutte le spline in questo percorso hanno la stessa lunghezza. Ciò causa differenze di velocità se lascio andare il peso a una velocità costante per ogni spline mentre procedo lungo il percorso. Posso rimediare lasciando che la velocità del peso dipenda dalla lunghezza della spline. Come posso determinare la lunghezza di una tale spline? Devo solo approssimare tagliando la spline in 10 rette e sommarne le lunghezze?

Sto usando questo per la mappatura dinamica delle trame su una mesh generata definita da spline.

Risposte:


25

Sembra che tu voglia mantenere la velocità dell'oggetto ad un valore costante sull'intera curva - sapendo che la lunghezza dell'arco non ti aiuterà a farlo. Ti aiuterà a calcolare a che ora l'oggetto raggiungerebbe il suo punto finale se stesse andando a quella velocità, quindi sarà migliore di quello che hai ora (l'oggetto avrà la stessa velocità media tra tutti i punti), ma il la velocità effettiva dell'oggetto varierà comunque mentre si muove attorno alla curva.

Una soluzione migliore sarebbe quella di cambiare il nostro parametro parametrico (il parametro che va da 0 a 1, che chiamerò sper evitare confusione t = time) a una velocità variabile ds/dt, che è determinato dalla velocità con cui si desidera che l'oggetto si sposti quel punto sulla curva. Quindi, in altre parole, invece di cambiare sdi 0,01 ogni fotogramma, potremmo cambiarlo di 0,005 un fotogramma, 0,02 il successivo, ecc.

Facciamo questo calcolando le derivate di x( dx/ds) e y( dy/ds) ogni fotogramma, quindi impostando

ds / dt = speed / sqrt ((dx / ds) 2 + (dy / ds) 2 )

Cioè, prendendo la velocità che vogliamo andare e dividendola per la velocità che effettivamente andremmo se cambiassimo sad un incremento fisso.


Prova

Vogliamo che la velocità del nostro oggetto sia costante; diamo a quella costante il nome speed.

Nel calcolo del secondo anno apprendiamo che, per le equazioni parametriche x(s)e y(s),

velocità = sqrt ((dx / dt) 2 + (dy / dt) 2 )

Lo impariamo anche

dx / dt = dx / ds * ds / dt     (regola catena)

Così,

velocità = sqrt ((dx / ds) 2 (ds / dt) 2 + (dy / ds) 2 (ds / dt) 2 )

Risolvendo ds/dt, otteniamo l'equazione dichiarata.


Calcolo dei derivati

Non ho mai lavorato con quelle spline particolari, ma capisco che danno x(s)e y(s)in termini di equazioni cubiche di s. Quindi, possiamo trovare dx/dsfacilmente la derivata : if

x (s) = a * s 3 + b * s 2 + c * s + e

poi

dx / ds = 3a * s 2 + 2b * s + c

(Lo stesso vale per dy/ds) Naturalmente, è necessario conoscere i valori esatti di a, be cper fare questo. Secondo questa pagina , questi valori sono facili da trovare.


Infine, per rispondere alla domanda nel titolo: trovare l'equazione della lunghezza dell'arco di una funzione parametrica implica risolvere un integrale definito abbastanza complicato ; anche per il semplice caso di un'equazione cubica, ciò non è generalmente possibile.

Pertanto, dovrai stimare l'integrale numericamente . "Tagliare la spline in 10 rette e sommarne le lunghezze" come suggerisci è un modo molto semplice per farlo ; tuttavia, ci sono metodi leggermente più complicati che ti daranno risultati molto più accurati usando meno segmenti di linea.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.