Disponível sobre quaternions e seus benefícios


De um tradutor: exatamente 175 anos e 3 dias atrás, quaternions foram inventados. Em homenagem a essa rodada, decidi pegar o material que explica esse conceito em uma linguagem clara.

O conceito de quaternions foi inventado pelo matemático irlandês Sir William Rowan Hamilton na segunda-feira, 16 de outubro de 1843 em Dublin, Irlanda. Hamilton e sua esposa foram para a Academia Real Irlandesa e, atravessando o Canal Real sobre a Ponte Broome , ele fez uma descoberta impressionante, que imediatamente arranhou na pedra da ponte.

i 2 = j 2 = k 2 = i j k = - 1




Uma placa comemorativa na Ponte Broome sobre o Canal Real, em homenagem à descoberta da fórmula fundamental para a multiplicação de quaterniões.

Neste artigo, tentarei explicar o conceito de quaternions de uma maneira fácil de entender. Vou explicar como você pode visualizar um quaternion e também falar sobre as diferentes operações que podem ser realizadas com quaternions. Além disso, compararei o uso de matrizes, ângulos de Euler e quaternions e, em seguida, tentarei explicar quando usar quaternions em vez de ângulos de Euler ou matrizes e quando você não precisar.

Conteúdo


  • 1. Introdução
  • 2. Números complexos
    • 2.1 Adição e subtração de números complexos
    • 2.2 Multiplicação de um número complexo por um valor escalar
    • 2.3 O produto de números complexos
    • 2.4 O quadrado de números complexos
    • 2.5 Números complexos conjugados
    • 2.6 O valor absoluto do número complexo
    • 2.7 Quociente de dois números complexos
  • 3. Graus eu
  • 4. plano complexo
    • 4.1 Rotores
  • 5. Quaternions
    • 5.1 Quaternions como um par ordenado
    • 5.2 Adição e Subtração de Quaternion
    • 5.3 Produto Quaternion
    • 5.4 Real Quaternion
    • 5.5 Multiplicação escalar de quaternário
    • 5.6 Quaternions puros
    • 5.7 Formulário de quaternário aditivo
    • 5.8 Single Quaternion
    • 5.9 Forma binária de Quaternion
    • 5.10 Quaternions conjugados
    • 5.11 Taxa de Quaternion
    • 5.12 Normalização de Quaternion
    • 5.13 Quaternion reverso
    • 5.14 Produto escalar de Quaternion
  • 6. Voltas
  • 7. Interpolação de quaternions
    • 7.1 SLERP
      • 7.1.1 Diferença de Quaternion
      • 7.1.2 Elevando um quaternion a um poder
      • 7.1.3 Diferença fracionária de quaternions
      • 7.1.4 Fatores a Considerar
    • 7.2 Esquadrão
  • 8. Conclusão
  • 9. Faça o download da demo
  • 10. Referências

Não é possível entender completamente os quaternions em 45 minutos.

Este artigo tem muita matemática, portanto não é para os fracos.

1. Introdução


Na computação gráfica, matrizes são usadas para descrever a posição no espaço (deslocamento), bem como a orientação no espaço (rotação). Você também pode usar uma única matriz de transformação para descrever a escala do objeto. Essa matriz pode ser considerada um "espaço base". Se multiplicarmos um vetor ou um ponto (ou mesmo outra matriz) por uma matriz de transformações, "transformaremos" esse vetor, um ponto ou uma matriz no espaço representado por essa matriz.

Neste artigo, não falarei em detalhes sobre matrizes de transformação. Detalhes sobre matrizes de transformação podem ser encontrados no meu artigo Matrizes .

Neste artigo, quero falar sobre uma maneira alternativa de descrever a orientação de um objeto (rotação) no espaço usando quaternions.

Números complexos


Para entender completamente os quaternions, precisamos primeiro entender de onde eles vieram. O princípio do quaternião é baseado no conceito de um sistema numérico complexo.

Juntamente com os conhecidos conjuntos de números ( natural , inteiro , real e racional ), o sistema de números complexos adiciona um novo conjunto de números, chamados números imaginários. Números imaginários foram inventados para resolver certas equações que não tinham soluções, por exemplo:

x 2 + 1 = 0


Para resolver essa expressão, precisamos afirmar que x 2 = - 1 , e isso, como você sabe, é impossível, porque o quadrado de qualquer número (positivo ou negativo) é sempre positivo.

Os matemáticos não conseguiram chegar a um acordo com o fato de que a expressão não tem solução; portanto, um novo conceito foi inventado - um número imaginário que pode ser usado para resolver essas equações.

O número imaginário é o seguinte:

i 2 = - 1


Não tente entender essa suposição, porque não há razões lógicas para sua existência. Nós só precisamos aceitar isso eu - é apenas uma certa quantidade cujo quadrado é - 1 .

O conjunto de números imaginários pode ser indicado como  m a t h b b I .

