Vamos remover os quaternions de todos os mecanismos 3D

imagem

Programadores gráficos usam quaternions para gravar turnos tridimensionais. No entanto, os quaternions são difíceis de entender porque são estudados superficialmente . Apenas pegamos tabelas de multiplicação estranhas e outras definições enigmáticas sobre fé e as usamos como "caixas pretas" que giram vetores conforme necessário. Porque  mathbfi2= mathbfj2= mathbfk2=1 e  mathbfi mathbfj= mathbfk ? Por que pegamos um vetor e o transformamos em um vetor "imaginário" para transformá-lo, por exemplo  mathbfq(x mathbfi+y mathbfj+z mathbfk) mathbfq ? Mas quem se importa se tudo funciona, certo?

Existe uma maneira de descrever rotações chamadas rotor , que se refere ao campo de números complexos (em 2D) e quaternions (em 3D), e até generaliza para qualquer número de dimensões.

Podemos criar rotores quase completamente do zero , em vez de definir quaterniões do nada e tentar explicar como eles funcionam retroativamente . Leva mais tempo, mas me parece que vale a pena, porque eles são muito mais fáceis de entender!

Além disso, para a visualização e compreensão de rotores tridimensionais, não é necessário usar a quarta dimensão espacial.

Seria ótimo se eles começassem a suplantar o uso e o estudo de quaternions, substituindo-os por rotores. Substituí-los é muito simples, mas o código permanecerá quase o mesmo . Tudo o que pode ser feito com quaterniões, por exemplo, interpolação e remoção de travas de eixo (trava Gimbal), pode ser feito com rotores. Mas começamos a entender muito mais.

(No artigo original, todos os gráficos são interativos e o artigo é seguido por um vídeo. Ao clicar nos botões de reprodução, você pode iniciar a seção correspondente do vídeo. Você também pode clicar no botão de transição abaixo do vídeo para ir para a seção correspondente do artigo. Você pode expandir a janela para que haja mais espaço para o vídeo. ou defina um tamanho constante para ele.)

1. Aviões de giro


1.1 As voltas são realizadas em planos bidimensionais.


No espaço tridimensional, geralmente percebemos as voltas ocorrendo ao redor dos eixos, como uma roda girando em um eixo, mas, em vez disso, seria mais correto representar o plano no qual a roda se encontra. Este plano é perpendicular ao eixo.


Esta velha gira uma roda no avião  mathbfxz perpendicular ao eixo  mathbfy .

Isso acontece porque se dividirmos o vetor em duas partes, uma das quais está no plano (  mathbfv paralelo ) e o outro está fora (  mathbfv perp ), a rotação gira a parte interna e a externa permanece inalterada.


Rotação no avião yx [ no artigo original esta animação e a câmera podem ser movidas ]

No espaço bidimensional, existe apenas um plano no qual a rotação é possível ( não há parte externa ). Portanto, supor que as rotações ocorram ao redor do terceiro eixo (perpendicular ao plano 2D) está estritamente falando incorreto, porque para concluir as rotações não devemos adicionar outra dimensão.

Se dissermos ao "proprietário plano" bidimensional (que vive dentro do plano 2D e nunca saiu do espaço bidimensional) sobre o eixo de rotação perpendicular, ele perguntaria: "Em que direção esse eixo aponta? Não consigo imaginá-la!

Nota
E em dimensões mais altas (4D e superior) é impossível determinar um vetor normal para o plano 2D (por exemplo, em 4D o plano 2D tem duas direções de normais, em 5D há três direções de normais e em nD o deles n2 )

1.2 A direção exata das curvas


Além disso, quando pensamos na rotação em torno de um eixo, a direção da rotação não é definida e, portanto, deve ser determinada por uma regra (a chamada “regra da mão direita”).

No entanto, se assumirmos que as curvas ocorrem dentro dos planos, a direção fica clara: rotação no plano  mathbfxy significa uma rotação que move um vetor (unidade)  mathbfx para o vetor (unidade)  mathbfy dentro do avião eles formam juntos. Rotação no avião  mathbfyx É uma rotação na direção oposta: move o vetor  mathbfy para o vetor  mathbfx .

Nota
Lembro que, quando aprendi sobre três matrizes de rotações 3D em planos ortogonais, pensei: o que diabos é uma matriz  mathbfRy tem o sinal oposto? Isto é devido à regra da mão direita, segundo a qual devemos determinar a rotação ao redor do eixo  mathbfy para que seja executado a partir de  mathbfz para  mathbfx não de  mathbfx para  mathbfz para manter um sentido de rotação "destro" constante. Quando começamos a falar diretamente sobre o próprio avião, essa regra se torna desnecessária.

