読者です 読者をやめる 読者になる 読者になる

ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

Eigen3でアフィン変換するヤツ

C++ eigen3 トラブルシューティング

なにがあった

Eigen3使ってあれこれするのに3次元空間上の点を回転して並進したくなってチュートリアルを覗いてみるとあるじゃないですかアフィン変換が。
アフィン変換行列くらい自分で作ってもいいんですけど、Transform使ったほうがかっこいいし速そう。
ということで使おうとしたらサンプルコードとかが全然見当たらなくてドハマリしたのでメモ。

サンプルコード

こんなかんじでやればいいようです。
自分の環境だと警告が出てなんか怖いんですけど何なんですかねぇ。

#include <Eigen/Dense>
#include <Eigen/Geometry>
#include <cmath>

using namespace Eigen;

int main() {
	//アフィン変換を用意
	Translation3f pre_t(10.0f, 0.0f, 0.0f);
	Translation3f post_t(0.0f, 10.0f, 0.0f);
	Vector3f ra(0.0f, 1.0f, 0.0f);
	AngleAxisf r(M_PI/4, ra);
	Affine3f at(post_t*r*pre_t);

	//アフィン変換を行う
	Vector3f i(100.0f, 100.0f, 100.0f);
	Vector3f o;
	o = at*i;

	//こうしてもOK
	o = post_t*r*pre_t*i;

	return 0;
}

atをお望みのベクトルに掛けてやるだけでアフィン変換してくれます。ベクトルを同次座標表現にしておく必要性は特にありません。3次元のベクトルのまんまで計算してくれます。
並進と回転の順番は後ろからです。
Affine3fは

typedef Transform<float,3,Affine> Affine3f;

となっており、最終行の要素が勝手に(0...0, 1)になるTransformという事だそうです。

※追記
アフィン変換を初期化する際、回転行列を直接放り込んでも大丈夫なようです。
つまりこう書いてもOKということ。

Matrix3f RotMatrix; //回転行列

//何らかの計算で回転行列をRotMatに得る

Affine3f RotAffine(RotMatrix); //回転行列と同等のアフィン変換

環境とか

Ubuntu 12.10上でapt-getでなんとかなる環境