Disponible sobre cuaterniones y sus beneficios.


De un traductor: exactamente hace 175 años y 3 días se inventaron los cuaterniones. En honor a esta fecha redonda, decidí recoger material que explique este concepto en un lenguaje claro.

El concepto de cuaterniones fue inventado por el matemático irlandés Sir William Rowan Hamilton el lunes 16 de octubre de 1843 en Dublín, Irlanda. Hamilton y su esposa fueron a la Real Academia Irlandesa , y cruzando el Canal Real sobre el Puente Broome , hizo un descubrimiento sorprendente, que inmediatamente rascó en la piedra del puente.

i 2 = j 2 = k 2 = i j k = - 1




Una placa conmemorativa en el Puente Broome sobre el Canal Real en honor al descubrimiento de la fórmula fundamental para la multiplicación de los cuaterniones.

En este artículo, intentaré explicar el concepto de cuaterniones de una manera fácil de entender. Explicaré cómo puede visualizar un quaternion y también hablaré sobre las diferentes operaciones que se pueden realizar con quaternions. Además, compararé el uso de matrices, ángulos de Euler y cuaterniones, y luego trataré de explicar cuándo usar cuaterniones en lugar de ángulos o matrices de Euler, y cuándo no es necesario.

Contenido


  • 1. Introducción
  • 2. Números complejos
    • 2.1. Suma y resta de números complejos
    • 2.2. Multiplicación de un número complejo por un valor escalar
    • 2.3. El producto de los números complejos.
    • 2.4. El cuadrado de los números complejos.
    • 2.5. Conjugar números complejos
    • 2.6. El valor absoluto del número complejo.
    • 2.7. Cociente de dos números complejos
  • 3. Grados yo
  • 4. Plano complejo
    • 4.1. Rotores
  • 5. Cuaterniones
    • 5.1. Cuaterniones como un par ordenado
    • 5.2. Suma y resta de cuaterniones
    • 5.3. Producto Quaternion
    • 5.4. Quaternion real
    • 5.5. Multiplicación escalar del cuaternión
    • 5.6. Cuaterniones puros
    • 5.7. Forma de cuaternión aditiva
    • 5.8 Quaternion individual
    • 5.9. Forma binaria Quaternion
    • 5.10. Cuaterniones conjugados
    • 5.11. Tasa de cuaternión
    • 5.12 Normalización de cuaterniones
    • 5.13. Cuaternión inverso
    • 5.14. Producto escalar Quaternion
  • 6. vueltas
  • 7. Interpolación de cuaterniones.
    • 7.1. SLERP
      • 7.1.1 Diferencia Cuaternion
      • 7.1.2. Elevar un cuaternión a un poder
      • 7.1.3. Diferencia fraccional de cuaterniones
      • 7.1.4. Factores a considerar
    • 7.2. Escuadrón
  • 8. Conclusión
  • 9. Descargar demo
  • 10. Referencias

No es posible comprender completamente los cuaterniones en 45 minutos.

Este artículo tiene muchas matemáticas, por lo que no es para débiles.

Introduccion


En gráficos de computadora, las matrices se usan para describir la posición en el espacio (desplazamiento), así como la orientación en el espacio (rotación). También puede usar una matriz de transformación única para describir la escala del objeto. Esta matriz puede considerarse un "espacio base". Si multiplicamos un vector o un punto (o incluso otra matriz) por una matriz de transformaciones, entonces "transformamos" este vector, un punto o una matriz en el espacio representado por esta matriz.

En este artículo no hablaré en detalle sobre las matrices de transformación. Los detalles sobre las matrices de transformación se pueden encontrar en mi artículo Matrices .

En este artículo quiero hablar sobre una forma alternativa de describir la orientación de un objeto (rotación) en el espacio usando cuaterniones.

Números complejos


Para comprender completamente los cuaterniones, primero debemos entender de dónde provienen. El principio de cuaternión se basa en el concepto de un sistema numérico complejo.

Junto con los conjuntos de números conocidos ( naturales , enteros , reales y racionales ), el sistema de números complejos agrega un nuevo conjunto de números, llamados números imaginarios. Se inventaron números imaginarios para resolver ciertas ecuaciones que no tenían soluciones, por ejemplo:

x 2 + 1 = 0


Para resolver esta expresión, debemos declarar que x 2 = - 1 , y esto, como saben, es imposible, porque el cuadrado de cualquier número (positivo o negativo) siempre es positivo.

Los matemáticos no pudieron aceptar el hecho de que la expresión no tiene solución, por lo que se inventó un nuevo concepto: un número imaginario que puede usarse para resolver tales ecuaciones.

El número imaginario es el siguiente:

i 2 = - 1


No intente comprender esta suposición, porque no hay razones lógicas para su existencia. Solo necesitamos aceptar eso yo - es solo una cierta cantidad cuyo cuadrado es - 1 .

El conjunto de números imaginarios se puede denotar como  m a t h b b I .

El conjunto de números complejos (denotado por  m a t h b b C Es la suma de los números reales e imaginarios en la siguiente forma:

z=a+bi  a,b in mathbbR,  i2=1


También se puede afirmar que todos los números reales son complejos con b=0 , y todos los números imaginarios son complejos con a=0 .

Suma y resta de números complejos


Los números complejos se pueden sumar y restar sumando y restando las partes reales e imaginarias.

Adición:

(a1+b1i)+(a2+b2i)=(a1+a2)+(b1+b2)i


Resta:

(a1+b1i)(a2+b2i)=(a1a2)+(b1b2)i


Multiplicación de un número complejo por un valor escalar


El número complejo se multiplica por un escalar multiplicando cada miembro del número complejo por un escalar:

 lambda(a+bi)= lambdaa+ lambdabi


El producto de los números complejos.


Además, los números complejos también se pueden multiplicar usando reglas algebraicas ordinarias.

\ begin {array} {rcl} z_1 & = & (a_1 + b_1i) \\ z_2 & = & (a_2 + b_2i) \\ z_1z_2 & = & (a_1 + b_1i) (a_2 + b_2i) \\ & = & a_1a_2 + a_1b_2i + b_1a_2i + b_1b_2i ^ 2 \\ & = & (a_1a_2-b_1b_2) + (a_1b_2 + b_1a_2) i \ end {array}


El cuadrado de los números complejos.


Además, un número complejo puede ser cuadrado multiplicando por sí mismo:

\ begin {array} {rcl} z & = & (a + bi) \\ z ^ 2 & = & (a + bi) (a + bi) \\ & = & (a ^ 2-b ^ 2) + 2abi \ end {array}


Conjugar números complejos


El valor conjugado de un número complejo es un número complejo con un signo cambiado de la parte imaginaria, denotado como  barz o como z .

\ begin {array} {rcl} z & = & (a + bi) \\ z ^ * & = & (a-bi) \ end {array}


La multiplicación de un número complejo con su valor conjugado da un resultado interesante.

\ begin {array} {rcl} z & = & (a + bi) \\ z ^ * & = & (a-bi) \\ zz ^ * & = & (a + bi) (a-bi) \ \ & = & a ^ 2-abi + abi + b ^ 2 \\ & = & a ^ 2 + b ^ 2 \ end {array}


El valor absoluto del número complejo.


Podemos usar el número conjugado de un número complejo para calcular el valor absoluto (o norma , o magnitud ) de un número complejo. El valor absoluto de un número complejo es la raíz cuadrada de un número complejo multiplicado por su conjugado . Se denota como |z| :

\ begin {array} {rcl} z & = & (a + bi) \\ | z | & = & \ sqrt {zz ^ *} \\ & = & \ sqrt {(a + bi) (a-bi)} \\ & = & \ sqrt {a ^ 2 + b ^ 2} \ end {array} $


Cociente de dos números complejos


Para calcular el cociente de dos números complejos, multiplicamos el numerador y el denominador por el número conjugado del denominador.

\ begin {array} {rcl} z_1 & = & (a_1 + b_1i) \\ z_2 & = & (a_2 + b_2i) \\ \ cfrac {z_1} {z_2} & = & \ cfrac {a_1 + b_1i} { a_2 + b_2i} \\ & = & \ cfrac {(a_1 + b_1i) (a_2-b_2i)} {(a_2 + b_2i) (a_2-b_2i)} \\ & = & \ cfrac {a_1a_2-a_1b_2i + b_1a_2i-bi ^ 2} {a_2 ^ 2 + b_2 ^ 2} \\ & = & \ cfrac {a_1a_2 + b_1b_2} {a_2 ^ 2 + b_2 ^ 2} + \ cfrac {b_1a_2-a_1b_2} {a_2 ^ 2 + b_2 ^ 2} i \ end {array}


Grados i


Si afirmamos que i2=1 entonces debería existir la posibilidad de erigir i y a otros grados.

\ begin {array} {rrrrrrr} i ^ 0 & = & & & & & & & 1 \\ i ^ 1 & = & & & & & i i \\ i ^ 2 & = & & & & & & -1 \\ i ^ 3 & = & ii ^ 2 & = & & & -i \\ i ^ 4 & = & i ^ {2} i ^ {2} & = & & & 1 \\ i ^ 5 & = & ii ^ 4 & = & & & i \\ i ^ 6 & = & ii ^ 5 & = & i ^ 2 & = & -1 \ end {array}


Si continuamos grabando esta serie, notamos un patrón (1,i,1,i,1, puntos) .

Un patrón similar surge con un aumento en los grados negativos.

\ begin {array} {rcr} i ^ 0 & = & 1 \\ i ^ {- 1} & = & -i \\ i ^ {- 2} & = & -1 \\ i ^ {- 3} & = & i \\ i ^ {- 4} & = & 1 \\ i ^ {- 5} & = & -i \\ i ^ {- 6} & = & -1 \ end {array}


Quizás ya hayas visto ese patrón en matemáticas, pero en la forma (x,y,x,y,x, puntos) , que se obtiene girando el punto 90 ° en sentido antihorario en un plano cartesiano bidimensional; remar (x,y,x,y,x, puntos) creado girando el punto 90 ° grados en un plano cartesiano bidimensional.


Plano cartesiano

Plano complejo


De manera similar, podemos aplicar números complejos a una cuadrícula bidimensional, llamada plano complejo , que une la parte real al eje horizontal y lo imaginario a la vertical.


Plano complejo

Como puede ver en la fila anterior, podemos decir que si multiplicamos el número complejo por i , entonces podemos rotar el número complejo en el plano complejo en incrementos de 90 °.

Vamos a ver si esto es cierto. Tomamos un punto arbitrario en el plano complejo p :

p=2+i


y multiplícalo por i habiendo recibido q :

\ begin {array} {rcl} p & = & 2 + i \\ q & = & pi \\ & = & (2 + i) i \\ & = & 2i + i ^ 2 \\ & = & - 1 + 2i \ end {array}


Multiplicando q en i tenemos r :

\ begin {array} {rcl} q & = & -1 + 2i \\ r & = & qi \\ & = & (-1 + 2i) i \\ & = & -i + 2i ^ 2 \\ & = & -2-i \ end {array}


Y multiplicando r en i tenemos s :

\ begin {array} {rcl} r & = & -2-i \\ s & = & ri \\ & = & (-2-i) i \\ & = & -2i-i ^ 2 \\ & = & 1-2i \ end {array}


Y multiplicando s en i tenemos t :

\ begin {array} {rcl} s & = & 1-2i \\ t & = & si \\ & = & (1-2i) i \\ & = & i-2i ^ 2 \\ & = & 2 + i \ end {array}


Y obtuvimos exactamente con lo que comenzamos ( p ) Si ponemos estos números complejos en el plano complejo, obtenemos el siguiente resultado.


Números complejos en el plano complejo.

Ahora podemos rotar en el plano complejo y en sentido horario, multiplicando el número complejo por i .

Rotores


También podemos realizar giros arbitrarios en el plano complejo, configurando el número complejo de la siguiente forma:

q= cos theta+i sin theta


Al multiplicar cualquier número complejo por el rotor q obtenemos la fórmula general:

\ begin {array} {rcl} p & = & a + bi \\ q & = & \ cos \ theta + i \ sin \ theta \\ pq & = & (a + bi) (\ cos \ theta + i \ sin \ theta) \\ a ^ {\ prime} + b ^ {\ prime} i & = & a \ cos \ theta-b \ sin \ theta + (a \ sin \ theta + b \ cos \ theta) i \ end {array}


Lo que también se puede escribir en forma de matriz:

\ begin {bmatrix} a ^ {\ prime} & -b ^ {\ prime} \\ b ^ {\ prime} & a ^ {\ prime} \ end {bmatrix} = \ begin {bmatrix} \ cos \ theta & - \ sin \ theta \\ \ sin \ theta & \ cos \ theta \ end {bmatrix} \ begin {bmatrix} a & -b \\ b & a \ end {bmatrix}


¿Cuál es una forma de girar en sentido antihorario un punto arbitrario en el plano complejo en relación con el origen?

Cuaterniones


Habiendo aprendido sobre el sistema de números complejos y el plano complejo, podemos llevarlos al espacio tridimensional, agregando al sistema de números junto con i Dos números más imaginarios.

Los cuaterniones tienen la siguiente forma generalizada

q=s+xi+yj+zk  s,x,y,z in mathbbR


Donde según la famosa expresión de Hamilton:

i2=j2=k2=ijk=1



\ begin {array} {ccc} ij = k & jk = i & ki = j \\ ji = -k & kj = -i & ik = -j \ end {array}


Puede notar que la relación entre i , j y k muy similar a las reglas de multiplicación de vectores de vectores cartesianos unitarios:

\ begin {array} {ccc} \ mathbf {x} \ times \ mathbf {y} = \ mathbf {z} & \ mathbf {y} \ times \ mathbf {z} = \ mathbf {x} & \ mathbf { z} \ times \ mathbf {x} = \ mathbf {y} \\ \ mathbf {y} \ times \ mathbf {x} = - \ mathbf {z} & \ mathbf {z} \ times \ mathbf {y} = - \ mathbf {x} & \ mathbf {x} \ times \ mathbf {z} = - \ mathbf {y} \ end {array}


Hamilton también notó que los números imaginarios i , j y k se puede usar para representar tres vectores unitarios cartesianos  mathbfi ,  mathbfj y  mathbfk con las mismas propiedades de los números imaginarios, entonces  mathbfi2= mathbfj2= mathbfk2=1 .


Representación gráfica de propiedades.  mathbfij ,  mathbfjk ,  mathbfki

La imagen de arriba muestra gráficamente la relación entre los vectores unitarios cartesianos en la forma  mathbfi ,  mathbfj y  mathbfk .

Cuaterniones como un par ordenado


También podemos representar cuaterniones como un par ordenado:

q=[s, mathbfv]  s in mathbbR, mathbfv in mathbbR3


Donde  mathbfv También se puede representar como sus componentes individuales:

q=[s,x mathbfi+y mathbfj+z mathbfk]  s,x,y,z in mathbbR


Con esta entrada, podemos representar más fácilmente las características comunes de los cuaterniones y los números complejos.

Suma y resta de cuaterniones


Los cuaterniones se pueden sumar y restar de manera similar a los números complejos:

\ begin {array} {rcl} q_a & = & [s_a, \ mathbf {a}] \\ q_b & = & [s_b, \ mathbf {b}] \\ q_a + q_b & = & [s_a + s_b, \ mathbf {a} + \ mathbf {b}] \\ q_a-q_b & = & [s_a-s_b, \ mathbf {a} - \ mathbf {b}] \ end {array}


Obras de Quaternion


También podemos expresar el producto de dos cuaterniones:

\ begin {array} {rcl} q_a & = & [s_a, \ mathbf {a}] \\ q_b & = & [s_b, \ mathbf {b}] \\ q_ {a} q_ {b} & = & [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] \\ & = & (s_ {a} + x_ {a} i + y_ {a} j + z_ {a } k) (s_ {b} + x_ {b} i + y_ {b} j + z_ {b} k) \\ & = & (s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}) \\ & & + (s_ {a} x_ {b} + s_ {b} x {a} + y_ {a} z_ {b } -y_ {b} z_ {a}) i \\ & & + (s_ {a} y_ {b} + s_ {b} y_ {a} + z_ {a} x_ {b} -z_ {b} x_ {a}) j \\ & & + (s_ {a} z_ {b} + s_ {b} z_ {a} + x_ {a} y_ {b} -x_ {b} y_ {a}) k \ end {array}


