Eu sou um físico e tenho aprendido um pouco de programação, e encontrei muitas pessoas usando quatérnios para rotações em vez de escrever coisas na forma de matriz / vetor.
Na física, há boas razões para não usarmos quatérnios (apesar da história bizarra que ocasionalmente é contada sobre Hamilton / Gibbs / etc). A física exige que nossas descrições tenham um bom comportamento analítico (isso tem um significado precisamente definido, mas em alguns aspectos bastante técnicos que vão muito além do que é ensinado nas aulas normais de introdução, então não vou entrar em detalhes). Acontece que os quatérnios não têm esse comportamento agradável e, portanto, não são úteis, e os vetores / matrizes têm, então os usamos.
No entanto, restrito a rotações e descrições rígidas que não usam nenhuma estrutura analítica, as rotações 3D podem ser descritas de forma equivalente de qualquer maneira (ou de algumas outras maneiras).
Geralmente, queremos apenas um mapeamento de um ponto X = (x, y, z) para um novo ponto X '= (x', y ', z') sujeito à restrição de que X 2 = X ' 2 . E há muitas coisas que fazem isso.
A maneira ingênua é apenas desenhar os triângulos que isso define e usar trigonometria, ou usar o isomorfismo entre um ponto (x, y, z) e um vetor (x, y, z) e a função f (X) = X 'e uma matriz MX = X ', ou usando quatérnions, ou projetando componentes do vetor antigo ao longo do novo usando algum outro método (x, y, z) T. (a, b, c) (x', y ', z '), etc.
Do ponto de vista matemático, essas descrições são todas equivalentes neste cenário (como um teorema). Todos eles têm o mesmo número de graus de liberdade, o mesmo número de restrições, etc.
Então, por que os quatérnios parecem preferir os vetores?
As razões usuais que vejo não são travamento do cardan ou problemas numéricos.
O argumento sem travamento do cardan parece estranho, já que esse é apenas um problema de ângulos de euler. Também é apenas um problema de coordenadas (assim como a singularidade em r = 0 nas coordenadas polares (o Jacobiano perde a classificação)), o que significa que é apenas um problema local, e pode ser resolvido trocando as coordenadas, girando para fora da degeneração, ou usando dois sistemas de coordenadas sobrepostos.
Tenho menos certeza sobre questões numéricas, já que não sei em detalhes como esses dois (e quaisquer alternativas) seriam implementados. Eu li que normalizar novamente um quatérnio é mais fácil do que fazer isso para uma matriz de rotação, mas isso só é verdadeiro para uma matriz geral; uma rotação tem restrições adicionais que trivializam isso (que são construídas na definição de quatérnios) (na verdade, isso tem que ser verdade, pois eles têm o mesmo número de graus de liberdade).
Então, qual é a razão para o uso de quatérnions sobre vetores ou outras alternativas?
Respostas:
O bloqueio do cardan é um dos motivos, embora, como você disse, seja apenas um problema com ângulos de Euler e seja facilmente resolvido. Os ângulos de Euler ainda são usados quando a memória é uma preocupação, pois você só precisa armazenar 3 números.
Para quatérnions versus uma matriz de rotação 3x3, o quatérnion tem a vantagem em tamanho (4 escalares vs. 9) e velocidade (a multiplicação do quatérnio é muito mais rápida do que a multiplicação da matriz 3x3).
Observe que todas essas representações de rotações são usadas na prática. Os ângulos de Euler usam menos memória; as matrizes usam mais memória, mas não sofrem de bloqueio de cardan e têm boas propriedades analíticas; e os quatérnios apresentam um bom equilíbrio de ambos, sendo leves, mas livres de bloqueio Gimbal.
fonte
Bem, eu também sou um físico. E há algumas situações em que os quatérnios simplesmente detonam! Harmônicos esféricos, por exemplo. Você tem dois átomos se espalhando, trocando um elétron: qual é a transferência de spin orbital? Com quatérnios é apenas multiplicação, ou seja, somando os expoentes das funções de base SH expressas como quatérnios. (Colocar os polinômios de Legendre na notação de quaternion é um pouco tedioso).
Mas eu concordo, eles não são uma ferramenta universal e, especialmente na mecânica de corpos rígidos, seriam muito complicados de usar. No entanto, para citar a resposta de Bertrand Russell em questão de um aluno, quanta matemática um físico precisa saber: "Tanto quanto possível!"
Enfim: por que amamos quatérnios na computação gráfica? Porque eles têm várias propriedades atraentes. Em primeiro lugar, pode-se interpolar-os bem, o que é importante se estivermos animando coisas giratórias, como os membros em torno de uma articulação. Com um quatérnio, é apenas multiplicação e normalização escalar. Expressar isso com uma matriz requer avaliação de sen e cos e, em seguida, construir uma matriz de rotação. Então, multiplicar um vetor por um quatérnio é ainda mais barato do que passar por uma multiplicação vetorial-matriz completa, também é ainda mais barato se adicionarmos uma tradução posteriormente. Se você considerar um sistema de animação esquelética para um personagem humano, onde se deve avaliar muitas translações / rotações para um grande número de vértices, isso tem um grande impacto.
Outro bom efeito colateral do uso de quatérnios é que qualquer transformação é inerentemente ortonormal. Com matrizes de tradução, deve-se reortonormalizar a cada duas etapas da animação, devido a erros de arredondamento numéricos.
fonte
Muitos aplicativos 3D, como o uso de ângulos de Euler para definir a orientação de um objeto. Para simuladores de vôo em particular, eles representam uma maneira teoricamente útil de armazenar a orientação de uma forma que seja facilmente modificável.
Você também deve estar ciente de que coisas como "trocar de coordenadas, girar para fora da degeneração ou usar dois sistemas de coordenadas sobrepostos", todas exigem esforço. Esforço significa código. E código significa desempenho. Perder desempenho quando você não precisa não é uma coisa boa para muitos aplicativos 3D. Afinal, o que se ganha com todos esses truques, se apenas usar quatérnios, você conseguiria tudo o que precisava.
Os problemas numéricos surgem ao lidar com várias rotações consecutivas de uma orientação. Imagine que você tem um objeto no espaço. E a cada fatia de tempo, você aplica uma pequena mudança de guinada. Após cada alteração, você precisa normalizar novamente a orientação; caso contrário, problemas de precisão irão se infiltrar e bagunçar as coisas.
Se você usar matrizes, cada vez que fizer a multiplicação de matrizes, você deverá reortonormalizar a matriz. A matriz que você está ortonormalizando ainda não é uma matriz de rotação, então eu não teria tanta certeza sobre essa ortonormalização fácil. No entanto, posso ter certeza sobre isso:
Não será tão rápido quanto uma normalização de vetor 4D. É isso que os quatérnios usam para normalizar após rotações sucessivas.
A normalização do quaternion é barata. Mesmo a normalização da matriz de rotação especializada não será tão barata. Novamente, o desempenho é importante.
Há também outro problema que as matrizes não resolvem facilmente: a interpolação entre duas orientações diferentes.
Ao lidar com um personagem 3D, você geralmente tem uma série de transformações que definem a localização de cada osso no personagem. Esta hierarquia de ossos representa o personagem em uma pose particular.
Na maioria dos sistemas de animação, para calcular a pose de um personagem em um determinado momento, interpola-se entre as transformações. Isso requer a interpolação das transformações correspondentes.
Interpolar duas matrizes é ... não trivial. Pelo menos, é se você quiser algo que se pareça com uma matriz de rotação no final. Afinal, o objetivo da interpolação é produzir algo no meio do caminho entre as duas transformações.
Para quaternions, tudo que você precisa é um lerp 4D seguido por um normalize. Isso é tudo: pegue dois quatérnios e interpole linearmente os componentes. Normalize o resultado.
Se quiser uma interpolação de melhor qualidade (e às vezes você quer), você pode trazer o lerp esférico . Isso faz com que a interpolação se comporte melhor para orientações mais díspares. Essa matemática é muito mais difícil e requer mais operações para matrizes do que para quatérnios.
fonte
Opinião: Quaternions são legais.
Matriz de rotação: Menor desvantagem : a multiplicação de matrizes é ~ 2 vezes mais lenta do que os quatérnios. Vantagem menor : a multiplicação do vetor de matriz é ~ 2 vezes mais rápida e grande. Grande desvantagem : Normalização! Ghram-Shmit é assimétrico, o que não dá uma resposta precisa de ordem superior ao fazer equações diferenciais. Métodos mais sofisticados são muito complexos e caros.
Eixo (ângulo = comprimento do eixo) Vantagem menor : Pequeno. Desvantagem moderada : a multiplicação e a aplicação a um vetor são lentas com trigonometria. Desvantagem moderada : singularidade do pólo norte no comprimento = 2 * pi, uma vez que todas as direções do eixo não fazem nada. Mais código (e depuração) para redimensioná-lo automaticamente quando chegar perto de 2pi.
fonte
Nós absolutamente não queremos apenas isso. Existe uma sutileza muito importante que muitas pessoas não percebem . A construção da qual você está falando (desenhe os triângulos e use trigonometria, etc.) girará corretamente um vetor no outro. Mas existem infinitas rotações que farão isso. Em particular, posso ir depois que você fizer sua rotação e girar todo o sistema em torno do vetor X '. Isso não mudará a posição de X '. A combinação de sua rotação e a minha é equivalente a outra rotação única (uma vez que as rotações formam um grupo ). Em geral, você precisa ser capaz de representar tal rotação.
Acontece que você pode fazer isso apenas com um vetor. (Essa é a representação do ângulo do eixo das rotações .) Mas combinar rotações na representação do ângulo do eixo é difícil. Os quatérnios facilitam isso, junto com muitas outras coisas. Basicamente, os quatérnios têm todas as vantagens de outras representações e nenhuma das desvantagens. (Embora eu admita que pode haver aplicações específicas para as quais alguma outra representação pode ser melhor.)
fonte
E são boas razões.
Como você já parece entender, os quatérnios codificam uma única rotação em torno de um eixo arbitrário, em oposição a três rotações sequenciais no espaço 3 de Euler. Isso torna os quatérnions imunes ao bloqueio do cardan .
Além disso, algumas formas de interpolação tornam-se agradáveis e fáceis de fazer, como SLERP .
Do ponto de vista do desempenho, por que sua solução é melhor?
Eu poderia continuar, mas os quatérnios são apenas uma ferramenta possível para usar. Se eles não atenderem às suas necessidades, não os use.
fonte
Vale lembrar que todas as propriedades relacionadas à rotação não são propriamente propriedades dos Quatérnios: são propriedades das Parametrizações de Euler-Rodrigues , que é a própria estrutura de 4 elementos usada para descrever uma rotação 3D.
A relação deles com quatérnions deve-se puramente a um artigo de Cayley, "Sobre certos resultados relacionados a quatérnios", onde o autor observa a correlação entre a multiplicação de quatérnios e a combinação de parametrizações de Euler-Rodrigues. Isso permitiu que aspectos da teoria do Quaternion fossem aplicados à representação de rotações e, especialmente, à interpolação entre elas.
Você pode ler o artigo aqui: https://archive.org/details/collmathpapers01caylrich . Mas, na época, não havia conexão entre os quatérnios e a rotação, e Cayley ficou bastante surpreso ao descobrir que havia:
No entanto, não há nada intrínseco aos quatérnios que dê algum benefício à rotação. Os quaternions não evitam o bloqueio do cardan; As parametrizações de Euler-Rodrigues sim. Muito poucos programas de computador que realizam rotação têm probabilidade de realmente implementar tipos de quatérnios que são valores matemáticos complexos de primeira classe. Infelizmente, um mal-entendido sobre o papel dos quatérnions parece ter vazado em algum lugar, resultando em alguns alunos de gráficos confusos aprendendo os detalhes da matemática complexa com múltiplas constantes imaginárias e, em seguida, perplexos quanto ao por que isso resolve os problemas com a rotação.
fonte
Uma resposta que alguém pode ler: Existem problemas tediosos com todas as representações. Os quatérnios são menores do que as matrizes, mas a multiplicação do quatérnio não é um mero produto escalar vetorial ou algo semelhante e, na verdade, leva mais tempo em um computador do que o produto escalar de duas matrizes 3x3. (Os computadores são muito bons em operar com matrizes comuns)
No entanto, as matrizes têm outras características irritantes. Por exemplo, eles não são criaturas estáveis no longo prazo. Ao modelar rotações no espaço 3D, geralmente se acumula rotações uma sobre a outra em uma matriz de orientação, que é apenas uma única matriz de rotação que armazena a orientação de um quadro de referência. Este processo irá, ao longo de milhões de adições, fazer com que a matriz O divirta de uma forma de matriz de rotação estrita. Isso pode ser contornado reconfigurando periodicamente a matriz, mas há condições em que isso não é trivial. A saber, o caso de não rotação da matriz de identidade.
Você gostaria de encontrar uma representação do ângulo do eixo (ou representação do quatérnio) da rotação e, em seguida, reproduzir uma matriz para isso. A maioria dos algoritmos produz um vetor zero e, em seguida, encontra a divisão zero neste caso. Nestes tipos de casos também é geralmente uma má ideia tentar evitar tais casos com soluções do tipo "se 0 então ...", uma vez que a) os garfos são lentos eb) você ainda pode acabar com o epsilon da máquina à parte singularidade e acabar com erros horrendos.
fonte