O conjunto de números complexos (indicado por  m a t h b b C É a soma dos números reais e imaginários da seguinte forma:

z=a+bi  a,b in mathbbR,  i2=1


Também pode ser afirmado que todos os números reais são complexos com b=0 , e todos os números imaginários são complexos com a=0 .

Adição e subtração de números complexos


Números complexos podem ser adicionados e subtraídos adicionando e subtraindo as partes reais e imaginárias.

Adição:

(a1+b1i)+(a2+b2i)=(a1+a2)+(b1+b2)i


Subtração:

(a1+b1i)(a2+b2i)=(a1a2)+(b1b2)i


Multiplicação de um número complexo por um valor escalar


O número complexo é multiplicado por um escalar multiplicando cada membro do número complexo por um escalar:

 lambda(a+bi)= lambdaa+ lambdabi


O produto de números complexos


Além disso, números complexos também podem ser multiplicados usando regras algébricas comuns.

\ begin {array} {rcl} z_1 & = & (a_1 + b_1i) \\ z_2 & = & (a_2 + b_2i) \\ z_1z_2 & = & (a_1 + b_1i) (a_2 + b_2i) \\ & = a_1a_2 + a_1b_2i + b_1a_2i + b_1b_2i ^ 2 \\ & = & (a_1a_2-b_1b_2) + (a_1b_2 + b_1a_2) i \ end {array}


O quadrado de números complexos


Além disso, um número complexo pode ser elevado ao quadrado multiplicando-se:

\ begin {array} {rcl} z & = & (a + bi) \\ z ^ 2 & = & (a + bi) (a + bi) \\ & = & (a ^ 2-b ^ 2) + 2abi \ end {array}


Números complexos conjugados


O valor conjugado de um número complexo é um número complexo com um sinal alterado da parte imaginária, denotado como  barz ou como z .

\ begin {array} {rcl} z & = & (a + bi) \\ z ^ * & = & (a-bi) \ end {array}


A multiplicação de um número complexo com seu valor conjugado fornece um resultado interessante.

\ begin {array} {rcl} z & = & (a + bi) \\ z ^ * & = & (a-bi) \\ zz ^ * & = & (a + bi) (a-bi) \ \ & = & a ^ 2-abi + abi + b ^ 2 \\ & = & a ^ 2 + b ^ 2 \ end {array}


O valor absoluto do número complexo


Podemos usar o número conjugado de um número complexo para calcular o valor absoluto (ou norma ou magnitude ) de um número complexo. O valor absoluto de um número complexo é a raiz quadrada de um número complexo vezes seu conjugado . É denotado como |z| :

\ begin {array} {rcl} z & = & (a + bi) \\ | z | & = & \ sqrt {zz ^ *} \\ & = & \ sqrt {(a + bi) (a-bi)} \\ & = & \ sqrt {a ^ 2 + b ^ 2} \ end {array}


Quociente de dois números complexos


Para calcular o quociente de dois números complexos, multiplicamos o numerador e o denominador pelo número conjugado do denominador.

\ begin {array} {rcl} z_1 & = & (a_1 + b_1i) \\ z_2 & = & (a_2 + b_2i) \\ \ cfrac {z_1} {z_2} & = & \ cfrac {a_1 + b_1i} { a_2 + b_2i} \\ & = & \ cfrac {(a_1 + b_1i) (a_2-b_2i)} {(a_2 + b_2i) (a_2-b_2i)} \\ & = & \ cfrac {a_1a_2-a_1b_2i + b_1a_2i-bi ^ 2} {a_2 ^ 2 + b_2 ^ 2} \\ & = & \ cfrac {a_1a_2 + b_1b_2} {a_2 ^ 2 + b_2 ^ 2} + \ cfrac {b_1a_2-a_1b_2} {a_2 ^ 2 + b_2 ^ 2} i \ end {array}


Graus i


Se afirmarmos que i2=1 então deve haver a possibilidade de erguer i e para outros graus.

\ begin {array} {rrrrrrr} i ^ 0 & = & & & & & & & 1 \\ i ^ 1 & = & & & & & & & i \\ i ^ 2 & = & & & & & & & -1 \\ i ^ 3 & = & ii ^ 2 & = & & & -i \\ i ^ 4 & = & i ^ {2} i ^ {2} & = & & & 1 \\ i ^ 5 & = & ii ^ 4 & = & & & i \\ i ^ 6 & = & ii ^ 5 & = & i ^ 2 & = & -1 \ end {array}


Se continuarmos a gravar esta série, notamos um padrão (1,i,1,i,1, pontos) .

Um padrão semelhante surge com um aumento em graus negativos.

\ begin {array} {rcr} i ^ 0 & = & 1 \\ i ^ {- 1} & = & -i \\ i ^ {- 2} & = & -1 \\ i ^ {- 3} & = & i \\ i ^ {- 4} & = & 1 \\ i ^ {- 5} & = & -i \\ i ^ {- 6} & = & -1 \ end {array}


Talvez você já tenha visto esse padrão em matemática, mas na forma (x,y,x,y,x, pontos) , que é obtido girando o ponto 90 ° no sentido anti-horário em um plano cartesiano bidimensional; linha (x,y,x,y,x, pontos) criado girando o ponto 90 ° em um plano cartesiano bidimensional.


Avião cartesiano

Plano complexo


Da mesma forma, podemos aplicar números complexos a uma grade bidimensional, chamada plano complexo , vinculando a parte real ao eixo horizontal e o imaginário à vertical.


Plano complexo

Como você pode ver na linha anterior, podemos dizer que se multiplicarmos o número complexo por i , podemos rotacionar o número complexo no plano complexo em incrementos de 90 °.

Vamos verificar se isso é verdade. Tomamos um ponto arbitrário no plano complexo p :

p=2+i


e multiplique por i tendo recebido q :

\ begin {array} {rcl} p & = & 2 + i \\ q & = & pi \\ & = & (2 + i) i \\ & = & 2i + i ^ 2 \\ & = & - 1 + 2i \ end {array}


Multiplicando q em i nós temos r :

\ begin {array} {rcl} q & = & -1 + 2i \\ r & = & qi \\ & = & (-1 + 2i) i \\ & = & -i + 2i ^ 2 \\ & = & -2-i \ end {array}


E multiplicando r em i nós temos s :

\ begin {array} {rcl} r & = & -2-i \\ s & = & ri \\ & = & (-2-i) i \\ & = & -2i-i ^ 2 \\ & = & 1-2i \ end {array}


E multiplicando s em i nós temos t :

\ begin {array} {rcl} s & = & 1-2i \\ t & = & si \\ & = & (1-2i) i \\ & = & i-2i ^ 2 \\ & = & 2 + i \ end {array}


E conseguimos exatamente o que começamos ( p ) Se colocarmos esses números complexos no plano complexo, obtemos o seguinte resultado.


Números complexos no plano complexo

Agora podemos girar no plano complexo e no sentido horário, multiplicando o número complexo por i .

Rotores


Também podemos executar curvas arbitrárias no plano complexo, definindo o número complexo da seguinte forma:

q= cos theta+i sin theta


Ao multiplicar qualquer número complexo pelo rotor q nós obtemos a fórmula geral:

\ begin {array} {rcl} p & = & a + bi \\ q & = & \ cos \ theta + i \ sin \ theta \\ pq & = & (a + bi) (\ cos \ theta + i \ sin \ theta) \\ a ^ {\ prime} + b ^ {\ prime} i & = & a \ cos \ theta-b \ sin \ theta + (a \ sin \ theta + b \ cos \ theta) i \ end {array}


O que também pode ser escrito em forma de matriz:

\ begin {bmatrix} a ^ {\ prime} & -b ^ {\ prime} \\ b ^ {\ prime} e a ^ {\ prime} \ end {bmatrix} = \ begin {bmatrix} \ cos \ theta & - \ sin \ theta \\ \ sin \ theta \ cos \ theta \ end {bmatrix} \ begin {bmatrix} a & -b \\ b & a \ end {bmatrix}


O que é uma maneira de girar no sentido anti-horário um ponto arbitrário no plano complexo em relação à origem.

Quaternions


Tendo aprendido sobre o sistema de números complexos e o plano complexo, podemos trazê-los para o espaço tridimensional, aumentando o sistema de números junto com i mais dois números imaginários.

Quaternions têm a seguinte forma generalizada

q=s+xi+yj+zk  s,x,y,z in mathbbR


Onde, de acordo com a famosa expressão de Hamilton:

i2=j2=k2=ijk=1



\ begin {array} {ccc} ij = k & jk = i & ki = j \\ ji = -k & kj = -i & ik = -j \ end {array}


Você pode perceber que a relação entre i , j e k muito semelhantes às regras de multiplicação de vetores de vetores cartesianos unitários:

\ begin {array} {ccc} \ mathbf {x} \ times \ mathbf {y} = \ mathbf {z} e \ mathbf {y} \ times \ mathbf {z} = \ mathbf {x} e \ mathbf { z} \ times \ mathbf {x} = \ mathbf {y} \\ \ mathbf {y} \ times \ mathbf {x} = - \ mathbf {z} e \ mathbf {z} \ times \ mathbf {y} = - \ mathbf {x} & \ mathbf {x} \ times \ mathbf {z} = - \ mathbf {y} \ end {array}


Hamilton também notou que números imaginários i , j e k pode ser usado para representar três vetores unitários cartesianos  mathbfi ,  mathbfj e  mathbfk com as mesmas propriedades dos números imaginários, então  mathbfi2= mathbfj2= mathbfk2=1 .


Representação gráfica de propriedades  mathbfij ,  mathbfjk ,  mathbfki

A imagem acima mostra graficamente a relação entre os vetores unitários cartesianos na forma  mathbfi ,  mathbfj e  mathbfk .

Quaternions como um par ordenado


Também podemos representar os quaternions como um par ordenado:

q=[s, mathbfv]  s em mathbbR, mathbfv em mathbbR3


Onde  mathbfv também pode ser representado como seus componentes individuais:

q=[s,x mathbfi+y mathbfj+z mathbfk]  s,x,y,z in mathbbR


Usando esta entrada, podemos representar mais facilmente os recursos comuns de quaternions e números complexos.

Adição e Subtração de Quaternion


Quaternions podem ser adicionados e subtraídos de maneira semelhante a números complexos:

\ begin {array} {rcl} q_a & = & [s_a, \ mathbf {a}] \\ q_b & = & [s_b, \ mathbf {b}] \\ q_a + q_b & = & [s_a + s_b, \ mathbf {a} + \ mathbf {b}] \\ q_a-q_b & = & [s_a-s_b, \ mathbf {a} - \ mathbf {b}] \ end {array}


Quaternion works


Também podemos expressar o produto de dois quaternions:

\ begin {array} {rcl} q_a & = & [s_a, \ mathbf {a}] \\ q_b & = & [s_b, \ mathbf {b}] \\ q_ {a} q_ {b} & = & [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] \\ & = & (s_ {a} + x_ {a} i + y_ {a} j + z_ {a } k) (s_ {b} + x_ {b} i + y_ {b} j + z_ {b} k) \\ & = & (s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}) \\ & & + (s_ {a} x_ {b} + s_ {b} x {a} + y_ {a} z_ {b } -y_ {b} z_ {a}) i \\ & & + (s_ {a} y_ {b} + s_ {b} y_ {a} + z_ {a} x_ {b} -z_ {b} x_ {a}) j \\ & & + (s_ {a} z_ {b} + s_ {b} z_ {a} + x_ {a} y_ {b} -x_ {b} y_ {a}) k \ end {array}