Lo que nos da otro cuaternión. Si reemplazamos los números imaginarios en la expresión anterior i , j y k pares ordenados (también conocidos como unidades de cuaternión), luego obtenemos

i=[0, mathbfi] j=[0, mathbfj] k=[0, mathbfk]


Y sustituyendo nuevamente en la expresión original con [1, mathbf0]=1 obtenemos:

\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & (s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}) [1, \ mathbf {0}] \\ & & + (s_ {a} x_ {b} + s_ {b } x {a} + y_ {a} z_ {b} -y_ {b} z_ {a}) [0, \ mathbf {i}] \\ & & + (s_ {a} y_ {b} + s_ { b} y_ {a} + z_ {a} x_ {b} -z_ {b} x_ {a}) [0, \ mathbf {j}] \\ & & + (s_ {a} z_ {b} + s_ {b} z_ {a} + x_ {a} y_ {b} -x_ {b} y_ {a}) [0, \ mathbf {k}] \ end {array}


Al expandir esta expresión en la suma de pares ordenados, obtenemos:

\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & [s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}, \ mathbf {0}] \\ & & + [0, (s_ {a} x_ {b} + s_ {b } x {a} + y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i}] \\ & & + [0, (s_ {a} y_ {b} + s_ { b} y_ {a} + z_ {a} x_ {b} -z_ {b} x_ {a}) \ mathbf {j}] \\ & & + [0, (s_ {a} z_ {b} + s_ {b} z_ {a} + x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k}] \ end {array}


