i vantaggi sono:
0) i quaternioni sono ottimali per calcolare le rotazioni nello spazio. Per invece individuare la posizione di un punto dello spazio e' piu' semplice la definizione cartesiana o con gli angoli di Eulero
1) rispetto ad una rotazione con gli angoli di Eulero (dove sono necessari 9 parametri) con i quaternioni sono sufficienti 4 parametri
2) la rotazione tramite gli angoli di Eulero e' data dalla successione combinata di rotazioni attorno ai tre assi cartesiani con un ordine non preordinato (per esempio si puo' ruotare prima x che su y ma lo stesso risultato puo' essere ottenuto anche invertendo l'ordine). La rotazione tramite quaternioni e' univoca in quanto quella ottimale
3) legato al punto 2 la rotazione con i quaternioni non e' soggetta a gimbal lock
Per effettuare una rotazione si utilizza una estensione del metodo per i numeri complessi in 2D.
Si crea un quaterione (R) che descriva la rotazione e poi si applica al vettore desiderato(P) con la regola RPR-1
la moltiplicazione dei tre quaternioni segue una regola un po' particolare che si riassume come
Questa codice e' stato ripreso da questo link
---------------------------------------
//coordinate del punto da ruotare
float x_old = 0;
float y_old = 1;
float z_old = 1;
//angolo di rotazione
float angle = (float) Math.toRadians(45.0);
// vettore di rotazione
float xi = 1;
float yi = 1;
float zi = 1;
float norma = (float) Math.sqrt((xi*xi)+(yi*yi)+(zi*zi));
xi = xi/norma;
yi = yi/norma;
zi = zi/norma;
double w = Math.cos(angle/2.0);
double x = xi*Math.sin(angle/2.0);
double y = yi*Math.sin(angle/2.0);
double z = zi*Math.sin(angle/2.0);
float x_new = (float) ((1 - 2*y*y -2*z*z)*x_old + (2*x*y + 2*w*z)*y_old + (2*x*z-2*w*y)*z_old);
float y_new = (float) ((2*x*y - 2*w*z)*x_old + (1 - 2*x*x - 2*z*z)*y_old + (2*y*z + 2*w*x)*z_old);
float z_new = (float) ((2*x*z + 2*w*y)*x_old + (2*y*z - 2*w*x)*y_old + (1 - 2*x*x - 2*y*y)*z_old);
System.out.println(Double.toString(x_new));
System.out.println(Double.toString(y_new));
System.out.println(Double.toString(z_new));
---------------------------------------
Rotazione di un cubo di spigolo 1 orientato come gli asse e con spigolo in (0,0,0) di 45° attorno ad un vettore (0,0,0)(1,1,1). Dati rappresentati con Geogebra (nella tabella a fianco i valori dei punti ruotati)