【ITニュース解説】Unityで“内積”を使い倒す

2025年09月08日に「Qiita」が公開したITニュース「Unityで“内積”を使い倒す」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

ゲームエンジンUnityで役立つ数学の「内積」を解説。内積は2つのベクトルの向きの一致度を数値で表す計算で、同じ向きなら+1、直角なら0、逆向きなら-1となる。これを利用してキャラクターの前後判定や視野角の計算などを効率的に実装できる。

出典: Unityで“内積”を使い倒す | Qiita公開日:

ITニュース解説

ゲーム開発、特にUnityを用いた3D空間のプログラミングにおいて、オブジェクトの位置や向き、相互作用を数学的に扱うことは避けて通れない。その中で、一見すると複雑な空間関係の問題を、驚くほどシンプルかつ効率的に解決してくれる強力なツールが「内積」である。内積は、高校数学で学ぶ概念だが、その本質と応用を理解することは、ゲームの挙動をより高度に、そして直感的に制御するための鍵となる。

内積とは、二つのベクトルがどれほど同じ方向を向いているかを示す指標であり、その結果は-1から+1の範囲に収まる単一の数値(スカラー)で表される。ここでいうベクトルとは、向きと大きさを持つ量のことである。Unityの世界では、オブジェクトの位置座標、移動する方向、キャラクターが向いている方角、オブジェクトに働く力など、様々なものがベクトルとして表現される。このベクトル同士の関係性を調べるのが内積の役割だ。

内積の計算結果が持つ意味は非常に明快である。計算対象となる二つのベクトルの長さをそれぞれ1にそろえた状態(この処理を「正規化」と呼ぶ)で内積を求めると、結果が+1であれば、二つのベクトルは完全に同じ向きを指していることを示す。逆に-1であれば、完全に真逆の向きを指していることを意味する。そして、結果が0の場合は、二つのベクトルが互いに90度、つまり直角に交わっている状態を表す。このように、二つのベクトルの向きの関係性を、-1から+1までの一つの数値で定量的に評価できる点が、内積の最大の強みである。

この単純な性質は、ゲームプログラミングにおいて極めて多彩な応用を可能にする。最も直感的で多用される例が、あるオブジェクトが自分の「前方」にあるか「後方」にあるかを判定する処理だ。例えば、プレイヤーキャラクターの視点から見て、敵が正面にいるかどうかを知りたい場合を考える。このとき、「プレイヤーの前方を指すベクトル」と、「プレイヤーの位置から敵の位置へ向かうベクトル」の二つを用意する。そして、この二つのベクトルの内積を、Unityに標準で用意されている Vector3.Dot といった関数を用いて計算する。もし計算結果が正の値(0より大きい)であれば、敵はプレイヤーの前方にいると判断できる。逆に負の値であれば後方にいると判断できる。これにより、複雑な座標計算や角度計算を一切行わずに、瞬時に前後関係を把握することが可能となる。

この前後判定をさらに発展させると、敵がプレイヤーの特定の「視野角」内に入っているかどうかの判定も効率的に実装できる。内積の値は、二つの正規化されたベクトルがなす角度をθとしたときのcosθの値と等しくなるという重要な性質を持つ。例えば、プレイヤーの視野角を左右合わせて120度(つまり、正面から左右それぞれ60度)に設定したいとする。cos(60度)の値は約0.5である。したがって、先ほどと同様に「プレイヤーの前方ベクトル」と「プレイヤーから敵へのベクトル」の内積を計算し、その値が0.5より大きければ、敵は視野角120度の範囲内にいると判定できる。角度そのものを求めるには計算コストの高い逆三角関数(acos)が必要になるが、内積を使えば単純な乗算と加算、そして大小比較だけで済むため、処理が非常に高速になる。これは、多数のキャラクターが動くゲームにおいてパフォーマンスを維持する上で極めて有効な手法である。

さらに、内積は特定の方向に対する成分を抽出する「投影」という考え方にも応用される。例えば、キャラクターが斜面を滑り降りる際の挙動を考える。重力は常に真下に向かって働くが、キャラクターを実際に加速させるのは、斜面に沿って滑り落ちる方向の力だけである。この「斜面に沿った力の成分」を正確に求める際に内積が活躍する。「真下を指す重力ベクトル」と「斜面の傾斜方向を指すベクトル」の内積を計算することで、重力がどれだけ斜面方向の移動に寄与するかを数値化できる。これにより、坂道の角度に応じたリアルな物理挙動を実装することが可能になる。

また、オブジェクトと平面との位置関係を調べる際にも内積は有用だ。平面には、その面に垂直な「法線ベクトル」というものが存在する。この法線ベクトルと、「平面上の一点から対象オブジェクトへ向かうベクトル」の内積を計算すると、オブジェクトから平面までの「符号付きの最短距離」が求まる。結果の符号によってオブジェクトが平面のどちら側にあるかが分かり、値の絶対値が平面からの距離を示す。これを利用すれば、キャラクターが水中に進入したかどうかの判定や、特定のエリアへの侵入検知などを簡単かつ正確に実装できる。

このように、内積はベクトル間の向きの一致度を数値化するというシンプルな概念でありながら、ゲーム内の様々な状況判断や物理計算の根幹を支える、非常に強力で汎用性の高いツールである。前後判定、視野角判定、力の成分分解、平面との距離計算など、その応用範囲は多岐にわたる。3D空間におけるオブジェクト間の関係性をシンプルかつ高速に解決するための、システムエンジニアやゲーム開発者にとって必須の知識と言えるだろう。