Si multiplicamos por una unidad cuaterniónica y extraemos los componentes del vector común, entonces podemos reescribir esta ecuación de la siguiente manera:

\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & [s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}, \ mathbf {0}] \\ & & + [0, s_ {a} (x_ {b} \ mathbf {i } + y_ {b} \ mathbf {j} + z_ {b} \ mathbf {k}) + s_ {b} (x_ {a} \ mathbf {i} + y_ {a} \ mathbf {j} + z_ { a} \ mathbf {k}) \\ & & (y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i} + (z_ {a} x_ {b} -z_ { b} x_ {a}) \ mathbf {j} + (x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k}] \ end {array}


Esta ecuación nos da la suma de dos pares ordenados. El primer par ordenado es el cuaternión material , y el segundo es el cuaternión puro . Estos dos pares ordenados se pueden combinar en un par ordenado:

\ begin {array} {rcl} [s_ {a}, \ mathbf {a}] [s_ {b}, \ mathbf {b}] & = & [s_ {a} s_ {b} -x_ {a} x_ {b} -y_ {a} y_ {b} -z_ {a} z_ {b}, \\ & & s_ {a} (x_ {b} \ mathbf {i} + y_ {b} \ mathbf {j } + z_ {b} \ mathbf {k}) + s_ {b} (x_ {a} \ mathbf {i} + y_ {a} \ mathbf {j} + z_ {a} \ mathbf {k}) \\ & & + (y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i} + (z_ {a} x_ {b} -z_ {b} x_ {a}) \ mathbf { j} + (x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k}] \ end {array}


Si sustituimos, entonces obtenemos

\ begin {array} {rcl} \ mathbf {a} & = & x_ {a} \ mathbf {i} + y_ {a} \ mathbf {j} + z_ {a} \ mathbf {k} \\ \ mathbf {b} & = & x_ {b} \ mathbf {i} + y_ {b} \ mathbf {j} + z_ {b} \ mathbf {k} \\ \ mathbf {a} \ cdot \ mathbf {b} & = & x_ {a} x_ {b} + y_ {a} y_ {b} + z_ {a} z_ {b} \\ \ mathbf {a} \ times \ mathbf {b} & = & (y_ {a} z_ {b} -y_ {b} z_ {a}) \ mathbf {i} + (z_ {a} x_ {b} -z_ {b} x_ {a}) \ mathbf {j} + (x_ {a} y_ {b} -x_ {b} y_ {a}) \ mathbf {k} \ end {array}


Obtenemos:

[sa, mathbfa][sb, mathbfb]=[sasb mathbfa cdot mathbfb,sa mathbfb+sb mathbfa+ mathbfa times mathbfb]


Esta es la ecuación general para el producto de los cuaterniones.

Quaternion real


Un quaternion real es un quaternion en el que un vector  mathbf0 :

q=[s, mathbf0]


Y el producto de dos cuaterniones materiales es otro cuaternión material :

\ begin {array} {rcl} q_a & = & [s_a, \ mathbf {0}] \\ q_b & = & [s_b, \ mathbf {0}] \\ q_ {a} q_ {b} & = & [s_a, \ mathbf {0}] [s_b, \ mathbf {0}] \\ & = & [s_ {a} s_ {b}, \ mathbf {0}] \ end {array}


Que es similar al producto de dos números complejos que contienen el término imaginario cero.

\ begin {array} {rcl} z_1 & = & a_1 + 0i \\ z_2 & = & a_2 + 0i \\ z_ {1} z_ {2} & = & (a_1 + 0i) (a_2 + 0i) \\ & = & a_ {1} a_ {2} \ end {array}


Multiplicación escalar del cuaternión


También podemos multiplicar el cuaternión por un escalar, al mismo tiempo que seguimos la siguiente regla:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ \ lambda {q} & = & \ lambda [s, \ mathbf {v}] \\ & = & [\ lambda {s}, \ lambda \ mathbf {v}] \ end {array}


Podemos verificar esto usando el producto de cuaterniones reales que se muestra arriba multiplicando el cuaternión por un escalar como el cuaternión real :

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ \ lambda & = & [\ lambda, \ mathbf {0}] \\ \ lambda {q} & = & [ \ lambda, \ mathbf {0}] [s, \ mathbf {v}] \\ & = & [\ lambda {s}, \ lambda \ mathbf {v}] \ end {array}


Cuaterniones puros


Además de los cuaterniones materiales , Hamilton también definió el cuaternión puro como un cuaternión con un término escalar cero:

q=[0, mathbfv]


O si escribe los componentes:

q=xi+yj+zk


Y nuevamente podemos tomar el producto de dos cuaterniones puros :

\ begin {array} {rcl} q_a & = & [0, \ mathbf {a}] \\ q_b & = & [0, \ mathbf {b}] \\ q_ {a} q_ {b} & = & [0, \ mathbf {a}] [0, \ mathbf {b}] \\ & = & [- \ mathbf {a} \ cdot \ mathbf {b}, \ mathbf {a} \ times \ mathbf {b} ] \ end {array}