R_X (\ theta) = \ begin {bmatrix} 1 & 0 & 0 \\ 0 & cos (\ theta) & -sin (\ theta) \\ 0 & sin (\ theta) & cos (\ theta) \ end {bmatrix} \: \: \: R_Y (\ theta) = \ begin {bmatrix} cos (\ theta) & 0 & \ bbox [5px, borda inferior: 2px vermelho sólido] {\ \} sin (\ theta) \\ 0 & 1 & 0 \\ \ bbox [5px, borda inferior: 2px vermelho sólido] {-} sin (\ theta) & 0 & cos (\ theta) \ end {bmatrix} \: \: \: R_Z (\ theta) = \ begin {bmatrix} cos (\ theta) & -sin (\ theta) & 0 \\ sin (\ theta) & cos (\ theta) & 0 \\ 0 & 0 & 1 \ end {bmatrix }


2. Bivectors



2.1 Trabalho externo


Para calcular o eixo de rotação ao girar um vetor  mathbfa para outro vetor  mathbfb pegamos o produto vetorial de dois vetores para obter um vetor perpendicular a ambos. Mas por que precisamos "sair" do avião se a rotação é essencialmente uma operação bidimensional?

Em vez disso, pegamos o que é chamado de produto externo (também conhecido como produto vetorial bidimensional), dois vetores, criando um novo elemento chamado “bivetor” (ou vetor vetorial)  mathbfB representando o plano que dois vetores formam juntos. Se um produto vetorial cria um vetor normal para o plano, o produto externo cria o próprio plano . O cálculo do normal para o plano é irrelevante.

 mathbfB= mathbfa wedge mathbfb


 mathbfB pode ser representado como um paralelogramo construído a partir de vetores  mathbfa e  mathbfb no plano que eles formam juntos.

A princípio, a idéia de um bivetor pode parecer estranha, mas logo veremos que eles são quase tão fundamentais quanto os próprios vetores . Se o vetor puder ser comparado com uma linha reta, o bivetor será como um plano ... As propriedades de um produto externo capturam as propriedades importantes dos planos.

2.2 A base para bivectors



Bivectors, como vetores, têm componentes. Mas eles são determinados com base em planos , e não em linhas retas , como vetores.

Três planos basais ortogonais são  mathbfx wedge mathbfy ,  mathbfx wedge mathbfz e  mathbfy wedge mathbfz como podemos ver na figura.

Mas primeiro, vejamos um caso bidimensional mais simples ...

2.3 Bivectors bidimensionais


Em 2D, existe apenas um plano, a saber  mathbfxy . Ou seja, um bivetor bidimensional possui apenas um componente. Para um bivetor composto por vetores  mathbfa e  mathbfb é o número Bxy igual à área (com um sinal) do paralelogramo formado por dois vetores.

 mathbfB= mathbfa wedge mathbfb=Bxy( mathbfx wedge mathbfy)


No artigo original com um bivetor 2D, você pode experimentar no gráfico interativo alterando os vetores (únicos) dos quais ele é composto:


Você pode ver que, quando o ângulo entre os vetores muda, a área do paralelogramo muda (de acordo com o seno do ângulo).

Se os vetores forem iguais ou paralelos, eles não formarão um plano regular e o resultado será zero. Esta propriedade simples define o que é um bivetor:

 mathbfa wedge mathbfa=0


Observando a soma de dois vetores, você pode ver que a propriedade a seguir:

\ begin {eqnarray} (\ mathbf {a} + \ mathbf {b}) \ wedge (\ mathbf {a} + \ mathbf {b}) & = & 0 \\ \ mathbf {a} \ wedge \ mathbf { a} + \ mathbf {b} \ wedge \ mathbf {a} + \ mathbf {a} \ wedge \ mathbf {b} + \ mathbf {b} \ wedge \ mathbf {b} & = & 0 \\ \ mathbf { b} \ wedge \ mathbf {a} + \ mathbf {a} \ wedge \ mathbf {b} & = & 0 \ end {eqnarray}


Portanto:

 mathbfa wedge mathbfb= mathbfb wedge mathbfa


Assim como a direção da rotação , a ordem dos argumentos no trabalho externo é importante. Reordenar os argumentos altera o sinal do resultado (isso é chamado de "antisimetria").

No gráfico, o sinal é indicado por uma cor que muda de azul para verde. O sinal muda quando a vez de  mathbfa em  mathbfb move do sentido horário para o sentido anti-horário (ou seja, se corresponder à direção (de  mathbfx para  mathbfy ) ou direção (de  mathbfy para  mathbfx )).

Você pode ver que as propriedades do produto externo são organizadas de modo a transmitir as propriedades de planos e curvas.

2.4 Bivetores bidimensionais de vetores sem unidade


Obviamente, os vetores não precisam ter comprimento unitário e essa restrição foi removida neste gráfico:


A área do paralelogramo com um sinal é proporcional aos comprimentos de ambos os vetores: Bxy=sin( alpha) |a | |b | onde  alpha O ângulo entre  mathbfa e  mathbfb . Ou seja, por exemplo, ao dobrar o comprimento de um vetor, a área dobra.

Podemos obter o valor verdadeiro substituindo os vetores como componentes:

\ begin {eqnarray} \ mathbf {a} \ wedge \ mathbf {b} & = & (a_x \ mathbf {x} + a_y \ mathbf {y}) \ wedge (b_x \ mathbf {x} + b_y \ mathbf { y}) \\ & = & a_x b_x (\ mathbf {x} \ wedge \ mathbf {x}) + a_x b_y (\ mathbf {x} \ wedge \ mathbf {y}) + a_y b_x (\ mathbf {y} \ wedge \ mathbf {x}) + a_y b_y (\ mathbf {y} \ wedge \ mathbf {y}) \\ & = & a_x b_y (\ mathbf {x} \ wedge \ mathbf {y}) + a_y b_x ( \ mathbf {y} \ wedge \ mathbf {x}) \\ & = & a_x b_y (\ mathbf {x} \ wedge \ mathbf {y}) - a_y b_x (\ mathbf {x} \ wedge \ mathbf {y} ) \\ & = & (a_x b_y - a_y b_x) (\ mathbf {x} \ wedge \ mathbf {y}) \ end {eqnarray}


Bxy=axbybxay


2.5 Bivectors 3D



Igual às coordenadas do vetor  mathbfv podem ser consideradas projeções do vetor em três eixos de base ortogonais (  mathbfx ,  mathbfy ,  mathbfz ), as coordenadas do bivetor  mathbfB podem ser consideradas projeções menores que um plano em três planos basais ortogonais.

As projeções do vetor são os comprimentos desse vetor ao longo de cada vetor base, e as projeções do bivetor são as áreas do plano em cada plano base.

Para o vetor:

 mathbfv= bbox[5px,bordainferior:2pxvermelhosólido]vx mathbfx+ bbox[5px,bordainferior:2pxverdesólido]vy mathbfy+ bbox[5px,bordainferior:2pxemazulsólido]vz mathbfz


Para bivector:

 mathbfB= bbox[5px,bordainferior:2pxcoralsólido]Bxy( mathbfx wedge mathbfy)+ bbox[5px,bordainferior:2pxourosólido]Bxz( mathbfx wedge mathbfz)+ bbox[5px,bordainferior:2pxDarkVioletsólido]Byz( mathbfy wedge mathbfz)


Onde Bxy , Bxz , Byz São apenas números como vx , vy , vz (eles são sublinhados pelas cores correspondentes às cores no gráfico).

Os componentes de um bivetor 3D são apenas três projeções 2D de um bivetor em um plano 2D básico.

Usando o mesmo método de antes, descobrimos que os valores reais dos componentes se parecem muito com o componente XY do caso bidimensional, mas aplicados aos três planos:

Bxy=axbybxay


Bxz=axbzbxaz


Byz=aybzbyaz


Você pode experimentar um bivetor 3D em um gráfico interativo no artigo original:


Nota
Norma de bivetor  | mathbfB |= | mathbfa wedge mathbfb | é determinado de maneira semelhante à norma do vetor (a raiz quadrada da soma dos quadrados dos componentes). É igual à área do paralelogramo formado  mathbfa e  mathbfb , ou seja,  | mathbfa wedge mathbfb |= midsin( alpha) mid | mathbfa | | mathbfb | onde  alpha - ângulo entre  mathbfa e  mathbfb .

Se dividirmos o bivetor por sua norma, reduziremos os dois comprimentos dos vetores e o valor (absoluto) do seno do ângulo, ou seja, teremos o bivetor  hat mathbfB , que será construído como se os dois vetores fossem inicialmente perpendiculares e tivessem um comprimento unitário. Esta é uma representação muito clara de um plano contendo os dois vetores. Então:

 mathbfB=| mathbfa | ||mathbfb | midsin( alpha) mid hat mathbfB


Algo lembra um trabalho externo? Em 3D, a definição de um trabalho externo é muito semelhante à definição de um trabalho vetorial. De fato, um vetor em 3D obtido de um produto vetorial (por exemplo, um vetor normal) terá três componentes iguais aos componentes do bivetor (os números serão os mesmos, mas a base é diferente).

$$ display $$ \ begin {eqnarray} \ mathbf {a} \ wedge \ mathbf {b} & = & & (a_x b_y - b_x a_y) (\ mathbf {x} \ wedge \ mathbf {y}) \\ & & + & (a_x b_z - b_x a_z) (\ mathbf {x} \ wedge \ mathbf {z}) \\ && + (a_y b_z - b_y a_z) (\ mathbf {y} \ wedge \ mathbf {z} ) \\ \\ \ mathbf {a} \ times \ mathbf {b} & = & & (a_x b_y - b_x a_y) \ \ mathbf {z} \\ & & - & (a_x b_z - b_x a_z) \ \ mathbf {y} \\ & & + (a_y b_z - b_y a_z) \ \ mathbf {x} \ end {eqnarray} $$ display $$


