内積と外積の使い方この章では3Dゲームの特に衝突判定に無くてはならない「内積・外積」というベクトルの基本的な演算についてお話します。内積は高校で、外積はたぶん大学で習います。そのきちんとした意味を理解するのは大切ですが、ゲームで使う上では性質を体得する方が近道かと思います。そのためにはイメージが大切です。この章ではゲームで使用するベクトルの内積や外積をイメージと一緒に見ていこうと思います。方向と大きさを表せる「ベクトル」この記事をご覧になっている方の多くはきっと高校生以上だと思います(そうでない方は賞賛に値します!立派なプログラマーになれますよ(^-^))。高校の頃には必ず「ベクトル(vector)」を習います。ベクトルは「方向と大きさを表す方法」です。下の図をご覧下さい:見た目平面ですが、ゲームでは主に3次元のベクトルを使います。高校の時のベクトルのイメージは2次元です。どちらもベクトルですが、扱いがちょっと異なりますので注意が必要になります。上の図を見ると、ベクトルには始点と終点があるように思ってしまいます。ベクトル自身は「方向と大きさを表す記法」であって、位置はそこに含まれません。図にある(x,y,z)というのはあくまでも方向と大きさです。ベクトルは座標のどの場所にでも置けて、その位置の向きと大きさを示す事ができるんです。ベクトルは足し算ができます。方向と大きさを足すというのは、次のような2つのイメージができます:左の図は軌跡の足し算だと思うと良いと思います。ベクトルAだけ進みます。次に進んだ先からベクトルBに方向転換。結果として終点にたどり着きます。実は2つのベクトルを足し算すると、必ず始点と終点を結んだベクトル(赤いベクトル)になります。これはベクトルを何千回足そうと同じになります。右側は物理の特に力などでお世話になるベクトルの足し算です。AさんとBさんがそれぞれ右図のような方向と大きさで根元を引っ張るとします。すると、根元は赤い矢印の方向と大きさに行こうとします。感覚的にもわかりますよね。2つの力の合成ならまだ良いのですが、これが何十と重なると見た目では分からなくなりますが、ベクトルを足し算するとちゃんと合成結果の方向(赤い矢印)が出てきます。ベクトルの足し算は、各成分を足し算するだけです。ベクトルの引き算は足し算に比べるとそのままではイメージし辛いものです。引き算と言うのは「マイナスなものを足した物」でもあります。ベクトルをマイナス(符号転換)すると同じ大きさで方向がま逆になります。矢印の頭が逆につくわけです。(-B)引き算で迷ったら、引く側を反対にして足し算にすると、イメージが急に沸く事が多いのでお勧めです。足す引くと来ると次は「掛ける」「割る」です。方向と大きさを掛けるというのはイメージが飛び越えています。実は、ベクトル同士の掛け算(割り算)は定義されていません。「定数倍」は定義されています。このイメージはベクトルの大きさを引き伸ばしたと解釈できます:なぜベクトル同士の掛け算は無いのか?本当は解釈があります。ベクトル同士の掛け算は「空間のスケール変換」に当たるんです。割り算は逆数にすれば掛け算になりますから同じです。ベクトルは大きさと方向を表す。足し算はあれこれ動いた結果の始点と終点を結ぶベクトルになる。掛け算は定数倍のみ定義。方向を変えずに大きさを変える。ベクトルの掛け算は基本的には定義されない。ベクトルの内積ベクトルの基本的なおさらいをしましたので、内積の話にうつります。product(ドット積)とも呼ばれます。productの方です。D3DXVec3Dot関数などを見たら「内積だな」と思って下さい。|v1||v2|cos(θ)上の式の「θ」は2つのベクトルが作る角度です。この式はぱっと見では不思議に思えます。各成分を掛けて足し合わせるという計算がなぜか右の「ベクトルの大きさ同士を掛け算して、cosθを掛けている!」というものとイコールになっています。なるのか、数学的にはもちろん証明できます。それは数学屋さんが好きなこと。ゲーム屋はこれを別の視点で見るんです。「成分同士掛けて足すというのが内積の計算方法。右辺を捉えるのがゲーム屋として内積をつかむコツです。(ちなみに証明はこちら)ゲームで内積を扱う時、たぶん十中八九は「どちらかのベクトルが標準化されている」状態です。標準化というのはベクトルの方向は変えずに大きさを「1」にする事を指します。標準化なのか?例えば上の図でベクトルv2が標準化されているとしましょう。その大きさは1ですから|v2|=1となります。|v1|cos(θ)右辺から|V2|が消えました。この状態で次の図をご覧下さい:2つのベクトルv1、v2があり、そのなす角度がθです。高校の頃にcosθというのは直角三角形の「底辺/斜辺」と習ったと思います。今斜辺の長さは|v1|です。