Euler ângulos vs Quaternions - problemas causados ??pela tensão entre armazenamento interno e apresentação para o utilizador?

StackOverflow https://stackoverflow.com/questions/832805

Pergunta

Quaternions são, indiscutivelmente, uma escolha apropriada para representar rotações objeto internamente. Eles são simples e eficiente para interpolar e representam uma única orientação inequívoca.

No entanto, apresentando quaternions na interface do usuário é geralmente inadequada - ângulos de Euler são geralmente muito mais familiar para os usuários, e seus valores são um pouco mais intuitivo e previsível

. ângulos

Euler sofrem de ser complicado ao nível do código - eles exigem que uma ordem de rotação é armazenado, e compor uma orientação prática (seja ele matriz ou quaternion) usando essa ordem e ângulos associados é complicado, para dizer o mínimo.

interpolações confiáveis ??são mais convenientemente realizada utilizando representação quaternion - Então, isso significa que devemos converter constantemente entre uma representação Euler e uma representação quaternion? É este viável em termos de desempenho?

Podemos armazenar as orientações como quaternions e convertê-los apenas para exibida para o usuário? Isto pode não ser possível, porque para qualquer orientação dada há exatamente representação um quaternion mas muitas representações Euler. Como podemos 'pegar' a representação Euler que corresponde ao que originalmente definido que a orientação? Parece uma tarefa impossível -. Nós efetivamente perdeu informações ao converter para um quaternion

Podemos armazenar como ângulos de Euler e depois converter para quaternions conforme necessário? Isso provavelmente não é escalável -. Conversão de um ângulo Euler a um quaternion, interpolação, e depois a conversão de volta é provável que seja de código relativamente caro

Poderíamos simplesmente armazenar as duas representações e usar o mais adequado para uma determinada situação? Um grande custo em termos de memória (imagine curvas de animação para um esqueleto com cerca de sessenta ossos) e manter esses valores sincronizados pode ser caro, ou pelo menos complexo.

Alguém viu, usado ou que qualquer solução inteligente para este problema? Certamente as três opções acima não estão fora únicos? Existem outros domínios de problemas semelhantes a este que Have foi resolvido?

Foi útil?

Solução

Eu sou um engenheiro aeroespacial; Tenho vindo a utilizar quaternions para controle de atitude nave espacial e navegação para ir em três décadas. Aqui estão alguns pensamentos sobre sua situação:

  1. A realização de qualquer tipo de processo que muda de orientação com ângulos de Euler está beirando o impossível. ângulos de Euler sofrem de singularidades - ângulos irá instantaneamente mudar em até 180 graus como outros ângulos atravessam a singularidade; ângulos de Euler são virtualmente impossíveis de usar para rotações sequenciais. Quaternions não sofrem de qualquer um desses problemas
  2. Há 12 possíveis sequências de rotação ângulo diferentes Euler - XYZ, xyx, xzy, etc. Não há uma "simples" ou conjunto de "direito" de ângulos de Euler. Para obter um conjunto de ângulos de Euler, você deve saber qual sequência de rotação que você está usando e cumpri-lo.
  3. Eu sugiro que você realizar todas as operações de armazenamento e rotação com quaternions e apenas converter um quaternion para ângulos de Euler quando a saída é necessária. Quando você fizer isso, você deve definir quais sequência de rotação Euler você está usando.

I têm algoritmos para todas estas operações e muito mais: quatérnions para / a partir de ângulos de Euler de qualquer sequência de rotação para / a partir de matrizes de rotação (direcção matrizes de co-seno), posição correspondente Quatérnion interpolação, taxa, etc, a extremidade ou intermediários pontos, dinâmica e cinemática usando quaternions rígidos e flexíveis do corpo.

Por favor contacte-me se eu posso ser de ajuda na nhughes1ster@gmail.com

Outras dicas

Eu sou um fã de quaternions. A fim de fazê-los funcionar, você poderia reconsiderar a sua apresentação para o usuário? Em vez de apresentar a rotação para o usuário como uma série de ângulos de Euler em forma de texto, você pode em vez disso escolher alguns simples objeto 3D e aplicar a rotação quaternion para o objeto para exibir visualmente a rotação em vigor.

Por que não usar Quarternions no código e converter o Q de ângulos quando necessário para exibição?

Você pode representar a rotação como eixo ângulo + rotação, que é essencialmente o mesmo que quaternion (até um sinal)

Eu não acho que isso faz sentido usar ângulos de Euler internamente - você vai querer usar quaternions para todos os seus cálculos e, geralmente, não será capaz de pagar as conversões acontecendo em todos os lugares. Quanto ao convertê-lo de volta para ângulos de Euler para a UI - seria tão ruim se o usuário só recebe um ângulo que é equivalente à entrada original, mas é representado de forma diferente? Se você fizer o direito de conversão, você deve acabar com o "mais simples" ângulos de Euler para qualquer quaternion.

Quantas conversões estamos falando. Parece que você está pagando por cerca de duas operações transcendentais por conversão, que em hardware moderno está disponível na ordem de 100millions por segundo. Eu armazenar tanto, Quaternions de precisão e estética e rotações Euler para preservar informações do usuário. Talvez adicionar um sinalizador para indicar qual é o preferido para um determinado objeto. Em cima disso, você só tem que executar o conversão , uma vez por membro rodado. Assim que tiver calculado uma matriz de transformação, o seu multiplicam-acrescenta até que você correr para fora de vértices.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top