O que nos dá outro quaternion. Se substituirmos os números imaginários na expressão anterior i , j e k pares ordenados (também conhecidos como unidades de quaternião), obtemos

i=[0, mathbfi] j=[0, mathbfj] k=[0, mathbfk]


E substituindo de volta à expressão original por [1, mathbf0]=1 nós obtemos:

\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & (s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}) [1, \ mathbf {0}] \\ & & + (s_ {a} x_ {b} + s_ {b } x {a} + y_ {a} z_ {b} -y_ {b} z_ {a}) [0, \ mathbf {i}] \\ & & + (s_ {a} y_ {b} + s_ { b} y_ {a} + z_ {a} x_ {b} -z_ {b} x_ {a}) [0, \ mathbf {j}] \\ & & + (s_ {a} z_ {b} + s_ {b} z_ {a} + x_ {a} y_ {b} -x_ {b} y_ {a}) [0, \ mathbf {k}] \ end {array}


Expandindo essa expressão na soma dos pares ordenados, obtemos:

\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & [s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}, \ mathbf {0}] \\ & & + [0, (s_ {a} x_ {b} + s_ {b } x {a} + y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i}] \\ & & + [0, (s_ {a} y_ {b} + s_ { b} y_ {a} + z_ {a} x_ {b} -z_ {b} x_ {a}) \ mathbf {j}] \\ & & + [0, (s_ {a} z_ {b} + s_ {b} z_ {a} + x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k}] \ end {array}


