Se hai necessità di calcolare una matrice di rotazione partendo dagli angoli di eulero, ti sarai accorto che non è facile trovare qualcosa di usabile in C#. E’ necessario appoggiarsi a strumenti di sviluppo come Unity o simili per trovare delle funzioni già pronte.

Oggi vediamo una soluzione scritta proprio in C# che ci permette di risolvere il problema senza troppi gratta capi.

Quello che ti presento non fa uso di librerie particolari, dunque è tranquillamente compilabile in .NET Core, ciò garantisce portabilità su tutti i sistemi operativi supportati dal framework Microsoft.

Se stati cercando una soluzione per fare l’operazione inversa, ovvero ricavare gli angoli di eulero da una matrice di rotazione, fai riferimento a questo articolo.

Angoli di Eulero in Matrice di Rotazione

Senza perdere tempo, di seguito ti presento la soluzione che permette, partendo da 3 angoli di eulero (rotazione rispetto all’asse X, Y e Z), di ottenere la matrice di rotazione relativa. Il risultato è strettamente dipendente dal tipo di convenzione che necessiti utilizzare nell’applicare le rotazioni.  Nel codice in questione tengo di conto le 3 sequenze di rotazione classiche: XYZ, ZYZ e ZYX.

Copy to Clipboard

Per cominciare, definiamo due enum che renderanno il codice più leggibile. Nelle righe 1 – 5, definiamo le varie tipologie di unità di misura degli angoli che vogliamo gestire, nel nostro caso gradi e radianti. Nelle righe 7 – 12, invece, andiamo a descrivere le varie sequenze di rotazione degli assi che gestiremo.

La funzione, come descritto dalla firma nella riga 14, prende in ingresso:

  • un array di double di 3 elementi contenenti gli angoli di eulero;
  • la tipologia di rotazione degli assi;
  • l’unità di misura degli angoli passati come primo parametro;

e restituisce una matrice 3 x 3 contenente la matrice di rotazione.

Per testare il codice appena scritto, scriviamo un semplice programma che effettua il calcolo della rotazione:

  • Rx = 180;
  • Ry = 0;
  • Rz = 180.
Copy to Clipboard

Il risultato in uscita sarà la matrice 3 x 3 in cui gli elementi vengono salvati in  row-major order (ovvero riga per riga).

rotM[0,0]rotM[0,1]rotM[0,2]
rotM[1,9]rotM[1,1]rotM[1,2]
rotM[2,0]rotM[2,1]rotM[2,2]

Conclusioni

La matrice di rotazione non è altro che un operatore matriciale che consente di ruotare un vettore attorno ad un dato asse nello spazio. Si tratta di uno strumento molto utile in diversi campi applicativi, come in robotica nella risoluzione dei problemi di cinematica inversa o nelle trasformazione di sistemi di riferimento.

In questo breve articolo abbiamo presentato una soluzione in C# che permette di effettuare il calcolo della matrice di rotazione partendo da una configurazione di angoli di eulero.