A definição de um bivetor tem um significado geométrico e não aparece do nada. Lembro-me de que, quando estudei produtos vetoriais, pensei: “Que diabos retorna um vetor cujo comprimento é igual à área do paralelogramo formado por esses dois vetores? Parece tão aleatório. E por que podemos transformar a área do paralelogramo no comprimento do vetor? ”

2.6 Semântica de vetores e bivetores


Em 3D, o bivetor possui três coordenadas, uma por plano: (  mathbfxy ,  mathbfxz e  mathbfyz ) Os vetores também têm três coordenadas, uma por eixo (  mathbfx ,  mathbfy e  mathbfz ) Cada plano é perpendicular a um eixo. Essa coincidência surge apenas em três dimensões (*) e é por isso que constantemente confundimos bivetores com vetores .

(*)
Em 2D, há apenas um bivetor básico (  mathbfxy ) e, em 3D, existem três bivetores básicos (  mathbfxy ,  mathbfxz ,  mathbfyz ), em 4D existem 6 bivectors de base (  mathbfxy ,  mathbfxz ,  mathbfxw ,  mathbfyz ,  mathbfyw ,  mathbfzw ) e assim por diante ...

Na programação, ambos têm o mesmo layout de memória, mas operações diferentes. O uso de um vetor 3D em vez de um bivetor 3D é semelhante a uma "conversão de tipo" de um bivetor.

Aqui está um exemplo: você pode ver que os vetores normais são transformados de maneira diferente dos vetores comuns usando a matriz "transferência reversa" ( mathbfMT)1 , em vez da própria matriz. Isso ocorre porque, na verdade, eles não são vetores, mas bivetores, que são transformados em vetores por "conversão de tipo". Na física, existe um hack chamado “vetor axial”, que foi introduzido para distinguir os vetores obtidos pelo produto vetorial dos vetores comuns. Um bivetor é um verdadeiro "tipo" de um objeto e deve ser percebido e processado de acordo.

Trivectors

Podemos continuar usando um produto externo para obter não apenas áreas 2D orientadas, mas também volumes 3D orientados. Trivector T pode ser obtido executando o produto externo duas vezes:

 mathbfT= mathbfa wedge mathbfb wedge mathbfc


No espaço tridimensional, tudo termina aí. Como em 2D, onde há apenas um plano preenchendo todo o espaço 2D, em 3D há apenas um volume preenchendo todo o espaço 3D.

[Mas em nD, podemos continuar a criar vetores de produtos externos ainda maiores até atingir a enésima dimensão. Por exemplo, em 4D, temos quatro trivctors de base (3 vetores) (  mathbfxyz ,  mathbfxyw ,  mathbfxwz ,  mathbfyzw ) e um vetor 4 básico  mathbfxyzw ]

Em 3D, o trivector possui apenas um componente básico ( Txyz ) igual ao volume do paralelepípedo formado por três vetores. O produto externo triplo é uma versão aprimorada do produto triplo escalar ( ( mathbfa times mathbfb) cdot mathbfc ), porque envolve apenas um tipo de operação, ele retorna o tipo correto (volume em vez de escalar) e funciona em qualquer número de dimensões.

 mathbfT=Txyz mathbfx wedge mathbfy wedge mathbfz


3. O produto geométrico


3.1 Multiplicação de vetores entre si


Produto geométrico  mathbfab (indicado sem um símbolo) é outra operação que pode ser executada com vetores. O produto geométrico é definido para que os vetores sejam quantidades inversas (por exemplo,  mathbfa mathbfa1=1 , em que 1 é apenas o número 1!) e possui propriedades convenientes, por exemplo, associatividade (  mathbfa( mathbfb mathbfc)=( mathbfa mathbfb) mathbfc ) O objetivo disso é poder multiplicar vetores para que (como é o caso das matrizes) a multiplicação corresponda às operações geométricas.

Nota
Ter valores inversos é útil porque qualquer que seja o objeto  mathbfa mathbfa1 , ele não afetará os vetores, ou seja, se comportará da mesma forma que ao multiplicar o número por 1.

Para definir um produto, primeiro observamos que é possível dividir um produto (ou qualquer função que aceite dois argumentos) na soma da parte que não muda se trocarmos os argumentos e a parte que muda da seguinte maneira:

