2009-04-18 19 views
8

Estoy dibujando un disco plano usando gluDisk() en mi escena. gluDisk() dibuja el disco frente al eje Z positivo, pero quiero que se enfrente a una normalidad arbitraria que tengo.
Claramente necesito usar glRotate() para hacer que el disco se oriente correctamente, pero ¿cuál debería ser la rotación? Recuerdo que esto se puede calcular utilizando Quaternions, pero parece que no puedo recordar las matemáticas.Cuaternión matemática para la rotación?

Respuesta

16

La solución debe ser bastante sencilla, y no debe requerir quarternions.

El eje de rotación para pasar de Normal1 a Normal2 debe ser ortogonal a ambos, así que simplemente tome su producto cruzado vector.

La cantidad de rotación se deriva fácilmente de su dot-producto. Este valor es | A |. | B | .cos (theta), pero como los dos vectores normales deberían normalizarse, dará cos (theta), así que simplemente tome el coseno inverso para obtener la cantidad de rotación.

El vector y el ángulo resultantes son los parámetros necesarios para glRotate() - no es necesario que usted mismo calcule la matriz de rotación real.

p.s. no olvide que glRotate() necesita el ángulo en grados, pero las funciones trigonométricas C normales funcionan en radianes.

+0

Gracias. eso funcionó perfectamente – shoosh

3

Quaternions describen una rotación sobre un eje. <w,x,y,z> girará alrededor del eje <x,y,z> alguna cantidad dependiendo del equilibrio entre la magnitud de w y la magnitud del vector.

<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1 

Por ejemplo, girándolo para enfrentar el eje Y positivo en lugar, tiene que girar 90 ° alrededor del eje x. El vector sería <0, 1, 0>, y el quaternion sería <cos 90°, 0, sin 90°, 0> = <0, 0, 1, 0>.

Para girar la figura desde el eje Z positivo, hacia el vector <x,y,z> debe encontrar el vector de rotación y el ángulo de rotación. Para encontrar el eje de rotación, puede tomar el producto cruzado de un vector actual, y donde quiere que esté.

Si está orientado hacia el eje Z positivo, el vector actual sería <0, 0, 1>. Si quiere que se enfrente al <x,y,z>, el eje de rotación sería <0, 0, 1> x <x, y, z> = <-y, x, 0>, y el ángulo sería arctan(sqrt(x^2+y^2),z). El cuaternión se convierte

<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z) 
6

rotación alrededor de un eje arbitrario: Dada ángulo r en radianes y la unidad de vector u = ai + bj + ck o [a, b, c], definen:

q0 = cos(r/2) 
q1 = sin(r/2) a 
q2 = sin(r/2) b 
q3 = sin(r/2) c 

y construir a partir de estos valores de la matriz de rotación:

(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 la rotación que tiene que hacer, se puede calcular el producto vectorial entre el vector de corriente y el vector objetivo. Obtendrás el vector ortogonal (que será tu vector de rotación para crear el cuaternión) y la longitud de este vector es el pecado del ángulo que tienes que compensar para que el vector inicial y el vector objetivo se superpongan.

Cuestiones relacionadas