Se multiplicarmos por uma unidade quaterniônica e extrairmos os componentes vetoriais comuns, poderemos reescrever essa equação da seguinte maneira:

\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & [s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}, \ mathbf {0}] \\ & & + [0, s_ {a} (x_ {b} \ mathbf {i } + y_ {b} \ mathbf {j} + z_ {b} \ mathbf {k}) + s_ {b} (x_ {a} \ mathbf {i} + y_ {a} \ mathbf {j} + z_ { a} \ mathbf {k}) \\ & & (y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i} + (z_ {a} x_ {b} -z_ { b} x_ {a}) \ mathbf {j} + (x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k}] \ end {array}


Essa equação nos dá a soma de dois pares ordenados. O primeiro par ordenado é o quaternion material , e o segundo é o quaternion puro . Esses dois pares ordenados podem ser combinados em um par ordenado:

\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & [s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}, \\ & & s_ {a} (x_ {b} \ mathbf {i} + y_ {b} \ mathbf {j } + z_ {b} \ mathbf {k}) + s_ {b} (x_ {a} \ mathbf {i} + y_ {a} \ mathbf {j} + z_ {a} \ mathbf {k}) \\ & & + (y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i} + (z_ {a} x_ {b} -z_ {b} x_ {a}) \ mathbf { j} + (x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k}] \ end {array}


Se substituirmos, obteremos

\ begin {array} {rcl} \ mathbf {a} & = & x_ {a} \ mathbf {i} + y_ {a} \ mathbf {j} + z_ {a} \ mathbf {k} \\ \ mathbf {b} & = & x_ {b} \ mathbf {i} + y_ {b} \ mathbf {j} + z_ {b} \ mathbf {k} \\ \ mathbf {a} \ cdot \ mathbf {b} & = & x_ {a} x_ {b} + y_ {a} y_ {b} + z_ {a} z_ {b} \\ \ mathbf {a} \ times \ mathbf {b} & = & (y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i} + (z_ {a} x_ {b} -z_ {b} x_ {a}) \ mathbf {j} + (x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k} \ end {array}


Temos:

[sa, mathbfa][sb, mathbfb]=[sasb mathbfa cdot mathbfb,sa mathbfb+sb mathbfa+ mathbfa times mathbfb]


Esta é a equação geral para o produto de quaternions.

Real Quaternion


Um quaternion real é um quaternion no qual um vetor  mathbf0 :

q=[s, mathbf0]


E o produto de dois quaternions materiais é outro quaternion material :

\ begin {array} {rcl} q_a & = & [s_a, \ mathbf {0}] \\ q_b & = & [s_b, \ mathbf {0}] \\ q_ {a} q_ {b} & = & [s_a, \ mathbf {0}] [s_b, \ mathbf {0}] \\ & = & [s_ {a} s_ {b}, \ mathbf {0}] \ end {array}


O que é semelhante ao produto de dois números complexos que contêm o termo imaginário zero.

\ begin {array} {rcl} z_1 & = & a_1 + 0i \\ z_2 & = & a_2 + 0i \\ z_ {1} z_ {2} & = & (a_1 + 0i) (a_2 + 0i) \\ & = & a_ {1} a_ {2} \ end {array}


Multiplicação escalar de quaternário


Também podemos multiplicar o quaternion por um escalar, aderindo à seguinte regra:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ \ lambda {q} & = & \ lambda [s, \ mathbf {v}] \\ & = & [\ lambda {s}, \ lambda \ mathbf {v}] \ end {array}