\ begin {eqnarray} \ mathbf {a} \ mathbf {b} & = & \ frac {1} {2} (\ mathbf {a} \ mathbf {b} + \ mathbf {a} \ mathbf {b} + \ mathbf {b} \ mathbf {a} - \ mathbf {b} \ mathbf {a}) \\ & = & \ frac {1} {2} (\ mathbf {a} \ mathbf {b} + \ mathbf { b} \ mathbf {a}) + \ frac {1} {2} (\ mathbf {a} \ mathbf {b} - \ mathbf {b} \ mathbf {a}) \ end {eqnarray}


O primeiro termo não depende mais da ordem dos argumentos  mathbfa e  mathbfb (é chamada de parte "simétrica") e o segundo termo muda de sinal ao alterar os locais dos argumentos (é chamada de parte "antissimétrica").

O produto escalar de dois vetores (também chamado de produto interno) é simétrico e é uma medida de distância (  mathbfa cdot mathbfa= | mathbfa |2 ), portanto, do ponto de vista geométrico, parece útil torná-lo igual à parte simétrica:

 frac12( mathbfa mathbfb+ mathbfb mathbfa)= mathbfa cdot mathbfb


Da mesma forma, o produto externo de dois vetores é antissimétrico, portanto, seria útil equipará-lo à parte antissimétrica:

 frac12( mathbfa mathbfb mathbfb mathbfa)= mathbfa wedge mathbfb


Além disso, o produto escalar contém o cosseno do ângulo entre dois vetores (  mathbfa cdot mathbfb= | mathbfa | | mathbfb |cos( alpha) ), enquanto o produto externo contém o seno do ângulo. Juntos, eles descrevem completamente o ângulo entre os vetores, bem como o plano que eles formam.

Nota
É a completude da descrição que torna o trabalho reversível, porque podemos passar de um vetor para outro com a ajuda das informações contidas em seu trabalho. Se eu te der  mathbfa e  mathbfa mathbfb então você pode obter  mathbfb . Isso é impossível, sabendo apenas o cosseno ou apenas o seno / plano.

Ou seja, o produto geométrico é igual a:

 mathbfa mathbfb= mathbfa cdot mathbfb+ mathbfa wedge mathbfb


Isso é estranho, porque multiplicar dois vetores dá a soma de duas coisas diferentes: um escalar e um bivetor. No entanto, isso é semelhante à forma como um número complexo é a soma de um número escalar e um "imaginário", para que você já possa se acostumar. Aqui, a parte bivetor corresponde à parte "imaginária" do número complexo. Só que este não é um valor "imaginário", é apenas um bivetor que podemos realmente mostrar graficamente!

De fato, multiplicando dois vetores, calculamos suas propriedades úteis ("o comprimento de suas projeções um no outro" / "cosseno do ângulo" (  mathbfa cdot mathbfb ) e "o plano que formam juntos" / "o seno do ângulo" (  mathbfa wedge mathbfb )), que conectamos com um sinal de adição. Um produto geométrico também fornece operações de "grupos de propriedades" que podem ser aplicadas a eles, e essas operações têm interpretações geométricas (por exemplo: rotação e reflexão de vetores). Isso veremos em breve.

Você pode expressar o produto geométrico em termos de seno e cosseno:  mathbfa mathbfb= | mathbfa | | mathbfb |(cos( alpha)+sin( alpha) mathbfB) onde  mathbfB É um bivetor de ambos os vetores no plano, composto por dois vetores perpendiculares unitários.

3.2 Tabela de multiplicação


A tabela de multiplicação nos permite tornar o produto mais específico: vamos ver o que acontece se obtivermos os produtos de vetores de base (  mathbfx ,  mathbfy ,  mathbfz )

Para qualquer vetor base, por exemplo, um eixo  mathbfx , o resultado será igual 1 :

 mathbfx mathbfx= mathbfx cdot mathbfx+ mathbfx wedge mathbfx=1


Para qualquer par de vetores de base, por exemplo, eixos  mathbfx e  mathbfy , o resultado será um bivetor, que juntos eles formam:

 mathbfx mathbfy= mathbfx cdot mathbfy+ mathbfx wedge mathbfy= mathbfx wedge mathbfy


(ou seja, podemos citar  mathbfx wedge mathbfy apenas  mathbfx mathbfy , já que esse é o mesmo!)

Isso nos dá a seguinte tabela:
 mathbfa mathbfb mathbfb
 mathbfx mathbfy mathbfz
 mathbfa mathbfx1 mathbfx mathbfy mathbfx mathbfz
 mathbfy mathbfx mathbfy1 mathbfy mathbfz
 mathbfz mathbfx mathbfz mathbfy mathbfz1

De fato, esta tabela é trivial, comparada, por exemplo, com a tabela de quaternions.

Nota
Por exemplo, aqui está a multiplicação de dois vetores (5,3,0) e (2,0,1) :