de acuerdo con la regla del producto cuaternión presentada anteriormente.

Forma de cuaternión aditiva


Además, podemos expresar los cuaterniones como la suma de las partes reales y puras del cuaternión:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + [0, \ mathbf {v}] \ end {array }


Quaternion individual


Tomando un vector arbitrario  mathbfv , este vector se puede expresar tanto en términos de su valor escalar como en su dirección de la siguiente manera:

 mathbfv=v mathbf hatv  textwhere v=| mathbfv|  texty | mathbf hatv|=1


Combinando esta definición con la definición de cuaternión puro, obtenemos:

\ begin {array} {rcl} q & = & [0, \ mathbf {v}] \\ & = & [0, v \ mathbf {\ hat {v}}] \\ & = & v [0, \ mathbf {\ hat {v}}] \ end {array}


También podemos describir una unidad de cuaternión que tiene un escalar cero y un vector unitario:

 hatq=[0, mathbf hatv]


Forma binaria Quaternion


Ahora podemos combinar las definiciones de un solo cuaternión y la forma aditiva de un cuaternión, obteniendo una forma de cuaterniones similar a la notación utilizada en la descripción de números complejos:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + [0, \ mathbf {v}] \\ & = & [s, \ mathbf {0}] + v [0, \ mathbf {\ hat {v}}] \\ & = & s + v \ hat {q} \ end {array}


Lo que nos da una forma de representar un cuaternión en una forma muy similar a los números complejos:

\ begin {array} {rcl} z & = & a + bi \\ q & = & s + v \ hat {q} \ end {array}


El número conjugado de un cuaternión.


El número conjugado del cuaternión se puede calcular tomando la parte del vector del cuaternión opuesto en el signo:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ q ^ * & = & [s, - \ mathbf {v}] \ end {array}


El producto del cuaternión y su número conjugado nos da lo siguiente:

\ begin {array} {rcl} qq ^ * & = & [s, \ mathbf {v}] [s, - \ mathbf {v}] \\ & = & [s ^ 2- \ mathbf {v} \ cdot- \ mathbf {v}, - s \ mathbf {v} + s \ mathbf {v} + \ mathbf {v} \ times- \ mathbf {v}] \\ & = & [s ^ 2 + \ mathbf { v} \ cdot \ mathbf {v}, \ mathbf {0}] \\ & = & [s ^ 2 + v ^ 2, \ mathbf {0}] \ end {array}


Norma del cuaternión


Recordemos la definición de la norma de un número complejo:

\ begin {array} {rcl} | z | & = & \ sqrt {a ^ 2 + b ^ 2} \\ zz ^ * & = & | z | ^ 2 \ end {array}


Del mismo modo, la norma (o magnitud) de un cuaternión se define como:

\ begin {array} {rcl} q & = & [s, \ mathbf {v}] \\ | q | & = & \ sqrt {s ^ 2 + v ^ 2} \ end {array}


Lo que nos permite expresar la norma del cuaternión de la siguiente manera:

qq=|q|2


Normalización de cuaterniones


Teniendo una definición de la norma del cuaternión, podemos usarla para normalizar el cuaternión. Quaternion se normaliza dividiendo por |q| :

q prime= fracq sqrts2+v2


Por ejemplo, normalicemos el cuaternión:

q=[1,4 mathbfi+4 mathbfj4 mathbfk]


Primero necesitamos calcular la tasa de cuaterniones:

\ begin {array} {rcl} | q | & = & \ sqrt {1 ^ 2 + 4 ^ 2 + 4 ^ 2 + (- 4) ^ 2} \\ & = & \ sqrt {49} \\ & = & 7 \ end {array}


Luego debemos dividir el quaternion por la norma del quaternion para calcular el quaternion normalizado:

\ begin {array} {rcl} q ^ {\ prime} & = & \ cfrac {q} {| q |} \\ [1.0em] & = & \ cfrac {(1 + 4 \ mathbf {i} + 4 \ mathbf {j} -4 \ mathbf {k})} {7} \\ [1.0em] & = & \ cfrac {1} {7} + \ cfrac {4} {7} \ mathbf {i} + \ cfrac {4} {7} \ mathbf {j} - \ cfrac {4} {7} \ mathbf {k} \ end {array}


Cuaternión inverso


El cuaternión inverso se denota como q1 . Para calcular el cuaternión inverso, tomamos el número conjugado del cuaternión y lo dividimos por el cuadrado de la norma:

q1= fracq|q|2


Para mostrar esto, podemos usar la definición inversa:

qq1=[1, mathbf0]=1


Y multiplique ambos lados por el número conjugado del cuaternión, lo que nos dará:

qqq1=q


Por sustitución obtenemos:

\ begin {array} {rcl} | q | ^ {2} q ^ {- 1} & = & q ^ {*} \\ q ^ {- 1} & = & \ cfrac {q ^ {*}} {| q | ^ {2}} \ end {array}


Para las normas de cuaternión simple cuya norma es 1, podemos escribir:

q1=q


Producto escalar Quaternion


De manera similar al producto escalar de vectores, podemos calcular el producto escalar de dos cuaterniones multiplicando las partes escalares correspondientes y sumando los resultados:

\ begin {array} {rcl} q_1 & = & [s_1, x_1 \ mathbf {i} + y_1 \ mathbf {j} + z_1 \ mathbf {k}] \\ q_2 & = & [s_2, x_2 \ mathbf { i} + y_2 \ mathbf {j} + z_2 \ mathbf {k}] \\ q_1 {\ cdot} q_2 & = & s_ {1} s_ {2} + x_ {1} x_ {2} + y_ {1} y_ {2} + z_ {1} z_ {2} \ end {array}


También podemos usar el producto escalar de cuaterniones para calcular la diferencia angular entre cuaterniones:

 cos theta= fracs1s2+x1x2+y1y2+z1z2|q1||q2|


