2012-12-19 38 views
5

Eigenライブラリを使用して、アフィン変換を等価変換に変換する最も簡単な方法は何ですか?固有アフィン変換を固有アイソメトリ変換に変換する

両方の変換は3Dです。アファイン行列は、左上象限に対して一般的な3x3行列(すなわち、回転、スケーリングおよびせん断)を有するが、等尺度は同じ象限に対して3x3回転行列を有するので、投影が必要である。

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

を与えながら

error C2338: YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION

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

は、コンパイルエラーを与えます

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)

を与える「私は最高のアイソメトリックの回転と平行移動コンポーネント変換を設定する方法を教えてください」

+0

標準のC++タイプや名前ではないので、使用しているライブラリやツールキットを指定する必要があります。 – abelenky

+2

私はタイトルとテキストで述べたように、Eigen(よく知られているC++数学ライブラリ)を使用しています。私はそれを明確にするためのリンクを追加します。 – user664303

答えて

5

.rotation()変換の回転部分を抽出します。これにはSVDが含まれているため、読み取り専用です。左側には、あなたが)(.linearを使用する必要があります。

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

をあなたは「」等長であることがわかっている場合のみ等長3Fにキャストしたい、あなたは簡単に行うことができます。

b = a.matrix(); 
関連する問題