\ begin {eqnarray} (5 \ mathbf {x} + 3 \ mathbf {y}) (2 \ mathbf {x} + 1 \ mathbf {z}) & = & 5 \ 2 \ \ mathbf {x} \ mathbf {x} + 5 \ 1 \ \ mathbf {x} \ mathbf {z} + 3 \ 2 \ \ mathbf {y} \ mathbf {x} + 3 \ 1 \ \ mathbf {y} \ mathbf {z} \\ & = & 10 + 5 \ \ mathbf {x} \ mathbf {z} - 6 \ \ mathbf {x} \ mathbf {y} + 3 \ \ mathbf {y} \ mathbf {z} \ end {eqnarray}


3.3 Fórmula de reflexão (aparência tradicional)



Reflexão sobre um vetor [no artigo original, cada vetor pode ser movido]

Se tivermos um vetor de unidade  mathbfa e vetor  mathbfv nós podemos refletir  mathbfv através de um plano perpendicular  mathbfa .

Isso é feito da maneira usual: compartilhamos  mathbfv Na parte perpendicular ao plano:  mathbfv perp=( mathbfv cdot mathbfa) mathbfa , e a parte paralela ao plano:  mathbfv parallel= mathbfv mathbfv perp= mathbfv( mathbfv cdot mathbfa) mathbfa .

Então, para refletir o vetor, invertemos a parte perpendicular e deixamos a parte paralela inalterada:

\ begin {eqnarray} R _ {\ mathbf {a}} (\ mathbf {v}) & = & \ mathbf {v} _ \ parallel - \ mathbf {v} _ \ perp \\ & = & (\ mathbf { v} - (\ mathbf {v} \ cdot \ mathbf {a}) \ mathbf {a}) - ((\ mathbf {v} \ cdot \ mathbf {a}) \ mathbf {a}) \\ & = & \ mathbf {v} - 2 (\ mathbf {v} \ cdot \ mathbf {a}) \ mathbf {a} \ end {eqnarray}


3.4 Fórmula de reflexão (vista para produto geométrico)


Nesta fase, podemos substituir o produto escalar  mathbfv cdot mathbfa na sua versão na forma de um produto geométrico  frac12( mathbfv mathbfa+ mathbfa mathbfv) e obtenha o seguinte:

\ begin {eqnarray} R _ {\ mathbf {a}} (\ mathbf {v}) & = & \ mathbf {v} - 2 (\ frac {1} {2} (\ mathbf {v} \ mathbf {a } + \ mathbf {a} \ mathbf {v})) \ mathbf {a} \\ & = & \ mathbf {v} - \ mathbf {v} \ mathbf {a} ^ 2 - \ mathbf {a} \ mathbf {v} \ mathbf {a} \\ & = & - \ mathbf {a} \ mathbf {v} \ mathbf {a} \ end {eqnarray}


(  mathbfa2= mathbfa cdot mathbfa=1 desde  mathbfa é um vetor de unidade)

Isso nos dá exatamente a mesma coisa, mas em uma entrada diferente. Usar um registro na forma de um produto simples em vez de uma fórmula para codificar uma operação tão fundamental como a reflexão será muito útil!

Como funcionam vários produtos geométricos?
Se você não entender como a tomada múltipla de um produto geométrico funciona, basta olhar para os vetores básicos. Existem apenas três casos possíveis:

\ begin {eqnarray} \ mathbf {x} (\ mathbf {x} \ mathbf {x}) & = & \ mathbf {x} 1 = \ mathbf {x} \\ \ mathbf {x} (\ mathbf {x } \ mathbf {y}) & = & \ mathbf {x} (\ mathbf {x} \ cdot \ mathbf {y} + \ mathbf {x} \ wedge \ mathbf {y}) = \ mathbf {x} (\ mathbf {x} \ cdot \ mathbf {y}) + \ mathbf {x} \ mathbf {x} \ mathbf {y} = \ mathbf {x} (\ mathbf {x} \ cdot \ mathbf {y}) + \ mathbf {y} \\ \ mathbf {x} (\ mathbf {y} \ mathbf {z}) & = & \ mathbf {x} (\ mathbf {y} \ cdot \ mathbf {z}) + \ mathbf {x } \ mathbf {y} \ mathbf {z} \ end {eqnarray}


Os resultados serão: vetor, vetor, vetor + trivector. No entanto, o último caso pode ocorrer apenas quando todos os três vetores são independentes, o que nunca é verdade para  mathbfava

