Determinar o comprimento do arco de um spline Catmull-Rom para se mover a uma velocidade constante

18

Eu tenho um caminho que é definido por uma concatenação de splines Catmull-Rom. Eu uso o método estático Vector2.CatmullRom no XNA que permite a interpolação entre pontos com um valor que vai de 0 a 1.

Nem todo spline nesse caminho tem o mesmo comprimento. Isso causa diferenças de velocidade se eu deixar o peso ir a uma velocidade constante para cada spline enquanto prossigo pelo caminho. Eu posso remediar isso deixando a velocidade do peso depender do comprimento do spline. Como posso determinar o tamanho de um spline? Devo apenas aproximar cortando o spline em 10 linhas retas e somando seus comprimentos?

Estou usando isso para mapeamento dinâmico de textura em uma malha gerada definida por splines.

Wouter
fonte

Respostas:

25

Parece que você deseja manter a velocidade do objeto em um valor constante durante toda a curva - sabendo que o comprimento do arco não ajudará você a fazer isso. Isso ajudará você a calcular a que horas o objeto alcançaria seu ponto final se estivesse indo nessa velocidade, portanto será melhor do que o que você tem agora (o objeto terá a mesma velocidade média entre todos os pontos), mas o a velocidade real do objeto ainda varia à medida que se move pela curva.

Uma solução melhor seria alterar nosso parâmetro paramétrico (o parâmetro que vai de 0 a 1, que chamarei spara evitar confusão t = time) a uma taxa variável ds/dt, que é determinada pela velocidade em que você deseja que o objeto se mova. esse ponto na curva. Portanto, em outras palavras, em vez de alterar sem 0,01 cada quadro, podemos alterá-lo em 0,005 um quadro, 0,02 no próximo etc.

Fazemos isso calculando as derivadas de x( dx/ds) e y( dy/ds) cada quadro e definindo

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

Ou seja, tomando a velocidade que queremos seguir e dividindo pela velocidade que realmente estaríamos se estivéssemos mudando sem um incremento fixo.


Prova

Queremos que a velocidade do nosso objeto seja constante; vamos dar a essa constante o nome speed.

Aprendemos no cálculo do segundo ano que, para equações paramétricas x(s)e y(s),

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

Também aprendemos que

dx / dt = dx / ds * ds / dt     (regra da cadeia)

Portanto,

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

Resolvendo ds/dt, obtemos a equação declarada.


Cálculo dos derivativos

Eu nunca trabalhei com esses splines específicos, mas entendo que eles apenas fornecem x(s)e y(s)em termos de equações cúbicas de s. Assim, podemos encontrar dx/dsfacilmente a derivada : se

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

então

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

(Mesmo para dy/ds) Claro, você vai precisar saber os valores exatos de a, be cpara fazer isso. De acordo com esta página , esses valores são fáceis de encontrar.


Finalmente, para responder à pergunta no título: encontrar a equação de comprimento de arco de uma função paramétrica envolve resolver uma integral definida bastante complicada ; mesmo no caso simples de uma equação cúbica, isso geralmente não pode ser feito.

Assim, você terá que estimar a integral numericamente . "Cortar o spline em 10 linhas retas e somar seus comprimentos", como você sugere, é uma maneira muito simples de fazer isso ; no entanto, existem métodos um pouco mais complicados que fornecerão resultados muito mais precisos usando menos segmentos de linha.

BlueRaja - Danny Pflughoeft
fonte