9

Eigenライブラリを使用して、アフィン変換を等角変換 (つまり、回転と平行移動のみで構成される) に変換する最も簡単な方法は何ですか?

どちらの変換も 3D です。アフィン行列には左上象限の一般的な 3x3 行列 (つまり、回転、スケーリング、せん断) がありますが、アイソメトリには同じ象限の 3x3 回転行列があるため、射影が必要です。

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

コンパイルエラーが発生します:

エラー C2338: YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION

一方

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

与える

(2 行目) エラー C2661: 'Eigen::Transform<_Scalar,_Dim,_Mode>::Transform': オーバーロードされた関数が 2 つの引数をとらない

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

与える

(4 行目) エラー C2678: バイナリ '=' : 型 'const Eigen::Matrix<_Scalar,_Rows,_Cols>' の左側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)

rotation() 関数と translation() 関数を考えると、この質問は「等角変換の回転コンポーネントと平行移動コンポーネントを最適に設定するにはどうすればよいですか?」と言い換えることができます。

4

1 に答える 1

9

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

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

「a」がアイソメトリであることがわかっていて、それをアイソメトリ 3f にキャストしたいだけの場合は、次のように簡単に実行できます。

b = a.matrix();
于 2012-12-20T08:50:38.563 に答える