matemática Quaternion para rotação?
-
11-09-2019 - |
Pergunta
Estou desenhando um disco plano usando gluDisk()
na minha cena. gluDisk()
chama o disco virado para o eixo Z positivo, mas eu quero que seja enfrentando algum normais arbitrária que eu tenho.
Claramente eu preciso usar glRotate()
para obter o disco virado corretamente, mas o que deveria ser a rotação? Lembro-me esta pode ser calculada usando Quaternions mas eu não consigo me lembrar a matemática.
Solução
A solução deve ser bastante simples, e não deve precisar quarternions.
O eixo de rotação para começar a partir normal1 para Normal2 deve ser ortogonal a ambos, então basta ter a sua cruzada de produtos vector .
A quantidade de rotação é facilmente derivado de sua dot-product . Este valor é | A |. | B |. .Cos (teta), mas como os dois vetores normais deve ser normalizada vai dar cos (teta), então basta ter o co-seno inverso para obter a quantidade de rotação
O vector e ângulo resultante são os parâmetros necessários para glRotate()
- não há necessidade de calcular a rotação real matriz si mesmo.
P.S. não se esqueça que glRotate()
precisa o ângulo em graus, mas as funções normais C trigonométricas trabalham em radianos.
Outras dicas
de rotação em torno de um eixo arbitrário: Dado ângulo r em radianos e vector de unidade u = ai + bj + CK ou [a, b, c], definir:
q0 = cos(r/2)
q1 = sin(r/2) a
q2 = sin(r/2) b
q3 = sin(r/2) c
e construo a partir destes valores a matriz de rotação:
( q0^2+q1^2 - q2^2 - q3^2 | 2*(q1*q2 - q0*q3) | 2*(q1*q3 + q0*q2) )
Q =( 2*(q2*q1 + q0*q3) | (q0^2 - q1^2 + q2^2 - q3^2) | 2*(q2*q3 - q0*q1) )
( 2*(q3*q1 - q0*q2) | 2*(q3*q2 + q0*q1) | q0^2 - q1^2 - q2^2 + q3^2 )
Para encontrar a rotação que você precisa fazer, você pode calcular o produto cruzado entre o vector corrente e o vector alvo. Você vai obter o vetor ortogonal (que será seu vetor de rotação para criar o quaternion) eo comprimento deste vetor é o pecado do ângulo que você tem que compensar de modo que o início eo vector alvo sobreposição.
Quaternions descrever uma rotação em torno de um eixo. <w,x,y,z>
vai girar em torno do eixo <x,y,z>
alguma quantia, dependendo do equilíbrio entre a magnitude do w
e a magnitude do vetor.
<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1
Por exemplo, rodando-a para enfrentar o positivo do eixo Y ao invés, é necessário rodá-lo de 90 ° em torno do eixo-X. O vector seria <0, 1, 0>
, eo quaternion seria <cos 90°, 0, sin 90°, 0>
= <0, 0, 1, 0>
.
Para girar a figura de frente para o eixo Z positivo, de frente para o <x,y,z>
vetor você precisa encontrar a rotação do vetor e o ângulo de rotação. Para localizar o eixo de rotação, você pode pegar o produto cruzado de um vector atual, e onde você quer que ele seja.
Se estiver de frente para o eixo Z positivo, o vetor atual seria <0, 0, 1>
. Se você quer que ele <x,y,z>
rosto, o eixo de rotação seria <0, 0, 1> x <x, y, z> = <-y, x, 0>
, eo ângulo seria arctan(sqrt(x^2+y^2),z)
. O quaternion torna-se
<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z)