void main(){ Affinef af=Affinef::Rad(Rad(30), 'z'); // 要素がfloatなTAffine行列を宣言.
Vec3f vec(1,0,0); // 要素がfloatな3次元のベクトルを宣言
std::cout << af; std::cout << vec << std::endl; std::cout << af * vec << std::endl; }
普通に演算ができます.
-
+:和, -:差, *:積/内積, /:定数分の1
-
==:比較, =:代入
-
<<:出力, >>:入力
-
:ベクトルの外積
Affine変換は,
TAffine<float> af; TVec3<float> v, af_v;
af_v = af * v;
とすればできます.
また,次のようにTAffine行列の部分を取り出すことができます.
-
af.Ex(): X軸基底ベクトル.(3次元ベクトル).
-
af.Ey(): Y軸基底ベクトル.(3次元ベクトル).
-
af.Ez(): Z軸基底ベクトル.(3次元ベクトル).
-
af.Trn(): 平行移動部分.(3次元ベクトル).
-
af.Rot(): 回転変換部分.(3×3行列).
部分への代入などもできます.
TAffine<float> af;
af.Pos() = Vec3f(10,0,0);
af.Rot() = TAffine<float>::Rot(Rad(30), 'x').Rot() * af.Rot();
ベクトルは次のようなメンバ関数を持ちます.
-
unit(): 向きが等しい単位ベクトルを返す.
-
norm(): ベクトルの大きさ(ノルム)を返す.
TAffine行列(Spr::TAffine)には便利なコンストラクタや初期化関数を用意しました. いくつかをここで紹介します.
-
Affinef(float x, float y, float z): (x,y,z) 平行移動する行列に初期化
-
Affinef(Vec3f ex, Vec3f ey, Vec3f pos): 直接代入して初期化, ez = ex%ey とする.
-
Affinef::Rot(float rad, char axis): 回転行列を返す. axisは,'x', 'y', 'z'.
-
Affinef::Rot(float rad, Vec3f axis): 回転行列を返す.
-
Affinef::ProjectionD3D(Vec3f screen, Vec2f size, float f, float b): D3D用射影行列として初期化.
-
Affinef::ProjectionGL(Vec3f screen, Vec2f size, float f, float b): D3D用射影行列として初期化.
OpenGL用射影行列として初期化(-Zが前).
-
screen カメラから見たビューポートの中心の位置
-
size ビューポートのサイズ
-
f 手前のクリッピング平面とカメラの距離
-
b 奥のクリッピング平面とカメラの距離
-
void LookAtGL(Vec3f posz, Vec3f posy):位置はそのままで,poszに-Ez(), posy に Ey() が向くようなTAffine行列
LU分解,逆行列,ガウス消去法などの行列計算アルゴリズムは,
「『C言語による最新アルゴリズム事典』全ソースコード」
ftp://ftp.matsusaka-u.ac.jp/pub/algorithms
奥村 晴彦 Haruhiko Okumura
を改変して流用させていただきました. 自由にコードを使わせてくださって,ありがとうございます.
Springheadに対してSun Apr 16 01:58:44 2006に生成されました。
1.4.1