float型のx,y,zをまとめた型
XMFLOAT3 a;
a.x = 10.0f;
a.y = 20.0f;
a.z = 30.0f;
※ベクトルの計算機能は何もない
ベクトルを扱う型
XMVECTOR a;
a = XMVectorSet(10.0f, 20.0f, 30.0f,0);
こう書いてもよい
XMVECTOR a = { 10.0f, 5.0f, 3.0f, 0.0f };
※4次元まで対応してるが、普通は使わない。
※a.x = 10.0f; //こういう書き方はできない
XMFLOAT3 f; //何か入ってるとして
XMVECTOR v = XMLoadFloat3(&f);
XMVECTOR v; //何か入ってるとして
XMFLOAT3 f;
XMStoreFloat3(&f, v);
ベクトルは、普通に足し算をするとX,Y,Zがそれぞれ足される。
XMVECTOR a = XMVectorSet(20, 30, 0, 0);
XMVECTOR b = XMVectorSet(40, 10, 0, 0);
XMVECTOR c = a + b; //cは(60, 40, 0)になる。
a+bをすると、aとbを繋げたベクトルが求められる。
ベクトルは、普通に引き算をするとX,Y,Zがそれぞれ引かれる。
XMVECTOR a = XMVectorSet(20, 30, 0, 0);
XMVECTOR b = XMVectorSet(40, 10, 0, 0);
XMVECTOR c = a - b; //cは(-20, 20, 0)になる。
a-bをすると、bからaに向かうベクトルが求められる。
ベクトルに普通の数値(スカラー)を掛けると、X,Y,Zそれぞれに掛けられる。
XMVECTOR a = XMVectorSet(2, 3, 0, 0);
XMVECTOR b = a * 3; //bは(6, 9, 0)になる。
スカラー倍は、ベクトルの向きを変えずに長さを変化させる。
既存のベクトルの向きを変えずに長さを1にすることを正規化という。
XMVECTOR a = XMVectorSet(3, 3, 0, 0);
XMVECTOR b;
b = XMVector3Normalize(a); //aを正規化したものがbに入る
また、長さが1のベクトルのことを単位ベクトルと呼ぶ。
既存のベクトルの長さ(大きさ)を求めるには次のように書く。
XMVECTOR a = XMVectorSet(5, 3, 0, 0);
XMVECTOR v = XMVector3Length(a);
float length = XMVectorGetX(v);
ちょっとややこしいが以上のように書くとlengthにベクトルaの長さが入る。
移動ベクトルの長さを求めれば、それは「速度」であり、
2つの位置ベクトルの引き算した物の長さを求めれば、それは「距離」になる。
2つのベクトルの外積を求めると、両方のベクトルに垂直なベクトルが求められる。
XMVECTOR a = XMVectorSet(1, 0, 0, 0);
XMVECTOR b = XMVectorSet(0, 0, 1, 0);
XMVECTOR c = XMVector3Cross (a, b); //cは(0, 1, 0)になる
2つのベクトルの内積を求めると、右図の部分の長さが求められる。
XMVECTOR a = XMVectorSet(2, 0, 0, 0);
XMVECTOR b = XMVectorSet(1, 1, 0, 0);
XMVECTOR dot = XMVector3Dot(a, b);
float c = XMVectorGetX(dot);
なお、上の例でbの長さが1の場合は、内積の結果はcosθになる。
逆を言えば、内積のacosを計算すれば、角度θが求められる。
つまり、ベクトルaとbの角度を求めるには次のようにする。
a = XMVector3Normalize(a); //正規化
b = XMVector3Normalize(b); //正規化
float dot = XMVector3Dot(a, b).vecX;//内積を求める
float angle = acos(dot); //acosを求めれば角度
ちなみに角度の単位はラジアンなので注意。
DirectXで行列を扱う場合はXMMATRIX型を使う。
XMMATRIX m;
何もしない行列のことを単位行列という。
XMMATRIX m;
m = XMMatrixIdentity();
これで、変数mは何もしない行列になる。つまり行列の初期化。
平行移動させる行列は、次のように作る。
XMMATRIX m;
m = XMMatrixTranslation(2, 3, 4);
これで、変数mは右に2、上に3、奥に4移動させる行列になる。
回転させる行列は、回転軸によって3種類の作り方(関数)がある
XMMATRIX mX, mY, mZ;
mX = XMMatrixRotationX(XMConvertToRadians(45)); //X軸で45°回転させる行列
mY = XMMatrixRotationY(XMConvertToRadians(90)); //Y軸で90°回転させる行列
mZ = XMMatrixRotationZ(XMConvertToRadians(30)); //Z軸で30°回転させる行列
基本的に角度はラジアンで指定する。
上の例のようにXMConvertToRadiansを使えば度(Degree)で指定することもできる。
拡大縮小(スケール)させる行列は、次のように作る。
XMMATRIX m;
m = XMMatrixScaling (2.0f, 0.5f, 1.0f);
これで、変数mは横に2倍、縦に半分、前後はそのままの行列になる。
例えばベクトルvをY軸で30度回転させたい場合は、行列を使って次のように書く。
XMVECTOR v = XMVectorSet(2, 0, 0, 0); //とあるベクトル
XMMATRIX m = XMMatrixRotationY(XMConvertToRadians(30)); //Y軸で30度回転させる行列
v = XMVector3TransformCoord(v, m); //ベクトルvを行列mで変形