【Python】2D・3D空間における当たり判定の書き方を解説

この記事では、2D空間と3D空間におけるオブジェクト同士の当たり判定方法を解説します。

さらに、Pythonを使用して簡単なサンプルコードを通じて具体的な実装方法を紹介します。

初心者の方でもわかりやすく、ゲーム開発などで役立つ知識を得ることができます。

目次から探す

当たり判定とは

当たり判定とは、ゲーム開発やシミュレーションなどのプログラムで、オブジェクト同士が接触しているかどうかを判定する処理のことを指します。

例えば、キャラクター同士がぶつかったときに反応させたり、弾が敵に当たったときにダメージを与えたりする際に利用されます。

当たり判定は、2D空間だけでなく3D空間でも重要な要素となります。

次のセクションでは、2D空間と3D空間における当たり判定の実装方法について詳しく解説していきます。

2D空間における当たり判定の実装方法

矩形同士の当たり判定

矩形同士の当たり判定を行うには、各矩形の座標やサイズを比較することで衝突を検知します。

以下は簡単なサンプルコードです。

def check_collision(rect1, rect2):
    if (rect1.x < rect2.x + rect2.width and
        rect1.x + rect1.width > rect2.x and
        rect1.y < rect2.y + rect2.height and
        rect1.y + rect1.height > rect2.y):
        return True
    return False

# 矩形の座標とサイズを定義
rect1 = {'x': 0, 'y': 0, 'width': 50, 'height': 50}
rect2 = {'x': 30, 'y': 30, 'width': 40, 'height': 40}

if check_collision(rect1, rect2):
    print("矩形同士が衝突しています")
else:
    print("矩形同士は衝突していません")
衝突判定のサンプル(赤い部分が衝突した箇所)

このサンプルコードでは、2つの矩形が衝突しているかどうかを判定しています。

円同士の当たり判定

円同士の当たり判定は、2つの円の中心座標と半径の距離を比較することで衝突を検知します。

以下は円同士の当たり判定のサンプルコードです。

import math

def check_collision(circle1, circle2):
    distance = math.sqrt((circle1.x - circle2.x)**2 + (circle1.y - circle2.y)**2)
    if distance < circle1.radius + circle2.radius:
        return True
    return False

# 円の中心座標と半径を定義
circle1 = {'x': 0, 'y': 0, 'radius': 30}
circle2 = {'x': 40, 'y': 0, 'radius': 20}

if check_collision(circle1, circle2):
    print("円同士が衝突しています")
else:
    print("円同士は衝突していません")
衝突イメージ

このサンプルコードでは、2つの円が衝突しているかどうかを判定しています。

点と矩形の当たり判定

点と矩形の当たり判定は、点の座標が矩形の範囲内にあるかどうかを判定します。

以下は点と矩形の当たり判定のサンプルコードです。

def check_collision(point, rect):
    if (point.x >= rect.x and point.x <= rect.x + rect.width and
        point.y >= rect.y and point.y <= rect.y + rect.height):
        return True
    return False

# 点の座標を定義
point = {'x': 5, 'y': 5}
# 矩形の座標とサイズを定義
rect = {'x': 0, 'y': 0, 'width': 10, 'height': 10}

if check_collision(point, rect):
    print("点と矩形が衝突しています")
else:
    print("点と矩形は衝突していません")
短径の内側なら衝突とみなされる

このサンプルコードでは、点が矩形内にあるかどうかを判定しています。

点と円の当たり判定

点と円の当たり判定は、点と円の中心座標と半径の距離を比較することで衝突を検知します。

以下は点と円の当たり判定のサンプルコードです。

import math

def check_collision(point, circle):
    distance = math.sqrt((point.x - circle.x)**2 + (point.y - circle.y)**2)
    if distance < circle.radius:
        return True
    return False

# 点の座標を定義
point = {'x': 5, 'y': 5}
# 円の中心座標と半径を定義
circle = {'x': 0, 'y': 0, 'radius': 10}

if check_collision(point, circle):
    print("点と円が衝突しています")
else:
    print("点と円は衝突していません")
円の内側なら衝突とみなされる

このサンプルコードでは、点と円が衝突しているかどうかを判定しています。

1 2 3
目次から探す