¿Puedo usar quaternions para controlar un helicóptero?


9

Estoy tratando de hacer una simulación simplificada de helicóptero (por el momento, es un cubo) en 3D y tengo algunos problemas con la rotación. Un helicóptero puede girar a lo largo de los tres ejes:

  • girar sobre sí mismo utilizando la hélice trasera: rotación del eje y
  • Incline hacia la izquierda y hacia la derecha para ir hacia la izquierda o hacia la derecha: rotación del eje z
  • Incline hacia arriba y hacia abajo para ir hacia atrás o hacia adelante: rotación del eje x

Necesito poder controlar cada eje individualmente. Hasta ahora he intentado usar ángulos de euler, pero sea cual sea el orden de rotación que use, me encuentro con un bloqueo de cardán o algunos ejes "cambian de lugar".

Parece que necesito usar quaternions, pero no sé cómo controlar cada eje individual, ya que quaternions usa una dirección y un ángulo. ¿Debo crear tres cuaterniones y multiplicarlos? ¿No terminaría con los mismos problemas?

Lo extraño es que si uso mi dedo para representar los tres ejes de mi helicóptero (pulgar arriba = y, índice = z, medio = x), parece que no me encuentro con esos problemas. ¿Por qué?


Si tiene acceso a un gráfico de escena, una alternativa viable sería tener contenedores anidados para cada eje que luego rotaría individualmente.
bummzack

@bummzack, sí, he pensado en esto. Sin embargo, ¿no es lo mismo que concatenar tres matrices de rotación en un orden particular?
subb

Tienes razón @Subb, trata de no almacenar rotaciones para cada eje por separado, tendrá los mismos problemas que Euler Angles, no importa lo que uses para eso, también Matrices y Quaternions sufrirán Gimbal Lock.
Maik Semder

@Maik Semder, entonces, ¿cómo puedo proporcionar control al cabeceo / guiñada / balanceo de mi helicóptero?
subb

@Subb @ Flip y mi respuesta básicamente te dijo cómo hacerlo.
Maik Semder

Respuestas:


4

Debería poder utilizar una matriz o un cuaternión para almacenar la orientación actual de su helicóptero. El problema con el que se encuentra es cómo aplica el cambio de cabeceo / guiñada / balanceo al helicóptero.

Creo que quieres aplicar pitch / yaw / roll al helicóptero en el espacio local en cada cuadro. Puede hacer esto tomando el cambio de cabeceo / guiñada / balanceo para ese cuadro y construyendo una matriz de rotación (puede hacerlo con ángulos de Euler). Luego gira la orientación anterior del helicóptero por esta matriz (con la orientación anterior representada como una matriz o como un cuaternión). Le dará la orientación para el nuevo marco.

Representar la orientación del helicóptero como un cuaternión tiene la ventaja de que interpolar entre cuaterniones es mucho más fácil que interpolar entre matrices. Entonces, si en el futuro tiene una orientación actual y desea averiguar la rotación por cuadro que lo llevará a una nueva orientación en el momento deseado, la representación del cuaternión puede ser más amigable para usted.


Así es como lo hice, aplicar actualizaciones incrementales a la matriz que representa la transformación local -> mundial. Recuerde normalizar la matriz, después de unos pocos cientos de cuadros mostrará artefactos de redondeo si no lo hace.
Patrick Hughes

Además, para responder a la pregunta final de por qué el problema del bloqueo del cardán no se ve usando su mano para representar los ejes x / y / z, es porque probablemente esté aplicando los valores de cabeceo, guiñada y balanceo al marco local de la mano. referencia. La construcción de una matriz de rotación con ángulos de Euler comienza girando alrededor de la x del mundo, luego por la y resultante y luego por la z resultante (el orden real de x / y / z puede diferir en orden). Intente aplicar las rotaciones de esta manera y puede comenzar a ver cómo aparece el bloqueo del cardán.
Flip

3

Básicamente, puede usar cualquier otra representación de rotaciones, pero Euler Angles. Matrices, Quaternions, incluso Axis Angles, harán lo que quieras.

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

Tienes razón, terminarías con los mismos problemas. La clave es almacenar la orientación actual (matriz, cuaternión) de su objeto y aplicar solo un delta al cambiar la orientación.

Cuando desee girar 10 grados alrededor de y, simplemente cree una matriz / cuaternión delta para eso y multiplíquelo con su orientación actual (si usa la multiplicación posterior para las matrices). Si lo multiplica al revés, rotará el sistema alrededor del eje y del mundo en lugar de alrededor del eje y del objeto.

Este recurso me parece muy útil, también viene con código fuente y explica muy bien la teoría.


-1

El problema que creo que podrías estar viendo es una diferencia en la rotación del eje y los vectores de velocidad (y también que te falta una dirección). Cuando un helicóptero se inclina hacia adelante para avanzar, la propulsión de las palas del helicóptero empuja el aire hacia abajo y hacia atrás en un ángulo perpendicular a lo que ha denominado el eje X.

Tienes un cuarto grado de libertad que te has perdido: la velocidad de las palas controla el volumen de aire que se empuja, lo que también controla la cantidad de elevación que genera el helicóptero.

Pero aun así, su "inclinación hacia la izquierda y hacia la derecha" e "inclinación hacia arriba y hacia abajo" generalmente controlan el helicóptero en un avión determinado. Es decir, un helicóptero no debería volar hacia abajo cuando se inclina hacia adelante, hacia atrás o hacia un lado, pero la cantidad de elevación podría tener que cambiar y la velocidad será controlada por el lado "opuesto" del triángulo rectángulo formado por conectando el helicóptero al suelo con una línea recta hacia abajo (gravedad) y la hipotenusa (elevación). Eso debería dar su vector de velocidad para usar.

Debería poder usar quaternions para hacer esto, pero no base sus valores de quaternion en la inclinación del helicóptero en sí mismo; intente usar las fuerzas de movimiento que genera el helicóptero.


Sin embargo, eso realmente no responde la pregunta. Solo agrego más comida para pensar.
bummzack

Actualmente, estoy usando la rotación del helicóptero para transformar el vector de fuerza de elevación, que apunta hacia arriba en el espacio del helicóptero. ¿Quiere decir que debería hacer lo contrario, es decir, modificar el vector directamente y luego rotar el helicóptero en consecuencia?
subb

Creo que deberías hacer ambas cosas, lo que estás haciendo ahora, y luego hacer cualquier RESULTADO en la rotación del helicóptero según la normalidad de las palas. Es decir, tienes 2 rotaciones; uno aplicado a las palas y un segundo que representa la rotación real del helicóptero. Obviamente todo almacenado en Quaternions.
deceleratedcaviar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.