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
- 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)=(a1−a2)+(b1−b2)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 cartesianoPlano 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 complejoComo 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 , mathbfkiLa 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 mathbfj−4 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
q−1 . Para calcular el cuaternión inverso, tomamos el número conjugado del cuaternión y lo dividimos por el cuadrado de la norma:
q−1= fracq∗|q|2
Para mostrar esto, podemos usar la definición inversa:
qq−1=[1, mathbf0]=1
Y multiplique ambos lados por el número conjugado del cuaternión, lo que nos dará:
q∗qq−1=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:
q−1=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
q−1 :
\ 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
q−1 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=q−11q2
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(q−11q2 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(1−t) theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2
Gráficamente, esto se puede mostrar en la siguiente imagen.
Interpolación de QuaternionEsta fórmula se puede aplicar a cuaterniones sin cambios:
qt= frac sin(1−t) 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,⋯,qn−2,qn−1,qn
Y definimos el cuaternión "auxiliar" ( si ), que podemos considerar como un punto de control intermedio:si=exp(−log(qi+1q−1i)+log(qi−1q−1i)4)qi
La orientación a lo largo de parte de la curva se define como:qi−1,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(1−t))
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.zipReferencias

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. |