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é?
Respuestas:
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.
fuente
Básicamente, puede usar cualquier otra representación de rotaciones, pero Euler Angles. Matrices, Quaternions, incluso Axis Angles, harán lo que quieras.
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.
fuente
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.
fuente