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.

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top