Pregunta

Estoy dibujando un disco plano usando gluDisk() en mi escena. gluDisk() extrae el disco frente al eje Z positivo, pero quiero que se enfrenta a algunas normales arbitraria que tengo.
Está claro que necesito utilizar glRotate() para conseguir el disco frente adecuadamente pero lo que debería ser la rotación? Recuerdo esto puede ser calculado usando cuaterniones pero me parece que no puede recordar la matemáticas.

¿Fue útil?

Solución

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

El eje de rotación para llegar desde Normal1 a Normal2 debe ser ortogonal a ambos, por lo que sólo tomar su vector de producto cruzado .

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 deben ser normalizados que dará cos (theta), por lo que acaba de tomar el coseno inverso para obtener la cantidad de rotación

El vector resultante y el ángulo son los parámetros necesarios para glRotate() - no hay necesidad de calcular la matriz de rotación real de sí mismo.

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

Otros consejos

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], definir:

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. Va a obtener el vector ortogonal (que será su vector de rotación para crear el cuaternión) y la longitud de este vector es el pecado del ángulo que tiene que compensar por lo que el inicio y el destino vector de superposición.

Quaternions describen una rotación alrededor de un eje. <w,x,y,z> girará alrededor del eje <x,y,z> cierta 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, es necesario girar 90 ° alrededor del eje x. El vector se <0, 1, 0>, y el cuaternión se <cos 90°, 0, sin 90°, 0> = <0, 0, 1, 0>.

Para girar la figura de frente a la parte positiva del eje Z, de cara al <x,y,z> vector que necesita para encontrar la rotación del vector y el ángulo de rotación. Para encontrar el eje de rotación, se puede tomar el producto cruzado de un vector de corriente, y en el que desea que sea.

Si se enfrenta a la del eje Z positivo, el vector de corriente se <0, 0, 1>. Si usted quiere que se enfrentan <x,y,z>, el eje de rotación se <0, 0, 1> x <x, y, z> = <-y, x, 0>, y el ángulo se 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top