Detalhes
Pessoas curiosas podem ver o que acontece em cada estágio.  mathbfa mathbfv mathbfa em termos de produto geométrico.

  1. Primeira etapa:

     mathbfv mathbfa= mathbfv cdot mathbfa+ mathbfv wedge mathbfa


    Se, como antes, dividimos  mathbfv à parte perpendicular ao plano (  mathbfv perp ) e a parte paralela a ele (  mathbfv paralelo ), obtemos:

    \ begin {eqnarray} (\ mathbf {v} _ \ perp + \ mathbf {v} _ \ paralelo) \ mathbf {a} & = & (\ mathbf {v} _ \ perp + \ mathbf {v} _ \ paralelo) \ cdot \ mathbf {a} + (\ mathbf {v} _ \ perp + \ mathbf {v} _ \ paralelamente) \ wedge \ mathbf {a} \\ & = & \ mathbf {v} _ \ perp \ cdot \ mathbf {a} + \ mathbf {v} _ \ parallel \ cdot \ mathbf {a} + \ mathbf {v} _ \ perp \ wedge \ mathbf {a} + \ mathbf {v} _ \ parallel \ wedge \ mathbf {a} \ end {eqnarray}


     mathbfv paralelo cdot mathbfa=0 , porque esses vetores são perpendiculares e  mathbfv perp wedge mathbfa=0 porque esses vetores são paralelos.

     mathbfv mathbfa= mathbfv perp cdot mathbfa+ mathbfv paralelo cunha mathbfa


    O primeiro termo é apenas o comprimento da projeção  mathbfv em  mathbfa , ou seja, o primeiro termo é apenas o comprimento  mathbfv perp .

    Vamos ligar  hat mathbfv parallel versão normalizada  mathbfv paralelo isso é  mathbfv paralelo= hat mathbfv paralelo | mathbfv paralelo | . Então o segundo termo é apenas um bivetor  mathbfB= hat mathbfv parallel wedge mathbfa vezes o comprimento  mathbfv paralelo .

    Este bivector  mathbfB composto por dois vetores unitários perpendiculares, isto é, uma representação muito clara do plano de vetores  mathbfa e  mathbfv . Ele não contém informações sobre o ângulo relativo ou o comprimento, apenas a orientação do plano.

    Ou seja, ambos os termos são apenas decomposições  mathbfv em duas projeções ortogonais (  mathbfv paralelo e  mathbfv perp ), bem como o plano que eles formam (  mathbfB ):

     | mathbfv perp |+ | mathbfv paralelo | mathbfB


    Antes de passar para a próxima etapa, podemos substituir o produto externo por um geométrico, porque  mathbfa e  mathbfv paralelo são perpendiculares e, portanto, seu produto externo e geométrico será equivalente (uma vez que a parte com o produto escalar de seu produto geométrico é igual a zero).

     mathbfv perp cdot mathbfa+ mathbfv paralela cunha mathbfa= mathbfv perp cdot mathbfa+ mathbfv parallel mathbfa

  2. A segunda etapa será a seguinte:

     mathbfa mathbfv mathbfa= mathbfa( mathbfv perp cdot mathbfa)+ mathbfa mathbfv parallel mathbfa


    O primeiro membro é apenas um componente  mathbfv junto  mathbfa , ou seja, componente  mathbfv perpendicular ao plano. Em outras palavras, o primeiro termo é apenas  mathbfv perp .

     mathbfa mathbfv mathbfa= mathbfv perp+ mathbfa mathbfv paralelo mathbfa


    Desde  mathbfa e  mathbfv paralelo (novamente) perpendicular, o produto geométrico deles é simplesmente o produto externo, ou seja, você pode trocá-los e alterar o sinal.

    \ begin {eqnarray} \ mathbf {a} \ mathbf {v} \ mathbf {a} & = & \ mathbf {v} _ \ perp - \ mathbf {v} _ \ paralela \ mathbf {a} \ mathbf {a } \\ & = & \ mathbf {v} _ \ perp - \ mathbf {v} _ \ parallel \ end {eqnarray}

  3. E finalmente, o último estágio vira o sinal:

     mathbfa mathbfv mathbfa= mathbfv perp+ mathbfv parallel


    Ou seja, vemos que o componente  mathbfv perpendicular ao plano, de cabeça para baixo, mas a parte paralela permanece a mesma!

Nota
Comprimento  mathbfa não é muito importante, então abaixo a ignoramos, mas se  mathbfa não é um vetor unitário, devemos dividir por seu comprimento e a fórmula se transforma em  mathbfa mathbfv mathbfa1 , que é mais um "produto em camadas", com o qual você deveria se acostumar.

3.5 Duas reflexões são uma virada: a situação em 2D


Acontece que se aplicarmos a  mathbfv duas reflexões consecutivas (primeiro com um vetor  mathbfa e depois com o vetor  mathbfb ), obtemos uma rotação duas vezes o ângulo entre os vetores  mathbfa e  mathbfb .

Podemos mostrar cada estágio subsequente de reflexão no gráfico abaixo:


