Estoy tratando de escribir algunas pruebas unitarias y me doy cuenta de que no sé cómo comparar los cuaterniones. Necesito saber si dos cuaterniones representan la misma orientación (el objeto estaría orientado de la misma manera). Con una posición similar a un vector, simplemente compararía las partes y comprobaría que están lo suficientemente cerca, pero para los cuaterniones los valores pueden ser muy diferentes.
¿Cómo puedo comparar dos cuaterniones?
mathematics
edA-qa mort-ora-y
fuente
fuente
q
y-q
). La forma ingenua (computacionalmente-wise) sería aplicar tanto a los cuaterniones el mismo vector y ver si sus resultados son diferentes de vectores ..Respuestas:
Si sus dos cuaterniones son
q1
yq2
, representan la misma rotación si se cumple alguna de estas dos condiciones:q1
es sabio componente aproximadamente igual aq2
ORq1
es sabio componente aproximadamente igual a-q2
Sabiendo esto, puede escribir un probador de igualdad bastante simplista que se adapte a su objetivo.
fuente
q
y-q
representa la misma orientación (que se estaba pidiendo), pero no la misma rotación. Esto es crucial al interpolar.q
y-q
cuando se representa como un operador de rotación de eje de ángulo. Entonces, de hecho, técnicamente el efecto de estas rotaciones es el mismo, aunque los operadores no lo son. Y, sí, cuando SLERPING, uno debe asegurarseq1
yq2
acostarse en el mismo hemisferio de la hiperesfera S3 para que el slerp tome el camino más corto.2pi-angle
, por lo que está girando el camino largo alrededor de los ejes negados. Sin embargo, a veces esto es lo que quieres; es solo algo a tener en cuenta,q1 dot q2 > 0
resulta en el turno corto,q1 dot q2 < 0
toma el turno largo.Solo porque no ha sido mencionado. Como los cuaterniones utilizados para la orientación espacial son siempre unidades de longitud (o deberían ser), lo siguiente también funcionará.
donde EPS es un factor de falsificación para permitir pequeños errores debido a la precisión de coma flotante limitada. Si (y solo si) ambos cuaterniones representan la misma orientación entonces
q1 = +- q2
, y por lo tantoq1.dot(q2) = +- 1
. Si desea asegurarse de que tengan la misma rotación (en lugar de solo orientación), elimine elabs
.fuente
Los cuaterniones se almacenan como 4 flotadores o dobles, a menudo llamados x, y, zyw, donde los tres primeros representan un eje yw el grado de rotación alrededor de ese eje.
Un enfoque ingenuo sería simplemente comparar esos números de dos cuaterniones para la igualdad. Sin embargo, debido a que los cálculos de coma flotante implican un error, al menos debe usar un error, a menudo llamado eps (para epsilon) y comparar cada componente como
Una mejor prueba sería calcular el producto escalar de los dos cuaterniones y probar si está cerca de 1.0. Debería buscar la ecuación de los cuaterniones con pecado y cos y simplemente puntear dos cuaterniones, entonces debería ver fácilmente por qué esto funciona.
fuente
Basado en todas las sugerencias para usar Dot y eps, encontré que usando (en la unidad):
funcionó bien sin que tuviera que tomar una decisión sobre el tamaño de eps.
fuente