|
typedef TAffine2< float > | Affine2f |
| float版2次元アフィン行列.
|
|
typedef TAffine2< double > | Affine2d |
| double版2次元アフィン行列.
|
|
typedef TAffine< float > | Affinef |
| float版3次元アフィン行列.
|
|
typedef TAffine< double > | Affined |
| double版3次元アフィン行列.
|
|
|
template<class T > |
T | abs (T t) |
|
template<class T > |
T | sign (T t) |
| 符号(正なら1, 負なら -1 を返す)
|
|
template<class T > |
T | min (T a, T b) |
| 小さい方を返す
|
|
template<class T > |
T | max (T a, T b) |
| 大きい方を返す
|
|
template<class T > |
T | ave (T a, T b) |
| 平均をとる
|
|
double | Rad (double deg) |
| 度をラジアンに変換
|
|
float | Radf (double deg) |
|
double | Deg (double rad) |
| ラジアンを度に変換
|
|
float | Degf (double rad) |
|
template<class SC > |
SC | Square (SC x) |
| 2乗
|
|
template<class SC > |
SC | Det2 (SC a, SC b, SC c, SC d) |
| 2x2行列の行列式
|
|
template<class TD , class TV > |
TVec2< TV > | operator* (const PTM::TMatrixBase< 3, 3, TD > &a, const TVec2< TV > &b) |
| TAffine2とベクトルの掛け算
|
|
template<class TD , class TV > |
TVec3< TV > | operator* (const PTM::TMatrixBase< 4, 4, TD > &a, const TVec3< TV > &b) |
| TAffineとベクトルの掛け算
|
|
|
const double | M_PI = 3.14159265358979323846 |
| 円周率π
|
|
1 はじめに
このページはAffine行列クラス(Spr::TAffine, Spr::TAffine2)の説明です.
Affine行列クラスライブラリは,3Dシミュレーションに必須な
Affine行列をC++のクラスにしたものです.
2 使い方
Affine 行列クラスライブラリは,ヘッダファイルだけからなる
クラスライブラリなので, TAffine.h, TinyVec.h, TinyMat.h, TMatrix.h, TMatrixUtility.h, TVector.h
を同じフォルダに入れておき,.cppファイルからヘッダをインクルードするだけで
使用できます.
2.1 サンプル
#include "Affine.h" // TAffine行列ライブラリのインクルードする.
#include <iostream>
using namespace Spr; // Affine行列クラスはSpr名前空間の中で宣言されている.@!EN Affine matrix class is declared in the name space of Spr.
void main(){
Affinef af=Affinef::Rad(Rad(30), 'z'); // 要素がfloatなTAffine行列を宣言.
z軸回り30度回転行列に初期化
Vec3f vec(1,0,0); // 要素がfloatな3次元のベクトルを宣言
std::cout << af;
std::cout << vec << std::endl;
std::cout << af * vec << std::endl;
}
2.2 Affine行列・ベクトルのメンバと演算
普通に演算ができます.
<ul>
<li> +:和, -:差, *:積/内積, /:定数分の1
<li> ==:比較, =:代入
<li> <<:出力, >>:入力
<li> %:ベクトルの外積
</ul>
Affine変換は,
TAffine<float> af; TVec3<float> v, af_v;
af_v = af * v;
とすればできます.
また,次のようにTAffine行列の部分を取り出すことができます.
<ul>
<li> af.Ex(): X軸基底ベクトル.(3次元ベクトル).
<li> af.Ey(): Y軸基底ベクトル.(3次元ベクトル).
<li> af.Ez(): Z軸基底ベクトル.(3次元ベクトル).
<li> af.Trn(): 平行移動部分.(3次元ベクトル).
<li> af.Rot(): 回転変換部分.(3×3行列).
</ul>
部分への代入などもできます.
TAffine<float> af;
af.Pos() = Vec3f(10,0,0);
af.Rot() = TAffine<float>::Rot(Rad(30), 'x').Rot() * af.Rot();
ベクトルは次のようなメンバ関数を持ちます.
2.3 Affine行列の初期化
TAffine行列(Spr::TAffine)には便利なコンストラクタや初期化関数を用意しました. いくつかをここで紹介します.
-
Spr::TAffine::Trn (T px, T py, T pz): 平行移動する行列に初期化.TはTAffine<T>のT.floatやdoubleなどで良い.
-
Spr::TAffine::Rot(element_type th, char axis): 回転行列を返す.thはラジアン.axisは,'x', 'y', 'z'.element_typeはTのこと.
-
Spr::TAffine::ProjectionD3D (TVec3 screen, TVec2 size, T front=1.0f, T back=10000.0f): D3D用射影行列として初期化.
-
Spr::TAffine::ProjectionGL (TVec3 screen, TVec2 size, T front=1.0f, T back=10000.0f):
OpenGL用射影行列として初期化(-Zが前).
-
screen カメラから見たビューポートの中心の位置
-
size ビューポートのサイズ
-
front 手前のクリッピング平面とカメラの距離
-
back 奥のクリッピング平面とカメラの距離
-
Spr::TAffine::LookAtGL (TVec3 pos, TVec3 diry) 位置はそのままで,posに-Ez(), diry に Ey()が向くようなAffine行列. OpenGLのgluLookAtと等価.
3 謝辞
LU分解,逆行列,ガウス消去法などの行列計算アルゴリズムは,
「『C言語による最新アルゴリズム事典』全ソースコード」
ftp://ftp.matsusaka-u.ac.jp/pub/algorithms
奥村 晴彦 Haruhiko Okumura
を改変して流用させていただきました. 自由にコードを使えるよう公開してくださってありがとうございます.
4 リファレンス
ベクトル・行列・座標変換
#define DEF_TAFFINE_CONSTRUCTORS2 |
( |
|
TAffine | ) |
|
値:TAffine(element_type th, char axis) { \
*this=Rot(th, axis); \
} \
template <class BUF> \
TAffine(element_type th, char axis, \
*this = Rot(th, axis); Pos() = posi; } \
template <class BUFA> \
*
this = Rot(th, axis.
unit()); \
} \
template <class BUFA, class BUFP> \
*
this = Rot(th, axis.
unit()); Pos() = posi; \
} \
template <class BUFS, class BUFZ> \
*this = ProjectionGL(screen, size, front, back); \
} \
template <class BUF, class BUFV> \
Rot() = m; Pos() = posi; ExW() = 0; EyW() = 0; EzW() = 0; PosW() = 1; \
}
次元をテンプレートで持つベクトルの基本型
Definition: TVector.h:72
ret_type unit() const
単位ベクトルを返す.
Definition: TVector.h:442