Determine la longitud del arco de una spline Catmull-Rom para moverse a una velocidad constante

18

Tengo un camino que se define por una concatenación de splines Catmull-Rom. Utilizo el método estático Vector2.CatmullRom en XNA que permite la interpolación entre puntos con un valor que va de 0 a 1.

No todas las splines en este camino tienen la misma longitud. Esto causa diferencias de velocidad si dejo que el peso vaya a una velocidad constante para cada spline mientras avanzo por el camino. Puedo remediar esto dejando que la velocidad del peso dependa de la longitud de la ranura. ¿Cómo puedo determinar la longitud de tal spline? ¿Debería aproximarme cortando la spline en 10 líneas rectas y sumar sus longitudes?

Estoy usando esto para el mapeo dinámico de texturas en una malla generada definida por splines.

Wouter
fuente

Respuestas:

25

Parece que desea mantener la velocidad del objeto a un valor constante en toda la curva; saber la longitud del arco no lo ayudará a hacer esto. Le ayudará a calcular a qué hora el objeto alcanzaría su punto final si fuera a esa velocidad, por lo que será mejor que lo que tiene ahora (el objeto tendrá la misma velocidad promedio entre todos los puntos), pero el la velocidad real del objeto seguirá variando a medida que se mueve alrededor de la curva.

Una mejor solución sería cambiar nuestro parámetro paramétrico (el parámetro que va de 0 a 1, al que llamaré spara evitar confusiones t = time) a una velocidad variable ds/dt, que está determinada por la velocidad a la que desea que se mueva el objeto. ese punto en la curva. En otras palabras, en lugar de cambiar sen 0.01 cada cuadro, podríamos cambiarlo en 0.005 un cuadro, 0.02 el siguiente, etc.

Hacemos esto calculando las derivadas de x( dx/ds) y y( dy/ds) cada cuadro, luego configurando

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

Es decir, al tomar la velocidad que queremos alcanzar y dividirla por la velocidad a la que realmente iríamos si estuviéramos cambiando sa un incremento fijo.


Prueba

Queremos que la velocidad de nuestro objeto sea constante; vamos a darle el nombre a esa constante speed.

Aprendemos en el cálculo de segundo año que, para ecuaciones paramétricas x(s)y y(s),

velocidad = sqrt ((dx / dt) 2 + (dy / dt) 2 )

También aprendemos que

dx / dt = dx / ds * ds / dt     (regla de la cadena)

Así,

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

Resolviendo para ds/dt, obtenemos la ecuación indicada.


Calculando las derivadas

Nunca he trabajado con esas splines particulares, pero entiendo que solo dan x(s)y y(s)en términos de ecuaciones cúbicas de s. Por lo tanto, podemos encontrar la derivada dx/dsfácilmente: si

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

luego

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

(Lo mismo para dy/ds) Por supuesto, necesitará conocer los valores exactos de a, by cpara hacer esto. Según esta página , esos valores son fáciles de encontrar.


Finalmente, para responder la pregunta en el título: encontrar la ecuación de longitud de arco de una función paramétrica implica resolver una integral definida bastante complicada ; incluso para el caso simple de una ecuación cúbica, esto generalmente no se puede hacer.

Por lo tanto, tendrá que estimar la integral numéricamente . "Cortar la spline en 10 líneas rectas y sumar sus longitudes", como sugiere, es una forma muy sencilla de hacerlo ; sin embargo, hay métodos un poco más complicados que le darán resultados mucho más precisos utilizando menos segmentos de línea.

BlueRaja - Danny Pflughoeft
fuente