3Dモデルの三角形(ポリゴン)で、正確な当たり判定を実装したい。
レイと三角形の交点を計算して、衝突判定を行いたい。
そんな場面で必要なのが、三角形の当たり判定です。
三角形の当たり判定は、ポリゴンベースの衝突判定に欠かせない技術です。
3Dモデルは、複数の三角形(ポリゴン)で構成されています。
その三角形との衝突を判定すれば、より精密な当たり判定ができます。
この記事では、三角形の当たり判定について、Unity実装例とともに解説します。
- 三角形の当たり判定の方法が分からない…
- レイと三角形の交点計算が理解できていない。
- ポリゴンベースの衝突判定を実装したい。
✨ この記事でわかること
- 三角形の当たり判定の基本概念
- レイと三角形の交点計算
- バリ中心座標を使った判定方法
- Unityでの実装手順とコード例
- 初心者でも理解できる衝突判定の考え方
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます
三角形当たり判定とは何か(ゲーム制作目線)

三角形の当たり判定は、レイ(光線)と三角形の交点を計算する処理です。
レイは、始点と方向ベクトルで表される直線です。
三角形は、3つの頂点で定義されるポリゴンです。
この2つが交わるかどうかを判定すれば、より精密な衝突判定ができます。
3Dモデルは、複数の三角形で構成されているため、三角形単位での判定が重要です。
Unityでは、Physics.RaycastやMeshの情報を使って、実装できます。
ゲームでの具体的な使い道

三角形の当たり判定が、ゲームでどう使われているか確認してみましょう。
レイキャストによる当たり判定
マウスの位置から、3D空間にレイを飛ばして、オブジェクトを選択します。
UIのクリック判定などに使われます。
精密な衝突判定
ボックスやスフィアなどの簡単な形状では表現できない、複雑な形状での衝突判定に使われます。
3Dモデルの形状に合わせた、正確な当たり判定ができます。
メッシュとの衝突判定
メッシュ(3Dモデル)の各三角形と、レイやオブジェクトの衝突を判定します。
地形との衝突判定や、オブジェクトの配置判定などに使われます。
ポリゴン単位での判定
メッシュの特定のポリゴンとの衝突を判定します。
パーツごとの当たり判定や、詳細な衝突情報の取得に使われます。
- レイキャストによるオブジェクト選択
- 精密な衝突判定(複雑な形状)
- メッシュとの衝突判定(地形、オブジェクト配置)
- ポリゴン単位での判定(パーツごとの衝突)
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

三角形の当たり判定は、「レイの方程式 → 三角形の平面方程式 → 交点の計算 → バリ中心座標での判定」という流れで実現できます。
レイの方程式
レイは、始点P0と方向ベクトルDで表されます。
レイ上の点は、P(t) = P0 + t * D で表されます(tはパラメータ)。
三角形の平面方程式
三角形は、3つの頂点V0、V1、V2で定義されます。
3点を通る平面の方程式を求めます。
交点の計算
レイと平面の交点を計算します。
交点が、三角形の内部にあるかを判定する必要があります。
バリ中心座標での判定
交点が三角形の内部にあるかは、バリ中心座標(重心座標)を使って判定します。
3つの頂点への重みがすべて正の値なら、交点は三角形の内部にあります。
- 三角形の当たり判定は、レイと三角形の交点を計算する処理
- 交点が三角形の内部にあるかは、バリ中心座標で判定する
- 3Dモデルは複数の三角形で構成されているため、各三角形との判定が重要
- より精密な衝突判定を実現できる
Unityで実装する際の注意点(代表例)

Unityで三角形の当たり判定を実装する場合の注意点を見ていきましょう。
Physics.Raycastを使った判定
UnityのPhysics.Raycastを使った、簡単なレイキャスト判定です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void Update() { if (Input.GetMouseButtonDown(0)) { // カメラからマウス位置へのレイを生成 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // レイキャストで衝突判定 RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Debug.Log($"衝突したオブジェクト: {hit.collider.name}"); Debug.Log($"衝突点: {hit.point}"); } } } |
カスタムの三角形判定
バリ中心座標を使った、カスタムの三角形判定です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
public static bool RayTriangleIntersection( Vector3 rayOrigin, Vector3 rayDirection, Vector3 v0, Vector3 v1, Vector3 v2, out Vector3 intersectionPoint) { intersectionPoint = Vector3.zero; // 三角形の2つの辺を計算 Vector3 edge1 = v1 - v0; Vector3 edge2 = v2 - v0; // 法線ベクトルを計算(外積) Vector3 h = Vector3.Cross(rayDirection, edge2); float a = Vector3.Dot(edge1, h); // レイが平面と平行な場合 if (Mathf.Abs(a) < 0.0001f) return false; float f = 1.0f / a; Vector3 s = rayOrigin - v0; float u = f * Vector3.Dot(s, h); // バリ中心座標のuが範囲外 if (u < 0.0f || u > 1.0f) return false; Vector3 q = Vector3.Cross(s, edge1); float v = f * Vector3.Dot(rayDirection, q); // バリ中心座標のvが範囲外 if (v < 0.0f || u + v > 1.0f) return false; // 交点までの距離 float t = f * Vector3.Dot(edge2, q); if (t > 0.0001f) // レイの前方 { intersectionPoint = rayOrigin + rayDirection * t; return true; } return false; } |
メッシュの三角形との判定
メッシュの各三角形とレイの衝突を判定します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public bool RayMeshIntersection(Mesh mesh, Transform meshTransform, Ray ray, out Vector3 hitPoint) { hitPoint = Vector3.zero; Vector3[] vertices = mesh.vertices; int[] triangles = mesh.triangles; // メッシュの各三角形と判定 for (int i = 0; i < triangles.Length; i += 3) { Vector3 v0 = meshTransform.TransformPoint(vertices[triangles[i]]); Vector3 v1 = meshTransform.TransformPoint(vertices[triangles[i + 1]]); Vector3 v2 = meshTransform.TransformPoint(vertices[triangles[i + 2]]); if (RayTriangleIntersection(ray.origin, ray.direction, v0, v1, v2, out hitPoint)) { return true; } } return false; } |
MeshColliderを使った判定
UnityのMeshColliderを使うと、メッシュとの衝突判定が簡単にできます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class MeshRaycast : MonoBehaviour { public MeshCollider meshCollider; void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (meshCollider.Raycast(ray, out hit, 100f)) { Debug.Log($"メッシュとの衝突: {hit.point}"); } } } |
バリ中心座標の理解
バリ中心座標は、三角形の3つの頂点への重みを表します。
すべての重みが正の値なら、点は三角形の内部にあります。
パフォーマンスの考慮
メッシュの全三角形と判定すると、処理が重くなります。
空間分割や、簡単な形状での前判定など、最適化が重要です。

まとめ

この記事では、三角形の当たり判定について見てきました。
重要なポイントをおさらいします。
- 三角形の当たり判定は、レイと三角形の交点を計算する処理
- 交点が三角形の内部にあるかは、バリ中心座標で判定する
- UnityのPhysics.RaycastやMeshColliderで簡単に実装できる
- カスタム実装では、バリ中心座標を使った判定が重要
- メッシュの全三角形と判定する場合は、パフォーマンスに注意が必要
三角形の当たり判定は、ポリゴンベースの衝突判定に欠かせない技術です。
レイと三角形の交点を計算すれば、より精密な衝突判定ができます。
3Dモデルの形状に合わせた、正確な当たり判定を実現できます。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、当たり判定を含む衝突判定を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント