ゲームプログラミング技術集 
ひっと

ベクトル

3Dゲームプログラミングに必要な数学を難しいこと抜きで紹介しています。

ベクトルの概要

ベクトルは方向と距離を持つ値

ベクトルは目標までの向きと距離を表しています。
つまり、ある位置からある位置に向けての移動量を表します。

ゲームプログラミングではベクトルを使って物体間の距離や方向を調べたり物体を移動させます。
後で紹介するベクトルの内積・外積は当たり判定などに使われます。

3Dプログラミングに欠かせない数学ですね。


図にすると1本の矢印になります。
この例は3次元ベクトルなのでベクトルVはx,y,zの3つの数値で構成されます。

図のxyz軸の交点ですが「交点が原点(0,0,0)にあるとは限りません」
図にしたために誤解しやすいのですが、ベクトルが持つ情報は目標までの向きと距離だけです。

ならば交点はどこにあるのかというとどこにでもなり得ます
用途によって自分で決めてしまえばいいのです。
好きな位置から移動を開始できる。これがベクトルの都合のいいところ。

ちなみにxyz軸の交点が原点(0,0,0)ならベクトルは位置そのものを表します。

ベクトルは足せる・引ける

ベクトルは移動量を表しています。
ベクトル同士で足し算を行うと最終的な移動量が分かります。



式にするとV=A+Bと書きます。
A+BでもB+Aでも同じ結果です。

引く場合については、反対向きのベクトルを足すと考えることができます。

ベクトルはかけられる

ベクトルに数値をかけると方向はそのままで距離が数値倍になります。
ただしマイナスの値をかけると反対向きになります。


割った場合も同様です。

位置もベクトルになる

位置は「原点(0,0,0)からの移動量」と考えることができます、なのでそのままベクトルとして使えます。
なんでわざわざベクトルにするかというと、ベクトル同士の計算で新たな位置が求まるからです。
位置ベクトルに移動量のベクトルを足すと移動後の位置が分かります。

DirectXのベクトル定義

DirectXでは3次元ベクトルを次のように定義しています。

D3DVECTOR:
float型の値3つ、xyzで構成された構造体です。

D3DXVECTOR3:
D3DVECTORに簡単な計算機能を持たせたクラスです。
足し算、引き算、かけ算などを演算子一つで簡単にプログラミングできます。

使用例

D3DXVECTOR3 vA(pointA.x, pointA.y, pointA.z );
D3DXVECTOR3 vB(pointB.x, pointB.y, pointB.z );

//ベクトルABを求める
D3DXVECTOR3 vAB = vB - vA;

//ベクトルABをleng倍
float leng;
vAB *= leng;

ベクトルの求めかた



A、Bは座標軸が原点にある位置ベクトルです。
AからBへの移動量(ベクトル)を求めるには、B-Aで計算できます。

(矢印の「先」から「元」を引くと覚えると間違えにくいと思う)

ベクトルの長さの求め方

ベクトルの長さの計算式

物体間のベクトルが計算できれば物体間の距離も分かります。
数学的にはこんな計算式です。
長さ = √( (x*x)+(y*y)+(z*z) )

D3DXVec3Length

DirectXのD3DXVec3Lengthでベクトルの長さが分かります。

FLOAT out = D3DXVec3Length( D3DXVECTOR3 *in )

距離の比較にはD3DXVec3LengthSqを使う


一番近い敵、一番遠い敵など、複数のベクトル長さを比較することがあります。
そんなときはD3DXVec3LengthSqを使います。
なぜかというと計算処理が速くなるからです。

長さの計算式には√が入っています。√の計算は足し算引き算と比べると時間のかかる処理です。

D3DXVec3LengthSqはD3DXVec3Lengthの√の計算を省略した関数です。
そのため得られる値は正しい距離を2乗した値ですが、全部のベクトルに使えば大小関係は変化しません。
距離の比較だけが目的なら√の計算は必要ないのですね。

プログラミングでは√やかけ算割り算の省略は処理速度の高速化に大きく貢献します。
「if文を減らす」とか「ループ回数を改善」とかいった類の高速化もおろそかになりませんが、これらとは格が違うので一度検討してみるといいですよ。
      次へ