Para las normas cuaterniones individuales, podemos simplificar la ecuación:

 cos theta=s1s2+x1x2+y1y2+z1z2


Vueltas


Permítame recordarle que hemos identificado una forma especial de un número complejo llamado rotor , que puede usarse para rotar un punto en un plano bidimensional de la siguiente manera:

q= cos theta+i sin theta


Debido a la similitud de los números complejos con los cuaterniones, debería ser posible expresar un cuaternión que pueda usarse para rotar un punto en un espacio tridimensional:

q=[ cos theta, sin theta mathbfv]


Verifiquemos si esta teoría es cierta calculando el producto quaternion q y vector  mathbfp . Primero, podemos expresar  mathbfp como cuaternión puro de la siguiente manera:

p=[0, mathbfp]


Un q Es una norma de cuaternión simple en la forma:

q=[s, lambda mathbf hatv]


Entonces

\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & [s, \ lambda \ mathbf {\ hat {v}}] [0, \ mathbf {p}] \\ & = & [- \ lambda \ mathbf {\ hat {v}} \ cdot \ mathbf {p}, s \ mathbf {p} + \ lambda \ mathbf {\ hat {v}} \ times \ mathbf {p}] \ end {array}


Vemos que el resultado es un cuaternión común con partes escalares y vectoriales.

Veamos primero un caso "especial" en el que  mathbfp perpendicular  mathbf hatv . En este caso, el miembro del producto escalar  lambda mathbf hatv cdot mathbfp=0 y el resultado se convierte en puro cuaternión:

p prime=[0,s mathbfp+ lambda mathbf hatv times mathbfp]


En este caso, a su vez  mathbfp con respecto  mathbf hatv solo sustituimos s= cos theta y  lambda= sin theta .

p prime=[0, cos theta mathbfp+ sin theta mathbf hatv times mathbfp]


Por ejemplo, rotemos el vector  mathbfp 45 ° con respecto al eje Z; entonces nuestro cuaternión q será igual a:

\ begin {array} {rcl} q & = & [\ cos \ theta, \ sin \ theta \ mathbf {k}] \\ & = & \ left [\ frac {\ sqrt {2}} {2}, \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right] \ end {array}


Y tomemos un vector  mathbfp que se relaciona con un caso especial donde  mathbfp perpendicular  mathbfk :

p=[0.2 mathbfi]


Ahora busquemos una pieza

qp

:

\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & \ left [\ frac {\ sqrt {2}} {2}, \ frac {\ sqrt {2}} { 2} \ mathbf {k} \ right] [0.2 \ mathbf {i}] \\ & = & \ left [0.2 \ frac {\ sqrt {2}} {2} \ mathbf {i} +2 \ frac {\ sqrt {2}} {2} \ mathbf {k} \ times \ mathbf {i} \ right] \\ & = & [0, \ sqrt {2} \ mathbf {i} + \ sqrt {2 } \ mathbf {j}] \ end {array}


Lo que nos da un cuaternión limpio girado 45 ° alrededor del eje  mathbfk . También podemos asegurarnos de que se conserva el valor del vector final:

\ begin {array} {rcl} | \ mathbf {p} ^ {\ prime} | & = & \ sqrt {\ sqrt {2} ^ {2} + \ sqrt {2} ^ {2}} \\ & = & 2 \ end {array}


¡Exactamente lo que esperábamos!

Podemos mostrar esto gráficamente con la siguiente imagen:


Girar Quaternion (1)

Ahora veamos un cuaternión no ortogonal a  mathbfp . Si tomamos para la parte del vector del cuaternión un desplazamiento de 45 ° de  mathbfp entonces obtenemos:

\ begin {array} {rcl} \ mathbf {\ hat {v}} & = & \ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2 } \ mathbf {k} \\ \ mathbf {p} & = & 2 \ mathbf {i} \\ q & = & [\ cos \ theta, \ sin \ theta \ mathbf {\ hat {v}}] \\ p & = & [0, \ mathbf {p}] \ end {array}


Y multiplicando nuestro vector  mathbfp en q obtenemos:

\ begin {array} {rcl} p ^ {\ prime} & = & qp \\ & = & [\ cos \ theta, sin \ theta \ mathbf {\ hat {v}}] [0, \ mathbf {p }] \\ & = & [- \ sin \ theta \ mathbf {\ hat {v}} \ cdot \ mathbf {p}, \ cos \ theta \ mathbf {p} + \ sin \ theta \ mathbf {\ hat { v}} \ times \ mathbf {p}] \ end {array}


Después de la sustitución  mathbf hatv ,  mathbfp y  theta=45 circ obtenemos:

\ begin {array} {rcl} p ^ {\ prime} & = & \ left [- \ frac {\ sqrt {2}} {2} \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ cdot (2 \ mathbf {i}), \ frac {\ sqrt {2}} {2} 2 \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ times2 \ mathbf {i} \ right] \\ & = & [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j}] \ end {array}


Es decir, ya no es un cuaternión puro , no gira 45 ° y la norma del vector ya no es igual a 2 (disminuyó a  sqrt3 )

Este resultado se puede mostrar gráficamente.


Turno de cuaternión (2)

Estrictamente hablando, es incorrecto representar un cuaternión p prime en el espacio tridimensional, porque de hecho es un vector tetradimensional! Por simplicidad, mostraré solo el componente vectorial de los cuaterniones.

Sin embargo, no todo está perdido. Hamilton descubrió (pero no publicó esto) que si luego multiplicamos el resultado qp al valor opuesto q , entonces el resultado será puro cuaternión, y se preservará la norma del componente vectorial. Veamos si esto se puede aplicar en nuestro ejemplo.

Primero, calculemos q1 :