Podemos verificar isso usando o produto de quaternions reais mostrado acima, multiplicando o quaternion por um escalar como o quaternion real :

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ \ lambda & = & [\ lambda, \ mathbf {0}] \\ \ lambda {q} & = & [ \ lambda, \ mathbf {0}] [s, \ mathbf {v}] \\ & = & [\ lambda {s}, \ lambda \ mathbf {v}] \ end {array}


Quaternions puros


Além dos quaternions materiais , Hamilton também definiu quaternion puro como um quaternion com um termo escalar zero:

q=[0, mathbfv]


Ou se você anotar os componentes:

q=xi+yj+zk


E, novamente, podemos pegar o produto de dois quaternions puros :

\ begin {array} {rcl} q_a & = & [0, \ mathbf {a}] \\ q_b & = & [0, \ mathbf {b}] \\ q_ {a} q_ {b} & = & [0, \ mathbf {a}] [0, \ mathbf {b}] \\ & = & [- \ mathbf {a} \ cdot \ mathbf {b}, \ mathbf {a} \ times \ mathbf {b} ] \ end {array}


de acordo com a regra do produto quaternion apresentada acima.

Formulário de quaternário aditivo


Além disso, podemos expressar os quaternions como a soma das partes reais e puras do quaternion:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + [0, \ mathbf {v}] \ end {array }


Single Quaternion


Tomando um vetor arbitrário  mathbfv , esse vetor pode ser expresso em termos de seu valor escalar e em sua direção, da seguinte maneira:

 mathbfv=v mathbf hatv  textwhere v=| mathbfv|  texte | mathbf hatv|=1


Combinando esta definição com a definição de quaternion puro, obtemos:

\ begin {array} {rcl} q & = & [0, \ mathbf {v}] \\ & = & [0, v \ mathbf {\ hat {v}}] \\ & = & v [0, \ mathbf {\ hat {v}}] \ end {array}


Também podemos descrever um quaternion de unidade com um escalar zero e um vetor de unidade:

 hatq=[0, mathbf hatv]


Forma binária de Quaternion


