
サイン・コサインなどの三角関数は
ゲーム開発で非常によく使われるが、
3Dゲームの場合は特にコサインが役に立つ。
これはコサインでベクトルの影の長さを求められるからだ。
内積を利用してベクトルの影の長さを求める

コサインを使えば直角三角形の底辺の長さがわかるが、
その計算式は「斜辺の長さ × コサイン値」となる。
この図の場合は「3 × コサイン30度」だ。

これをそのまま先ほどの図に当てはめてみると、
「ベクトルABの長さ × コサインθ」を計算によって
ベクトルABの影となるベクトルACの長さが求まるということだ。
これを数学的に表現すると以下のようになる。
この式は以前紹介したベクトルの内積の計算方法、
と非常に似ていることがわかる。
違うのは
があるかどうかだ。
はベクトルACの長さを表すが、もしこれが
なら
と
は同じ意味になる。
つまり、ベクトルACの長さを1にしたものとの内積を求めれば
それがベクトルACの長さを表すということになる。
数学的に表現するとややこしく見えるが、
要するに内積を求めるときの2本のベクトルのうち、
片方は正規化したものを使うというだけだ。
この場合、ベクトルACはベクトルABの影が落ちる地面と考える。
影の長さで特定方向に対する位置がわかる

「影」といっても実際の地面とは関係がなく、
2本のベクトルがどこを向いていようが
正規化したベクトル方向を基準に
ベクトルの影の長さがわかるということだ。
これが役立つ場面として
たとえばレースゲームを想像してみよう。

自機と敵が順位を競っている場合、
どちらがゴールに近いかを判定して順位表示する必要があるが、
サーキットは曲がりくねっているので
各キャラクターとゴール地点の単純な距離では判断できない。

そこでスタートからゴールまでコース上に少しずつ点を置いていく。
ここではそのうちの2つの点を取り上げ、
P1からP2に向かう方向がゴールだとする。
そして、P2の座標からP1の座標を引き算して求めたベクトルを
さらに正規化し、これを基準ベクトル(
)と考える。

さらに自機の座標からP1の座標を引いて求めたベクトルを
、
敵の座標からP1の座標を引いて求めたベクトルを
とする。
正規化された
の長さは1なのだから、
と
の内積を求めれば

となり、
の影の長さを求めることができる。
同様に
と
の内積を使って
の影の長さも求める。

そしてその影はP1とP2を結んだ軸上に落ちたものなので
自機と敵のうち影の長い方がP2に近いということがわかる。
これで順位を判別するのだ。

同じ考え方でゴールを通過したかどうかも判定できる。
ゴールは1本の直線だが、判定する際は
そのゴールラインの上にある点Gの座標を使う。

さらに点Gから進行方向に伸びる長さ1のベクトル
、
点Gと自機を結ぶベクトル
、点Gと敵を結ぶベクトル
を用意する。
あとは先ほどと同じように
と
の内積、
と
の内積を使ってそれぞれの影の長さを求める。
この影の長さは
方向に対しての進捗具合を表すが、
点Gより手前を向いている
の影はマイナス値になるので
キャラクターがゴールラインを通過したかどうかも簡単に判定できる。