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に向かうベクトルが求められる。
既存のベクトルの向きを変えずに長さを1にすることを正規化という。
XMVECTOR a = XMVectorSet(3, 3, 0, 0);
XMVECTOR b;
b = XMVector3Normalize(a); //aを正規化したものがbに入る
また、長さが1のベクトルのことを単位ベクトルと呼ぶ。
ベクトルに普通の数値(スカラー)を掛けると、X,Y,Zそれぞれに掛けられる。
XMVECTOR a = XMVectorSet(2, 3, 0, 0);
XMVECTOR b = a * 3; //bは(6, 9, 0)になる。
スカラー倍は、ベクトルの向きを変えずに長さを変化させる。
既存のベクトルの長さ(大きさ)を求めるには次のように書く。
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);
float c = XMVector3Dot (a, b).vecX; //cは1になる
なお、上の例でbの長さが1の場合は、内積の結果はcosθになる。
逆を言えば、内積のacosを計算すれば、角度θが求められる。
つまり、ベクトルaとbの角度を求めるには次のようにする。
a = XMVector3Normalize(a); //正規化
b = XMVector3Normalize(b); //正規化
XMVECTOR dot = XMVector3Dot(a, b); //内積を求める
float angle = acos(XMVectorGetX(dot)); //acosを求めれば角度
ちなみに角度の単位はラジアンなので注意。