Agora podemos combinar as definições de um único quaternion e a forma aditiva de um quaternion, obtendo uma forma de quaternions semelhante à notação usada na descrição de números complexos:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + [0, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + v [0, \ mathbf {\ hat {v}}] \\ & = & s + v \ hat {q} \ end {array}


O que nos dá uma maneira de representar um quaternion de uma forma muito semelhante a números complexos:

\ begin {array} {rcl} z & = & a + bi \\ q & = & s + v \ hat {q} \ end {array}


O número conjugado de um quaternion


O número conjugado do quaternion pode ser calculado tomando a parte do vetor do quaternion oposta ao sinal:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ q ^ * & = & [s, - \ mathbf {v}] \ end {array}


O produto do quaternion e seu número conjugado nos dão o seguinte:

\ begin {array} {rcl} qq ^ * & = & [s, \ mathbf {v}] [s, - \ mathbf {v}] \\ & = & [s ^ 2- \ mathbf {v} \ cdot- \ mathbf {v}, - s \ mathbf {v} + s \ mathbf {v} + \ mathbf {v} \ times- \ mathbf {v}] \\ & = & [s ^ 2 + \ mathbf { v} \ cdot \ mathbf {v}, \ mathbf {0}] \\ & = & [s ^ 2 + v ^ 2, \ mathbf {0}] \ end {array}


Taxa de Quaternion


Lembre-se da definição da norma de um número complexo:

\ begin {array} {rcl} | z | & = & \ sqrt {a ^ 2 + b ^ 2} \\ zz ^ * & = & | z | ^ 2 \ end {array}


Da mesma forma, a norma (ou magnitude) de um quaternion é definida como:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ | q | & = & \ sqrt {s ^ 2 + v ^ 2} \ end {array}


O que nos permite expressar a norma do quaternion da seguinte maneira:

qq=|q|2


Normalização de Quaternion


Tendo uma definição da norma do quaternion, podemos usá-lo para normalizar o quaternion. O quaternion é normalizado dividindo-se por |q| :

q prime= fracq sqrts2+v2


Por exemplo, vamos normalizar o quaternion:

q=[1,4 mathbfi+4 mathbfj4 mathbfk]


Primeiro, precisamos calcular a taxa de quaternion:

\ begin {array} {rcl} | q | & = & \ sqrt {1 ^ 2 + 4 ^ 2 + 4 ^ 2 + (- 4) ^ 2} \\ & = & \ sqrt {49} \\ & = & 7 \ end {array}


Então devemos dividir o quaternion pela norma do quaternion para calcular o quaternion normalizado:

\ begin {array} {rcl} q ^ {\ prime} & = & \ cfrac {q} {| q |} \\ [1.0em] & = & \ cfrac {(1 + 4 \ mathbf {i} + 4 \ mathbf {j} -4 \ mathbf {k})} {7} \\ [1.0em] & = & \ cfrac {1} {7} + \ cfrac {4} {7} \ mathbf {i} + \ cfrac {4} {7} \ mathbf {j} - \ cfrac {4} {7} \ mathbf {k} \ end {array}


Quaternion reverso


O quaternion reverso é indicado como q1 . Para calcular o quaternion inverso, pegamos o número conjugado do quaternion e dividimos pelo quadrado da norma:

q1= fracq|q|2


Para mostrar isso, podemos usar a definição inversa:

qq1=[1, mathbf0]=1


E multiplique ambos os lados pelo número conjugado do quaternion, o que nos dará:

qqq1=q


Por substituição, obtemos:

\ begin {array} {rcl} | q | ^ {2} q ^ {- 1} & = & q ^ {*} \\ q ^ {- 1} & = & \ cfrac {q ^ {*}} {| q | ^ {2}} \ end {array}


Para normas de quaternário único cuja norma é 1, podemos escrever:

q1=q


Produto escalar de Quaternion


Da mesma forma que o produto escalar de vetores, podemos calcular o produto escalar de dois quaternions multiplicando as partes escalares correspondentes e resumindo os resultados:

\ begin {array} {rcl} q_1 & = & [s_1, x_1 \ mathbf {i} + y_1 \ mathbf {j} + z_1 \ mathbf {k}] \\ q_2 & = & [s_2, x_2 \ mathbf { i} + y_2 \ mathbf {j} + z_2 \ mathbf {k}] \\ q_1 {\ cdot} q_2 & = & s_ {1} s_ {2} + x_ {1} x_ {2} + y_ {1} y_ {2} + z_ {1} z_ {2} \ end {array}


Também podemos usar o produto escalar de quaternions para calcular a diferença angular entre quaternions:

 cos theta= fracs1s2+x1x2+y1y2+z1z2|q1||q2|


Para normas de quaterniões únicas, podemos simplificar a equação:

 cos theta=s1s2+x1x2+y1y2+z1z2


Turns


Deixe-me lembrá-lo de que identificamos uma forma especial de um número complexo chamado rotor , que pode ser usado para girar um ponto em um plano bidimensional da seguinte maneira:

q= cos theta+i sin theta


Devido à semelhança de números complexos com os quaternions, deve ser possível expressar um quaternion que possa ser usado para girar um ponto no espaço tridimensional:

q=[ cos theta, sin theta mathbfv]


Vamos verificar se essa teoria é verdadeira computando o produto quaternion q e vetor  mathbfp . Primeiro, podemos expressar  mathbfp como puro quaternion da seguinte maneira:

p=[0, mathbfp]


Um q É uma única norma de quaternário na forma:

q=[s, lambda mathbf hatv]


Então

\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & [s, \ lambda \ mathbf {\ hat {v}}] [0, \ mathbf {p}] \\ & = & [- \ lambda \ mathbf {\ hat {v}} \ cdot \ mathbf {p}, s \ mathbf {p} + \ lambda \ mathbf {\ hat {v}} \ times \ mathbf {p}] \ end {array}


Vemos que o resultado é um quaternion comum com partes escalares e vetoriais.

Vamos primeiro olhar para um caso "especial" em que  mathbfp perpendicular  mathbf hatv . Nesse caso, o membro do produto escalar  lambda mathbf hatv cdot mathbfp=0 e o resultado se torna puro quaternion:

p prime=[0,s mathbfp+ lambda mathbf hatv times mathbfp]


Nesse caso, para virar  mathbfp a respeito  mathbf hatv nós apenas substituímos s= cos theta e  lambda= sin theta .

p prime=[0, cos theta mathbfp+ sin theta mathbf hatv times mathbfp]


Por exemplo, vamos rotacionar o vetor  mathbfp 45 ° em relação ao eixo Z; então nosso quaternion q será igual a:

\ begin {array} {rcl} q & = & [\ cos \ theta, \ sin \ theta \ mathbf {k}] \\ & = & \ left [\ frac {\ sqrt {2}} {2}, \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right] \ end {array}


E vamos pegar um vetor  mathbfp que diz respeito a um caso especial em que  mathbfp perpendicular  mathbfk :

p=[0,2 mathbfi]


Agora vamos encontrar um pedaço

qp

:

\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & \ left [\ frac {\ sqrt {2}} {2}, \ frac {\ sqrt {2}} { 2} \ mathbf {k} \ right] [0,2 \ mathbf {i}] \\ & = & \ left [0,2 \ frac {\ sqrt {2}} {2} \ mathbf {i} +2 \ frac {\ sqrt {2}} {2} \ mathbf {k} \ times \ mathbf {i} \ right] \\ & = & [0, \ sqrt {2} \ mathbf {i} + \ sqrt {2 } \ mathbf {j}] \ end {array}


O que nos dá um quaternion limpo girado 45 ° sobre o eixo  mathbfk . Também podemos garantir que o valor do vetor final seja preservado:

\ begin {array} {rcl} | \ mathbf {p} ^ {\ prime} | & = & \ sqrt {\ sqrt {2} ^ {2} + \ sqrt {2} ^ {2}} \\ & = & 2 \ end {array}


Exatamente o que esperávamos!

Podemos mostrar isso graficamente com a seguinte imagem:


Girar Quaternion (1)

Agora vamos ver um quaternion não ortogonal para  mathbfp . Se tomarmos para a parte vetorial do quaternião um deslocamento de 45 ° de  mathbfp então temos:

\ begin {array} {rcl} \ mathbf {\ hat {v}} & = & \ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2 } \ mathbf {k} \\ \ mathbf {p} & = & 2 \ mathbf {i} \\ q & = & [\ cos \ theta, \ sin \ theta \ mathbf {\ hat {v}}] \\ p & = & [0, \ mathbf {p}] \ end {array}


E multiplicando nosso vetor  mathbfp em q nós obtemos:

