2013-01-06 4 views
5

Ho un po 'di isometria [R | m] matrici di trasformazione, cioè trasformazioni rigide 3D. Attualmente li memorizzo come Eigen Affine transformations, rappresentati nella forma compatta per es. Eigen::AffineCompact3d che non memorizza l'ultima riga ridondante di [0 0 0 1].Come rappresentare la matrice di trasformazione Compact isometry in Eigen?

Sono anche consapevole del fatto che esiste un Eigen::Isometry3d che immagino sia typedef di Transform<double, 3, AffineCompact, Isometry>.

I am after Isometry since, la trasformazione inversa è molto più economica (trasposizione) di un inverso generale affine. So anche che posso passare un suggerimento, quando uso inverso() come affine_mat.inverse(Eigen::Isometry);

Ma vorrei ottenere il comportamento inverso isometrico senza passare ogni volta manualmente un suggerimento. In altre parole, voglio sapere qual è il modo migliore per replicare il comportamento di Eigen::IsometryCompact3d che è sorprendentemente assente nell'API di Eigen?

risposta

1

Per rappresentare le isometrie Attualmente sto utilizzando twists. Questa parametrizzazione può essere descritta da un vettore di 6 elementi.

Per trasformare avanti e indietro la formulazione di matrice omogenea standard sono necessarie un paio di funzioni basate su log() ed exp() (quindi la conversione sarà un'operazione lenta).

Questo solutone è favorevole se non si dispone di un vincolo di prestazioni per andare avanti e indietro tra le due formule (o lo si fa raramente) o se si desidera sfruttare le proprietà delle torsioni (ad esempio nell'ottimizzazione numerica)

+0

Sì, è buono avere una rappresentazione del gruppo di Lie in generale. Ma nel mio caso sto facendo una trasformazione di molti vettori, e la rappresentazione della matrice funziona meglio per me. Penso che gli scrittori Eigen abbiano in qualche modo perso questa cosa. – iNFINITEi