將螢幕座標(滑鼠位置)映射到遊戲世界中的邏輯物件,是幾乎所有遊戲必須解決的基本議題。
| 方法 | 原理 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 1. 包圍盒/框 | 為每物件建立矩形/球體包圍體,判斷點是否內含 | 簡單、效率高(O(n)) | 精度低、無法處理不規則形狀細節 | 2D/3D 物件數較少、形狀規則 |
| 2. 像素級枚舉 | 遍歷可見物件,檢測滑鼠座標對應像素是否非透明/有效 Z 值 | 精確至像素 | 效率極低 | 通常配合包圍盒做二階段篩選 |
| 3. 回饋緩衝區 | 離屏渲染時寫入物件 ID 到專用緩衝區,讀取滑鼠對應像素的 ID | 像素級精度、幾乎零額外效能損耗、OpenGL 內建支援 | 需完全控制渲染管線 | 3D 遊戲、複雜場景、即時策略遊戲 |
| 4. 直接映射(空間索引) | 場景以二維/多層陣列儲存,座標直接換算陣列索引 | O(1) 查詢、極快 | 限網格化場景、記憶體較大 | 棋類、戰棋、固定視角 3D |
color buffer[H][W]; // 後台緩衝區
color trans = RGB(0,0,0); // 定義透明色
object list[N]; // 繪製順序列表
stack picked; // 結果堆疊
color old = buffer[mx][my];
buffer[mx][my] = trans;
for (i=0; i
將單點判斷擴展為矩形區域,配合上述任一方法即可實現多選。