\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & [\ cos \ theta, sen \ theta \ mathbf {\ hat {v}}] [0, \ mathbf {p }] \\ & = & [- \ sin \ theta \ mathbf {\ hat {v}} \ cdot \ mathbf {p}, \ cos \ theta \ mathbf {p} + \ sin \ theta \ mathbf {\ hat { v}} \ times \ mathbf {p}] \ end {array}


Após substituição  mathbf hatv ,  mathbfp e  theta=45 circ nós obtemos:

\ begin {array} {rcl} p ^ {\ prime} & = & \ left [- \ frac {\ sqrt {2}} {2} \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ cdot (2 \ mathbf {i}), \ frac {\ sqrt {2}} {2} 2 \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ times2 \ mathbf {i} \ right] \\ & = & [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j}] \ end {array}


Ou seja, não é mais puro quaternion, não é girado 45 ° e a norma do vetor não é mais igual a 2 (diminuiu para  sqrt3 )

Este resultado pode ser mostrado graficamente.


Turno Quaternário (2)

Estritamente falando, é incorreto representar um quaternion p prime no espaço tridimensional, porque na verdade é um vetor quadridimensional! Por uma questão de simplicidade, mostrarei apenas o componente vetorial dos quaternions.

No entanto, nem tudo está perdido. Hamilton descobriu (mas não publicou isso) que, se multiplicarmos o resultado qp para o valor oposto q , o resultado será quaternário puro e a norma do componente vetorial será preservada. Vamos ver se isso pode ser aplicado em nosso exemplo.

Primeiro, vamos calcular q1 :

\ begin {array} {rcl} q & = & \ left [\ cos \ theta, \ sin \ theta \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ right] \\ q ^ {- 1} & = & \ left [\ cos \ theta, - \ sin \ theta \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ right] \ end {array}


At  theta=45 circ nós obtemos:

\ begin {array} {rcl} q ^ {- 1} & = & \ left [\ frac {\ sqrt {2}} {2}, - \ frac {\ sqrt {2}} {2} \ left ( \ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ right] \\ & = & \ frac {1 } {2} \ left [\ sqrt {2}, - \ mathbf {i} - \ mathbf {k} \ right] \ end {array}


Combinando o valor anterior qp e q1 nós obtemos:

\ begin {array} {rcl} qp & = & \ left [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right] \\ qpq ^ {- 1} & = & \ left [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right] \ frac {1} {2} \ left [\ sqrt {2}, - \ mathbf {i} - \ mathbf {k} \ right] \\ & = & \ frac {1} {2} \ left [- \ sqrt {2} - \ left (\ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right ) \ cdot (- \ mathbf {i} - \ mathbf {k}), \ mathbf {i} + \ mathbf {k} + \ sqrt {2} \ left (\ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right) - \ mathbf {i} + \ sqrt {2} \ mathbf {j} + \ mathbf {k} \ right] \\ & = & \ frac {1} {2} \ left [- \ sqrt {2} + \ sqrt {2}, \ mathbf {i} + \ mathbf {k} +2 \ mathbf {i} + \ sqrt {2} \ mathbf {j} - \ mathbf {i} + \ sqrt {2} \ mathbf {j} + \ mathbf {k} \ right] \\ & = & \ left [0, \ mathbf {i} + \ sqrt {2} \ mathbf {j} + \ mathbf {k} \ direita] \ end {array}


Qual é puro quaternion, e a norma do resultado é:

\ begin {array} {rcl} | p ^ {\ prime} | & = & \ sqrt {1 ^ 2 + \ sqrt {2} ^ 2 + 1 ^ 2} \\ & = & \ sqrt {4} \\ & = & 2 \ end {array}


que é igual  mathbfp , ou seja, a norma do vetor é preservada.

A imagem abaixo mostra o resultado da rotação.


Quaternion Turn (3)

Vemos que o resultado é um quaternário puro, e a norma do vetor original é preservada, mas o vetor gira 90 °, não 45 °, o que é o dobro do necessário! Portanto, para a rotação correta do vetor  mathbfp na esquina  theta em relação a um eixo arbitrário  mathbf hatv precisamos pegar o meio ângulo e criar o seguinte quaternion:

q= left[ cos frac12 theta, sin frac12 theta mathbf hatv right]


Qual é a visão geral de um giro de quaternário!

Interpolação de Quaternion


Uma das razões mais importantes para o uso de quaternions em computação gráfica é que eles descrevem muito bem as rotações no espaço. Os quaterniões eliminam o ônus de outras formas de pontos de viragem no espaço 3D, como quadros dobráveis , nos quais o problema está representando a rotação nos cantos de Euler.

Usando quaternions, podemos definir vários métodos que representam a interpolação da rotação no espaço 3D. O primeiro método que estou considerando é chamado SLERP . É usado para interpolar suavemente um ponto entre duas orientações. O segundo método é o desenvolvimento do SLERP e é chamado SQUAD . É usado para interpolar ao longo de uma série de orientações que especificam o caminho.

SLERP


SLERP significa Interpolação linear esférica (interpolação linear esférica). O SLERP oferece a capacidade de interpolar suavemente um ponto entre duas orientações.

Vou designar a primeira orientação como q1 e o segundo como q2 . O ponto interpolado é indicado por  mathbfp , o ponto interpolado é indicado por  mathbfp prime . Parâmetro de interpolação t irá interpolar  mathbfp de q1 às t=0 antes q2 às t=1 .

A fórmula de interpolação linear padrão é:

 mathbfp prime= mathbfp1+t( mathbfp2 mathbfp1)


Aqui estão as etapas básicas para aplicar esta equação:

  • Calculamos a diferença entre  mathbfp1 e  mathbfp2 .
  • Pegue a parte fracionária dessa diferença.
  • Corrija o valor inicial pela diferença fracionária entre os dois pontos.

Podemos usar o mesmo princípio básico para interpolar entre duas orientações dos quaterniões.

Diferença de Quaternion


O primeiro passo significa que precisamos calcular a diferença entre q1 e q2 . No contexto dos quaternions, isso é semelhante ao cálculo da diferença angular entre dois quaternions.

 Deltaq=q11q2


Elevando um quaternion a um poder


O próximo passo é pegar a parte fracionária dessa diferença. Podemos calcular a parte fracionária do quaternion elevando-o a uma potência cujo valor está na faixa [0...1] .

A fórmula geral para elevar um quaternion a um poder tem a seguinte forma:

qt= exp(t logq)


Onde a função exponencial para quaternions se parece com isso:

\ begin {array} {rcl} \ exp (q) & = & \ exp \ left ([0, \ theta \ mathbf {\ hat {v}}] \ right) \\ & = & [\ cos \ theta , \ sin \ theta \ mathbf {\ hat {v}}] \ end {array}


E o logaritmo de um quaternion tem a forma:

\ begin {array} {rcl} \ log {q} & = & \ log (\ cos \ theta {+} \ sin \ theta \ mathbf {\ hat {v}}) \\ & = & \ log \ left (\ exp (\ theta \ mathbf {\ hat {v}}) \ right) \\ & = & \ theta \ mathbf {\ hat {v}} \\ & = & [0, \ theta \ mathbf {\ hat {v}}] \ end {array}


At t=0 nós temos o seguinte:

\ begin {array} {rcl} q ^ 0 & = & \ exp (0 \ log {q}) \\ & = & \ exp ([\ cos (0), \ sin (0) \ mathbf {\ hat {v}}]) \\ & = & \ exp ([1, \ mathbf {0}]) \\ & = & [1, \ mathbf {0}] \ end {array}


E quando t=1 nós temos

\ begin {array} {rcl} q ^ 1 & = & \ exp (\ log {q}) \\ & = & q \ end {array}


Diferença fracionária de quaternions


Para calcular a rotação angular interpolada, alteramos a orientação inicial q1 à parte fracionária da diferença entre q1 e q2 .

q prime=q1 left(q11q2 right)t


O que é uma visão geral da interpolação linear esférica para quaternions. No entanto, esse não é o tipo de equação do SLERP que é comumente usada na prática.

Podemos aplicar uma fórmula semelhante para realizar a interpolação esférica de vetores em quaternions. A forma geral de interpolação esférica para vetores é definida da seguinte forma:

 mathbfvt= frac sin(1t) theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2


Graficamente, isso pode ser mostrado na imagem a seguir.


Interpolação de Quaternion

Esta fórmula pode ser aplicada a quaternions sem alterações:

qt= frac sin(1t) theta sin thetaq1+ frac sint theta sin thetaq2


E podemos obter o ângulo  theta cálculo do produto escalar q1 e q2 .

\ begin {array} {rcl} \ cos \ theta & = & \ cfrac {q_1 {\ cdot} q_2} {| q_1 || q_2 |} \\ & = & \ cfrac {s_ {1} s_ {2} + x_ {1} x_ {2} + y_ {1} y_ {2} + z_ {1} z_ {2}} {| q_1 || q_2 |} \\ \ theta & = & \ cos ^ {- 1} \ left (\ cfrac {s_ {1} s_ {2} + x_ {1} x_ {2} + y_ {1} y_ {2} + z_ {1} z_ {2}} {| q_1 || q_2 |} \ right) \ end {array}


Fatores a Considerar


Esta implementação tem dois problemas a serem considerados ao usá-la.

Em primeiro lugar, se o produto escalar dos quaterniões for um valor negativo, a interpolação percorrerá um longo caminho na esfera quadridimensional, e isso nem sempre é desejável. , , , . , , , «» .

, q1 e q2 , sinθ 0. , sinθ . q1 e q2 .

SQUAD


, SLERP , SQUAD ( S pherical and Quad rangle — ) .

:

q1,q2,q3,,qn2,qn1,qn


«» ( si ), :

si=exp(log(qi+1q1i)+log(qi1q1i)4)qi


:

qi1,qi,qi+1,qi+2


t :

squad(qi,qi+1,si,si+1,t)=slerp(slerp(qi,qi+1,t),slerp(si,si+1,t),2t(1t))



, .

  • SLERP SQUAD .
  • , , .
  • - . , ( , ).
  • , .
  • 4 (3, . ), 9 .

.

  • - ; « » .
  • , — . , , .

, , . GLM (OpenGL Math Library). , .


, . Unity 3.5.2, . zip Windows, Unity Mac.

Understanding Quaternions.zip


Quaternions for Computer Graphics

Vince, J (2011). Quaternions for Computer Graphics. 1st. ed. London: Springer.



Dunn, F. and Parberry, I. (2002). 3D Math Primer for Graphics and Game Development. 1st. ed. Plano, Texas: Wordware Publishing, Inc.

Source: https://habr.com/ru/post/pt426863/


All Articles