Você também pode alterar vetores no artigo original.  mathbfa ,  mathbfb e  mathbfv , mas a configuração inicial dos vetores no gráfico (clique no botão "Redefinir posições do vetor") demonstra claramente por que a rotação como resultado ocorre em um ângulo duplo . Outra boa configuração é definir como  mathbfa e  mathbfb machados  mathbfx e  mathbfy .

3.6 Duas reflexões é uma virada: a situação em 3D


No caso do vetor 3D  mathbfv pode ser dividido em duas partes, uma das quais está no plano dado  mathbfa e  mathbfb , e o outro fica fora do plano (perpendicular a ele). Como mostra o gráfico abaixo, quando o vetor é refletido por cada um dos planos, sua parte externa permanece a mesma. Quanto ao interior, estamos de volta em 2D, e ele gira apenas o dobro do ângulo!


3.7 Rotores


Do ponto de vista do produto geométrico, duas reflexões correspondem simplesmente ao seguinte:

R mathbfb(R mathbfa( mathbfv))= mathbfb( mathbfa mathbfv mathbfa) mathbfb= mathbfb mathbfa mathbfv mathbfa mathbfb


Nós chamamos  mathbfa mathbfb= mathbfa cdot mathbfb+ mathbfa wedge mathbfb rotor porque multiplicando por  mathbfa mathbfb nos dois lados do vetor, realizamos uma rotação (  mathbfb mathbfa É o mesmo que  mathbfa mathbfb , apenas no bivetor de peças invertido).

Aplicação do rotor  mathbfa mathbfb para ambos os lados do vetor gira esse vetor no plano dos vetores  mathbfa e  mathbfb o dobro do ângulo entre  mathbfa e  mathbfb .

E isso é tudo!

Comparação de rotores 3D e quaternions


Você pode ver que os rotores 3D se parecem muito com quaternions:

a+Bxy  mathbfx wedge mathbfy+Bxz  mathbfx wedge mathbfz+Byz  mathbfy wedge mathbfz


a+b  mathbfi+c  mathbfj+d  mathbfk


De fato, o código / matemática é praticamente o mesmo! A principal diferença é que  mathbfi ,  mathbfj e  mathbfk substituído por  mathbfy wedge mathbfz ,  mathbfx wedge mathbfz e  mathbfx wedge mathbfy mas eles funcionam basicamente da mesma forma. A comparação de código pode ser encontrada aqui . Eu não implementei tudo, por exemplo, log / exp para interpolação, mas eles são bastante simples de criar.


No entanto, como vimos, os rotores 3D são um conceito tridimensional que não requer o uso de "giros duplos quadridimensionais" ou "projeção estereográfica" para visualização. Tentar visualizar quaternions rodando em 4D para explicar rotações 3D é como tentar entender o movimento planetário do ponto de vista geocêntrico. I.e. essa abordagem é muito complicada porque a encaramos do ponto de vista errado.

Como vimos, modelar rotações como ocorrendo dentro de planos, em vez de em torno de vetores, nos ajuda muito. Por exemplo, os quadrados dos bivectors base dão 1 , assim como os quaternions básicos (  mathbfi2= mathbfj2= mathbfk2=1 ):

( mathbfx mathbfy)2=( mathbfx mathbfy)( mathbfx mathbfy)=( mathbfy mathbfx)( mathbfx mathbfy)= mathbfy( mathbfx mathbfx) mathbfy= mathbfy mathbfy=1


A multiplicação de dois bivetores um pelo outro dá um terceiro bivetor, mas na verdade é trivial, e não precisamos lembrar que  mathbfi mathbfj= mathbfk :

( mathbfx mathbfy)( mathbfy mathbfz)= mathbfx( mathbfy mathbfy) mathbfz= mathbfx mathbfz



(Observe que usamos  mathbfx wedge mathbfy= mathbfx mathbfy )

Essas propriedades são o resultado de um produto geométrico e não surgem do nada!

Leitura adicional


(A propósito, na álgebra geométrica, existem não apenas rotores, mas também outras coisas legais!)

  • Álgebra Linear e Geométrica de Macdonald [ link to Amazon ]

    Uma fonte excelente, muito clara e compreensível, porque estava implícito que substituiria o livro de álgebra linear dos alunos.
  • Álgebra geométrica para ciência da computação por Dorst et al. [ link para a Amazon ]

    Uma ótima fonte, porque a programação às vezes permite entender melhor o assunto.
    Nota: neste livro, os autores deixam claro que a álgebra geométrica é mais lenta que os quaterniões (e similares ...). De fato, ele deve ter aproximadamente o mesmo código (ou seja, você não deve escrever código para álgebra geométrica, criando uma estrutura generalizada que possa conter todos os tipos possíveis de vetores-k, basta escrever, se necessário, uma estrutura para cada tipo de vetor-k Ou seja, para substituir os quaternions, você pode escrever uma estrutura Bivector e uma estrutura Rotor, que é Scalar + Bivector).

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


All Articles