top of page
搜尋

遊戲編程中判定兩個物件的接觸

  • ctfm214
  • 6月12日
  • 讀畢需時 4 分鐘

在遊戲編程中,判定兩個物件的接觸(碰撞檢測)是非常常見且重要的功能,尤其是在物理引擎、角色控制或敵人和玩家交互的場景中。以下是一些方法和技術,根據遊戲開發需求的複雜程度進行選擇:

1. 基於區域的碰撞檢測 (Bounding Box Collision)

這是最簡單,也是最常用的一種碰撞檢測技術,特別適合簡單的遊戲場景。

A. 軸對齊邊界框(AABB, Axis-Aligned Bounding Box)

  • 每個物件用一個矩形框包裹,並檢查這些矩形框是否有重疊。

  • 適用於物件不旋轉且邊界對齊軸心的情況(例如 2D 平面遊戲)。

檢測公式 (2D):

python

執行複製

if (box1.x < box2.x + box2.width and
    box1.x + box1.width > box2.x and
    box1.y < box2.y + box2.height and
    box1.y + box1.height > box2.y):
    # 兩個物件有接觸

檢測公式 (3D):類似於 2D,只需加上 Z 軸的檢測:

python

執行複製

if (box1.x < box2.x + box2.width and
    box1.x + box1.width > box2.x and
    box1.y < box2.y + box2.height and
    box1.y + box1.height > box2.y and
    box1.z < box2.z + box2.depth and
    box1.z + box1.depth > box2.z):
    # 兩個物件有接觸

B. 圓形碰撞檢測 (Circle Collision)

  • 適用於圓形或近似圓形的物件,例如球體。

  • 檢測兩個圓心之間的距離是否小於兩個半徑之和。

檢測公式:

python

執行複製

dx = circle1.x - circle2.x
dy = circle1.y - circle2.y
distance = sqrt(dx * dx + dy * dy)
if distance < (circle1.radius + circle2.radius):
    # 兩個圓形接觸

2. 精確碰撞檢測

當需要更加精確的碰撞檢測時(例如像素精度或多邊形檢測),可以採用以下方法。

A. 多邊形碰撞檢測 (Polygon Collision)

  • 使用凸多邊形進行檢測,通常採用 分離軸定理 (SAT, Separating Axis Theorem)

  • SAT 的原理是:如果能找到一個軸,讓兩個多邊形在該軸上的投影範圍不重疊,則兩者不相交。

步驟:

  1. 對兩個多邊形的邊計算法線(分離軸)。

  2. 將多邊形的頂點投影到法線上。

  3. 檢查投影區間是否重疊。

這種方法非常精確,但計算成本較高。

B. 像素級碰撞檢測 (Pixel Perfect Collision)

  • 適用於 2D 遊戲中需要非常精確的碰撞檢測,例如角色和背景的接觸。

  • 過程是檢查兩個物件的像素圖是否有重疊的非透明部分。

步驟:

  1. 獲取兩個物件的邊界框,判定是否存在重疊。

  2. 將重疊區域的像素從兩個物件中提取出來。

  3. 判斷重疊部分是否都為非透明的像素。

這種方法需要讀取像素數據,計算成本高,通常用於小範圍的精確碰撞。

3. 使用物理引擎進行碰撞檢測

如果遊戲較為複雜,可以使用現成的物理引擎來處理碰撞檢測問題,這些引擎提供了高效且可靠的碰撞檢測功能。

常用物理引擎:

  • Box2D: 適用於 2D 遊戲,支持 AABB、圓形和多邊形的碰撞檢測。

  • Bullet: 適用於 3D 遊戲,可處理剛體和軟體的碰撞。

  • Unity 的內置物理引擎 (PhysX): 支持 2D 和 3D 碰撞檢測。

  • Godot 的物理系統: 提供 2D 和 3D 的碰撞檢測模組。

使用方法:

  1. 為物件添加碰撞體(Collider),如 BoxCollider、SphereCollider 或 PolygonCollider。

  2. 設置剛體(Rigidbody)或靜態物體。

  3. 使用引擎的事件監聽功能檢測碰撞,例如 Unity 的 OnCollisionEnter 或 OnTriggerEnter。

Unity 示例 (C#):

csharp

複製

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.tag == "Enemy")
    {
        Debug.Log("與敵人接觸!");
    }
}

4. 分層碰撞檢測 (Collision Layering)

  • 在大型遊戲中,可以將物件分成不同的碰撞層。例如,玩家角色只與敵人和障礙物層檢測,而不與背景層檢測。

  • 減少不必要的碰撞檢測,提高性能。

Unity 示例:

  • 使用 "Layer Mask" 設定哪些層可以互相碰撞。

  • 通過 Physics.Raycast 限定檢測的層。

5. 優化碰撞檢測

隨著遊戲規模的增大,碰撞檢測的計算成本可能會成為性能瓶頸。以下是一些常見的優化方法:

A. 空間劃分技術

  • 四叉樹 (Quadtree) 或 八叉樹 (Octree):

    • 將遊戲世界劃分為多個區域,只檢測位於相同區域或相鄰區域的物件。

  • 網格劃分 (Grid Partitioning):

    • 將物件分佈到固定大小的網格中,僅檢查同一網格內的物件。

B. 廣相檢測和窄相檢測

  • Broad Phase (廣相檢測):

    • 使用簡單算法(如 AABB)快速排除不可能碰撞的物件。

  • Narrow Phase (窄相檢測):

    • 對可能發生碰撞的物件進行精確檢測(如 SAT 或像素級檢測)。

  • https://ps.hket.com/article/3856459


總結

判定兩個物件的接觸可以根據遊戲的需求選擇不同的方法,從簡單的邊界檢測到精確的像素檢測,再到使用現成的物理引擎。對於大型遊戲,考慮性能優化是至關重要的,例如使用空間劃分技術和分層碰撞檢測。選擇合適的技術和工具能讓遊戲運行更高效,並提升玩家體驗。

 
 
 

最新文章

查看全部
新興潮玩品牌和模綫

**“和模线”**(Harmonia Line)是中国新兴的科幻机甲与机娘拼装模型品牌,专注于原创IP开发与精密设计,其产品以高细节度、创新题材和强故事性为特色。以下是该品牌的核心信息梳理: https://bit.ly/4e6ivgL ### 🔍...

 
 
 
3D打印0.2mm之調整

以下是用0.2mm噴嘴3D打印機搭配PLA物料打印小型模型的**完整指南** --- ### **一、硬件準備與參數設定** #### 1. **噴嘴與耗材特性** - **0.2mm噴嘴優勢**:最小細節可達0.1mm,適合<5cm的微縮模型(如桌遊棋子、珠寶設計)。...

 
 
 

Comments


  • LinkedIn

©2022

bottom of page