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
- 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)=(a1−a2)+(b1−b2)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 cartesianoPlano 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 complexoComo 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 complexoAgora 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 , mathbfkiA 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 mathbfj−4 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
q−1 . Para calcular o quaternion inverso, pegamos o número conjugado do quaternion e dividimos pelo quadrado da norma:
q−1= fracq∗|q|2
Para mostrar isso, podemos usar a definição inversa:
qq−1=[1, mathbf0]=1
E multiplique ambos os lados pelo número conjugado do quaternion, o que nos dará:
q∗qq−1=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:
q−1=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
q−1 :
\ 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
q−1 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=q−11q2
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(q−11q2 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(1−t) theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2
Graficamente, isso pode ser mostrado na imagem a seguir.
Interpolação de QuaternionEsta fórmula pode ser aplicada a quaternions sem alterações:
qt= frac sin(1−t) 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,⋯,qn−2,qn−1,qn
«» (
si ), :
si=exp(−log(qi+1q−1i)+log(qi−1q−1i)4)qi
:
qi−1,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(1−t))
, .
- SLERP SQUAD .
- , , .
- - . , ( , ).
- , .
- 4 (3, . ), 9 .
.
, , .
GLM (OpenGL Math Library). , .
, .
Unity 3.5.2,
. zip Windows, Unity Mac.
Understanding Quaternions.zip
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. |