Posso usar quaternions para controlar um helicóptero?

9

Estou tentando fazer uma simulação simplificada de helicóptero (no momento, é um cubo) em 3D e estou tendo alguns problemas com a rotação. Um helicóptero pode girar ao longo dos três eixos:

  • gire sobre si mesmo usando a hélice traseira: rotação do eixo y
  • incline para a esquerda e direita para ir para a esquerda ou direita: rotação do eixo z
  • incline para cima e para baixo para recuar ou avançar: rotação do eixo x

Eu preciso ser capaz de controlar cada eixo individualmente. Até agora, tentei usar ângulos de Euler, mas, independentemente da ordem de rotação que uso, encontro uma trava de cardan ou alguns eixos "trocam de lugar".

Parece que preciso usar quaternions, mas não sei como controlar cada eixo individual, pois os quaternions usam uma direção e um ângulo. Devo criar três quaternions e multiplicá-los juntos? Eu não acabaria com os mesmos problemas?

O mais estranho é que, se eu usar meu dedo para representar os três eixos do meu helicóptero (polegar para cima = y, índice = z, meio = x), não pareço encontrar esses problemas. Por quê?

subb
fonte
Se você tiver acesso a um gráfico de cena, uma alternativa viável seria ter contêineres aninhados para cada eixo que você gira individualmente.
22611 bummzack
@ albummzack, sim, eu pensei sobre isso. No entanto, não é o mesmo que concatenar três matrizes de rotação em uma ordem específica?
Subb
Você está certo, @Subb, tente não armazenar rotações para cada eixo separadamente, pois terá os mesmos problemas que os ângulos de Euler, não importa o que você use para isso, também Matrizes e Quaterniões sofrerão com o Gimbal Lock.
Maik Semder
@Maik Semder, então como posso fornecer controle da inclinação / guinada / rotação do meu helicóptero?
Subb
@ Flip @ Flip e minha resposta basicamente lhe disse como fazê-lo.
Maik Semder

Respostas:

4

Você deve poder usar uma matriz ou um quaternion para armazenar a orientação atual do seu helicóptero. O problema com o qual você está se deparando é como aplicar mudanças no pitch / yaw / roll no helicóptero.

Eu acho que você deseja aplicar pitch / yaw / roll ao helicóptero no espaço local em cada quadro. Você pode fazer isso alterando o pitch / yaw / roll para esse quadro e construindo uma matriz de rotação (você pode fazer isso com ângulos de Euler). Em seguida, você gira a orientação anterior do helicóptero por esta matriz (com a orientação anterior representada como uma matriz ou como um quaternion). Ele fornecerá a orientação para o novo quadro.

Representar a orientação do helicóptero como um quaternion tem a vantagem de que a interpolação entre quaternions é muito mais fácil do que a interpolação entre matrizes. Portanto, se no futuro você tiver uma orientação atual e desejar descobrir a rotação por quadro que o levará a uma nova orientação no momento desejado, a representação do quaternion poderá ser mais amigável para você.

Giro
fonte
Foi assim que eu fiz, aplique atualizações incrementais à matriz que representa a transformação local -> mundial. Lembre-se de normalizar a matriz; depois de algumas centenas de quadros, ele mostrará artefatos de arredondamento, se não o fizer.
Patrick Hughes
Além disso, para responder à pergunta final de por que o problema do bloqueio do cardan não é visto usando a mão para representar os eixos x / y / z, é porque você provavelmente está aplicando os valores de pitch, yaw e roll no quadro local da mão. referência. A construção de uma matriz de rotação com ângulos de euler começa girando em torno do x do mundo, depois pelo y resultante e depois pelo z resultante (a ordem real de x / y / z pode diferir na ordem). Tente aplicar as rotações dessa maneira e você poderá começar a ver como a trava do cardan aparece.
22411 Flip
3

Basicamente, você pode usar todas as outras representações de rotações, exceto os ângulos de Euler. Matrizes, Quaternions e até Axis Angles farão o que você quiser.

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

Você está certo, você acabaria com os mesmos problemas. A chave é armazenar a orientação atual (matriz, quaternion) do seu objeto e aplicar apenas um delta ao alterar a orientação.

Quando você quiser girar 10 graus em torno de y, basta criar uma matriz delta / quaternion para isso e depois multiplique-a com sua orientação atual (se você usar a pós-multiplicação para matrizes). Se você multiplicá-lo ao contrário, ele girará o sistema em torno do eixo y do mundo, em vez de no eixo y do objeto.

Acho esse recurso muito útil, ele também vem com o código-fonte e explica muito bem a teoria.

Maik Semder
fonte
-1

O problema que eu acho que você pode estar vendo é uma diferença nos vetores de rotação e velocidade do eixo (e também que você está perdendo uma direção). Quando um helicóptero se inclina para frente para avançar, a propulsão das pás do helicóptero empurra o ar para baixo e para trás em um ângulo perpendicular ao que você rotulou como eixo X.

Você tem um quarto grau de liberdade que perdeu: a velocidade das pás controla o volume de ar que é empurrado, que também controla a quantidade de sustentação que o helicóptero gera.

Mas, mesmo assim, sua "inclinação para a esquerda e para a direita" e "para cima e para baixo" geralmente controlam o helicóptero em um determinado avião. Ou seja, um helicóptero não deve voar para baixo quando se inclina para frente, para trás ou para o lado - mas a quantidade de levantamento pode ter que mudar e a velocidade será controlada pelo lado "oposto" do triângulo retângulo formado por conectar o helicóptero ao chão com uma linha reta para baixo (gravidade) e a hipotenusa (elevação). Isso deve fornecer o seu vetor de velocidade.

Você deve usar quaterniões para fazer isso, mas não baseie seus valores na inclinação do helicóptero - tente usar as forças de movimento que o helicóptero gera.

Roubar
fonte
Isso realmente não está respondendo à pergunta. Apenas adicionando mais comida para o pensamento.
22711 bummzack
Atualmente, estou usando a rotação do helicóptero para transformar o vetor de força de elevação, apontado para cima no espaço do helicóptero. Você quer dizer que eu deveria fazer o inverso, ou seja, modificar o vetor diretamente e depois girar o helicóptero em conseqüência?
Subb
Eu acho que você deve fazer as duas coisas, o que está fazendo agora, e depois fazer quaisquer alterações RESULTANTES na rotação do helicóptero com base no normal das pás. Ou seja, você tem 2 rotações; um aplicado às pás e um segundo representando a rotação real do helicóptero. Obviamente, todos armazenados em Quaternions.
Deceleratedcaviar