\ begin {array} {rcl} q & = & \ left [\ cos \ theta, \ sin \ theta \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ right] \\ q ^ {- 1} & = & \ left [\ cos \ theta, - \ sin \ theta \ left (\ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ right] \ end {array}


En  theta=45 circ obtenemos:

\ begin {array} {rcl} q ^ {- 1} & = & \ left [\ frac {\ sqrt {2}} {2}, - \ frac {\ sqrt {2}} {2} \ left ( \ frac {\ sqrt {2}} {2} \ mathbf {i} + \ frac {\ sqrt {2}} {2} \ mathbf {k} \ right) \ right] \\ & = & \ frac {1 } {2} \ left [\ sqrt {2}, - \ mathbf {i} - \ mathbf {k} \ right] \ end {array}


Combinando el valor anterior qp y q1 obtenemos:

\ begin {array} {rcl} qp & = & \ left [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right] \\ qpq ^ {- 1} & = & \ izquierda [-1, \ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right] \ frac {1} {2} \ left [\ sqrt {2}, - \ mathbf {i} - \ mathbf {k} \ right] \\ & = & \ frac {1} {2} \ left [- \ sqrt {2} - \ left (\ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right ) \ cdot (- \ mathbf {i} - \ mathbf {k}), \ mathbf {i} + \ mathbf {k} + \ sqrt {2} \ left (\ sqrt {2} \ mathbf {i} + \ mathbf {j} \ right) - \ mathbf {i} + \ sqrt {2} \ mathbf {j} + \ mathbf {k} \ right] \\ & = & \ frac {1} {2} \ left [- \ sqrt {2} + \ sqrt {2}, \ mathbf {i} + \ mathbf {k} +2 \ mathbf {i} + \ sqrt {2} \ mathbf {j} - \ mathbf {i} + \ sqrt {2} \ mathbf {j} + \ mathbf {k} \ right] \\ & = & \ left [0, \ mathbf {i} + \ sqrt {2} \ mathbf {j} + \ mathbf {k} \ derecha] \ end {array}


Lo cual es puro quaternion, y la norma del resultado es:

\ begin {array} {rcl} | p ^ {\ prime} | & = & \ sqrt {1 ^ 2 + \ sqrt {2} ^ 2 + 1 ^ 2} \\ & = & \ sqrt {4} \\ & = & 2 \ end {array}


que es igual  mathbfp , es decir, se conserva la norma del vector.

La siguiente imagen muestra el resultado de la rotación.


Turno de Quaternion (3)

¡Vemos que el resultado es un cuaternión puro, y la norma del vector original se conserva, pero el vector giró 90 °, no 45 °, lo que es el doble de lo necesario! Por lo tanto, para la correcta rotación del vector  mathbfp en la esquina  theta relativo a un eje arbitrario  mathbf hatv necesitamos tomar el medio ángulo y crear el siguiente cuaternión:

q= left[ cos frac12 theta, sin frac12 theta mathbf hatv right]


¡Cuál es una visión general de un cuaternión girando!

Interpolación de Quaternion


Una de las razones más importantes para usar quaternions en gráficos de computadora es que los quaternions describen muy bien las rotaciones en el espacio. Los cuaterniones eliminan la carga de otras formas de puntos de inflexión en el espacio 3D, como los marcos plegables , en los que el problema es representar la rotación en las esquinas de Euler.

Usando cuaterniones, podemos definir varios métodos que representan la interpolación de rotación en el espacio 3D. El primer método que estoy considerando se llama SLERP . Se utiliza para interpolar suavemente un punto entre dos orientaciones. El segundo método es un desarrollo de SLERP y se llama SQUAD . Se utiliza para interpolar a lo largo de una serie de orientaciones que especifican la ruta.

SLERP


SLERP significa Interpolación esférica en línea (interpolación lineal esférica). SLERP proporciona la capacidad de interpolar suavemente un punto entre dos orientaciones.

Designaré la primera orientación como q1 y el segundo como q2 . El punto interpolado se denota por  mathbfp , el punto interpolado se denota por  mathbfp prime . Parámetro de interpolación t interpolará  mathbfp de q1 a las t=0 antes q2 a las t=1 .

La fórmula estándar de interpolación lineal es:

 mathbfp prime= mathbfp1+t( mathbfp2 mathbfp1)


Estos son los pasos básicos para aplicar esta ecuación:

  • Calculamos la diferencia entre  mathbfp1 y  mathbfp2 .
  • Tome la parte fraccional de esta diferencia.
  • Corrija el valor inicial por la diferencia fraccionaria entre los dos puntos.

Podemos usar el mismo principio básico para interpolar entre dos orientaciones de cuaterniones.

Diferencia Cuaternion


El primer paso significa que necesitamos calcular la diferencia entre q1 y q2 . En el contexto de los cuaterniones, esto es similar al cálculo de la diferencia angular entre dos cuaterniones.

 Deltaq=q11q2


Elevar un cuaternión a un poder


El siguiente paso es tomar la parte fraccionaria de esta diferencia. Podemos calcular la parte fraccional del cuaternión elevándolo a una potencia cuyo valor está en el rango [0...1] .

La fórmula general para elevar un cuaternión a una potencia tiene la siguiente forma:

qt= exp(t logq)


Donde la función exponencial para los cuaterniones se ve así:

\ begin {array} {rcl} \ exp (q) & = & \ exp \ left ([0, \ theta \ mathbf {\ hat {v}}] \ right) \\ & = & [\ cos \ theta , \ sin \ theta \ mathbf {\ hat {v}}] \ end {array}


Y el logaritmo de un cuaternión tiene la forma:

\ begin {array} {rcl} \ log {q} & = & \ log (\ cos \ theta {+} \ sin \ theta \ mathbf {\ hat {v}}) \\ & = & \ log \ left (\ exp (\ theta \ mathbf {\ hat {v}}) \ right) \\ & = & \ theta \ mathbf {\ hat {v}} \\ & = & [0, \ theta \ mathbf {\ hat {v}}] \ end {array}


En t=0 tenemos lo siguiente:

\ begin {array} {rcl} q ^ 0 & = & \ exp (0 \ log {q}) \\ & = & \ exp ([\ cos (0), \ sin (0) \ mathbf {\ hat {v}}]) \\ & = & \ exp ([1, \ mathbf {0}]) \\ & = & [1, \ mathbf {0}] \ end {array}


Y cuando t=1 tenemos

\ begin {array} {rcl} q ^ 1 & = & \ exp (\ log {q}) \\ & = & q \ end {array}


Diferencia fraccional de cuaterniones


Para calcular la rotación angular interpolada, cambiamos la orientación inicial q1 a la parte fraccionaria de la diferencia entre q1 y q2 .

q prime=q1 left(q11q2 right)t


¿Cuál es una visión general de la interpolación lineal esférica para cuaterniones? Sin embargo, este no es el tipo de ecuación SLERP que se usa comúnmente en la práctica.

Podemos aplicar una fórmula similar para realizar la interpolación esférica de vectores en cuaterniones. La forma general de interpolación esférica para vectores se define de la siguiente manera:

 mathbfvt= frac sin(1t) theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2


Gráficamente, esto se puede mostrar en la siguiente imagen.


Interpolación de Quaternion

Esta fórmula se puede aplicar a cuaterniones sin cambios:

qt= frac sin(1t) theta sin thetaq1+ frac sint theta sin thetaq2


Y podemos obtener el ángulo  theta calcular el producto escalar q1 y q2 .

\ begin {array} {rcl} \ cos \ theta & = & \ cfrac {q_1 {\ cdot} q_2} {| q_1 || q_2 |} \\ & = & \ cfrac {s_ {1} s_ {2} + x_ {1} x_ {2} + y_ {1} y_ {2} + z_ {1} z_ {2}} {| q_1 || q_2 |} \\ \ theta & = & \ cos ^ {- 1} \ left (\ cfrac {s_ {1} s_ {2} + x_ {1} x_ {2} + y_ {1} y_ {2} + z_ {1} z_ {2}} {| q_1 || q_2 |} \ right) \ end {array}


Factores a considerar


Esta implementación tiene dos problemas a considerar al usarla.

En primer lugar, si el producto escalar de los cuaterniones resulta ser un valor negativo, entonces la interpolación será muy útil en la esfera de cuatro dimensiones, y esto no siempre es deseable.Para resolver este problema, podemos verificar el resultado del producto escalar y, si es negativo, podemos tomar el valor opuesto a una de las orientaciones. Invertir las partes escalares y vectoriales del cuaternión no cambia la orientación que representan, pero al hacer esto garantizamos que la rotación tendrá lugar a lo largo del camino "más corto".

Otro problema surge si la diferencia angular entreq1 y q2 muy pequeño, mientras sinθ se convierte en 0. Si esto sucede, dividir por sinθPodemos obtener un resultado incierto. En este caso, puede volver a utilizar la interpolación lineal entreq1 y q2 .

Escuadrón


Al igual que SLERP puede usarse para la interpolación entre dos cuaterniones, SQUAD ( S esférico y Quad rangle - esférico y cuadrangular) puede usarse para una interpolación suave a lo largo de la trayectoria de rotación.

Si tenemos varios cuaterniones:

q1,q2,q3,,qn2,qn1,qn


Y definimos el cuaternión "auxiliar" ( si ), que podemos considerar como un punto de control intermedio:

si=exp(log(qi+1q1i)+log(qi1q1i)4)qi


La orientación a lo largo de parte de la curva se define como:

qi1,qi,qi+1,qi+2


a tiempo t esto nos da:

squad(qi,qi+1,si,si+1,t)=slerp(slerp(qi,qi+1,t),slerp(si,si+1,t),2t(1t))


Conclusión


A pesar de la dificultad de comprender, cuando se trabaja con giros, los cuaterniones proporcionan varias ventajas obvias en comparación con las matrices y ángulos de Euler.

  • SLERP SQUAD .
  • , , .
  • - . , ( , ).
  • , .
  • 4 (3, . ), 9 .

Sin embargo, junto con todas las ventajas de usar cuaterniones, también hay varias desventajas.

  • Los cuaterniones pueden volverse inválidos debido al error de redondeo de los números de coma flotante; sin embargo, este "error de arrastre" puede eliminarse renormalizando el cuaternión.
  • Probablemente el obstáculo más significativo para el uso de los cuaterniones es la alta complejidad de su comprensión. Espero que resuelvan este problema leyendo mi artículo.

Hay muchas bibliotecas matemáticas que implementan cuaterniones, y solo algunas de ellas implementan los cuaterniones correctamente. En mi propia experiencia, una buena biblioteca matemática con una implementación de cuaterniones de alta calidad es GLM (OpenGL Math Library). Si desea utilizar quaternions en sus propias aplicaciones, le recomiendo esta biblioteca.

Descargar demo


Creé una pequeña demostración que demuestra el uso de un cuaternión para rotar un objeto en el espacio. La demostración fue creada en la Unidad 3.5.2, se puede descargar gratis de descarga de este motor y ver el código fuente de la demo. El archivo zip también contiene el ejecutable binario de Windows, pero en Unity también puede crear una aplicación para Mac.

Comprender quaternions.zip

Referencias


Cuaterniones para gráficos por computadora

Vince, J (2011). Cuaterniones para gráficos por computadora. 1er. ed. Londres: Springer.



Dunn, F. y Parberry, I. (2002). 3D Math Primer para gráficos y desarrollo de juegos. 1er. ed. Plano, Texas: Wordware Publishing, Inc.

Source: https://habr.com/ru/post/es426863/


All Articles