2012-12-19 6 views
5

Qual è il modo più semplice per convertire una trasformazione affine in una trasformazione isometrica (ovvero consiste solo in una rotazione e una traduzione) utilizzando la libreria Eigen?Conversione di una trasformazione affine Eigen in una trasformazione isometrica Eigen

Entrambe le trasformazioni sono 3D. La matrice affine ha una matrice 3x3 generale (cioè rotazione, ridimensionamento e taglio) per il quadrante in alto a sinistra, mentre l'isometria ha una matrice di rotazione 3x3 per lo stesso quadrante, quindi è necessaria una proiezione.

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b(a); 

dà l'errore di compilazione:

error C2338: YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION

mentre

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b(a.rotation(), a.translation()); 

(line 2) error C2661: 'Eigen::Transform<_Scalar,_Dim,_Mode>::Transform' : no overloaded function takes 2 arguments

e

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b; 
b.translation() = a.translation(); 
b.rotation() = a.rotation(); 

(line 4) error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Eigen::Matrix<_Scalar,_Rows,_Cols>' (or there is no acceptable conversion)

Data la rotazione() e traduzione() funzioni, la questione può essere riformulato come "Come faccio a meglio regolare i componenti di rotazione e di traduzione di un isometrica trasformano?"

+0

È necessario specificare quale libreria o toolkit si sta utilizzando, poiché questi non sono tipi o nomi C++ standard. – abelenky

+2

Sto usando Eigen (una nota libreria di matematica C++), come ho affermato nel titolo e nel testo. Aggiungerò un link per renderlo più chiaro. – user664303

risposta

5

.rotation() estrae la parte di rotazione della trasformazione. Coinvolge un SVD, quindi è di sola lettura. Sul lato sinistro, è necessario utilizzare .Lineare():

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b; 
b.translation() = a.translation(); 
b.linear() = a.rotation(); 

Se si sa che 'a' è un'isometria e solo vuole gettarlo ai un'isometria 3f, si può semplicemente fare:

b = a.matrix();