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
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.
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)
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.
- 1. ¿Qué es una rotación de cuaternión?
- 2. Cómo usar la rotación del cuaternión en la escena Three.js json
- 3. ¿Convertir la rotación de Quaternion a la matriz de rotación?
- 4. ¿Existe una biblioteca matemática vectorial/matriz/cuaternión fácil de usar en C puro?
- 5. ¿Cómo puedo extrapolar una nueva rotación de cuaternión de dos paquetes anteriores?
- 6. girando un cuaternión en 1 eje?
- 7. compiladores JIT para matemática
- 8. sistema de coordenadas giratorias a través de un cuaternión
- 9. Java o Python para matemática?
- 10. Componente de una rotación quaternion alrededor de un eje
- 11. Python para estudiantes de matemática?
- 12. Deshabilitar la rotación automática para una UIView
- 13. ¿Cómo aprender la notación matemática?
- 14. Biblioteca matemática BCD para números grandes arbitrarios?
- 15. ¿Mejor algoritmo para evaluar una expresión matemática?
- 16. Fórmula matemática para el cálculo de la duración de llamada
- 17. expresión matemática Postgres calculcated para cada fila en la tabla
- 18. ¿Cuál es la mejor biblioteca matemática para usar con Java?
- 19. Evaluar la función matemática de la cadena
- 20. Finanzas cuantitativas/biblioteca matemática para Java
- 21. Ejecución de la ecuación matemática en Android
- 22. Python matemática simbólica?
- 23. Programación Matemática Idiomas
- 24. Evaluación de expresión matemática
- 25. Java - Rotación de la imagen
- 26. gema matemática Ruby
- 27. Jmeter función matemática
- 28. OpenGL Rotación
- 29. Cómo encontrar el vector para el cuaternión de X Y Z rotaciones
- 30. Pregunta matemática simple:
Gracias. eso funcionó perfectamente – shoosh