Movendo um objeto ao longo de uma curva enquanto o gira

11

Eu gostaria de mover um objeto ao longo de uma curva . Em pontos específicos da curva, desejo que o objeto mude de velocidade e gire-se ao longo de seu eixo.

Imagine um avião voando para um destino. Ele tem seu caminho que deve seguir, além de ajustar sua velocidade e orientação até o fim (cabeçalho, medula, margem).

Gostaria de pedir informações de inicialização sobre o seguinte:

  • Que tipo de curvas usar para interpolar suavemente um objeto
  • Quais fórmulas usar para uma interpolação confiável, onde eu poderia controlar a velocidade do movimento do objeto e a transição entre os nós das curvas seria perfeita
  • Quais informações devem ser exportadas de um aplicativo de criação 3D
  • Devo usar quaternions slerp () para isso?

Se você conhece um livro que aborda esse tópico de maneira eficiente , isso ajudaria muito. Obrigado.

Bunkai.Satori
fonte

Respostas:

7

Para a curva de movimento, sugiro o uso de curvas Hermite. Você simplesmente fornece um ponto inicial / velocidade e um ponto final / velocidade, e isso cria uma curva agradável e suave entre os dois. Use o ponto final / velocidade do primeiro par de pontos como o ponto inicial / velocidade do próximo par de pontos e você terá uma boa curva longa e sinuosa que é perfeita.

Isso lida perfeitamente com o requisito de gerenciar a velocidade: você fornece uma lista de pontos no tempo com as velocidades escolhidas e fornece os valores de posição e velocidade perfeitamente interpolados. Se você quiser continuar com isso, tudo o que você precisa extrair do aplicativo de criação 3D é pontos e velocidades no caminho que você deseja. Você também pode gerá-los em tempo de execução, talvez com base na entrada do usuário.

Para ajustar a orientação, você tem várias opções. Se o avião sempre apontar para onde está indo (o que faz sentido), você pode usar o vetor de velocidade interpolado da curva Hermite para descobrir para onde seu navio deve apontar. Se você conhece o vetor para cima (ele está se movendo em um plano ou você sabe qual direção deve estar para cima), pode calcular o terceiro eixo por cruz (frente, para cima) e aí está sua orientação.

Se você deseja uma orientação "vacilante" de alguma forma, para que o avião às vezes se desvie da direção frontal no caminho, você pode usar a direção frontal como a direção desejada e executar sucessivamente um passo entre a orientação atual e a orientação desejada.

Se você deseja orientações personalizadas que não têm nada a ver com o caminho, é claro que você pode fornecer uma lista de quaterniões de orientação para isso. Então seus pontos se tornam (ponto, velocidade, quaternion). Então você pode usar slerp entre dois quaternions sucessivos para definir suas orientações ao longo do caminho. Não esqueça que slerp é um método de interpolação linear . No entanto, geralmente deve estar bem. Se você achar que as rotações não são suaves o suficiente nas costuras, tente interpolar a lista de quaternions com uma curva de Bezier, conforme explicado aqui na seção 7.

Aqui está um código-fonte que pode ajudá-lo a começar. Possui várias técnicas de interpolação suaves para uma lista de quaternions (esquadrão, bezier, etc.).

Deixe-me saber se você tiver alguma dúvida!

Gazihan Alankus
fonte
+1 - Obrigado, sua resposta basicamente cobre tudo. Responde a todas as perguntas que fiz e você fornece mais material para estudar. Agora, tenho material suficiente para começar. Portanto, não vejo razão para não marcar isso como Resposta Aceita .
Bunkai.Satori 15/05
@ Bunkai.Satori obrigado, prazer em ajudar :) Eu adoraria ver o que você cria no final.
Gazihan Alankus 15/05