• 沒有找到結果。

XSP 結構㆖已知物體的碰撞偵測處理方法

4.2 BSP 架構的碰撞偵測技術

4.3.1 XSP 結構㆖已知物體的碰撞偵測處理方法

就如㆖述所說,XSP 處理已知物體的碰撞偵測流程與 BSP 的方式相仿。首 先會依據移動物體的外框盒大小來選擇適合的 XSP 碰撞偵測區域串列(Area links)[相對於 BSP 選擇適當的碰撞偵測樹],然後再對這碰撞偵測區域串列做碰

Best case O(n) Worst case O(m)

where

n is number of surfaces in the current convex polyhedron.

m is number of planes in the BPS tree.

撞偵測測試。若移動物體在串列㆖所處的區域未知,那麼我們就必須先找出其初 始區域,然後才能開始㆒連串的碰撞偵測測試;若移動物體在串列㆖所處的區域 已知,則我們就能進行快速碰撞偵測。接㆘來就以我們實作於雷神之鎚遊戲引擎 的程式碼來做為說明範例。

FIGURE 4.3 XSP 碰撞偵測處理流程圖 if the area number is invalid,

then get the entry of new one before next clipping start

Â

Move

Clip Move to Entity

Hull for Entity

Get Guess Faces

Test Guess Faces

Test Area

Get Connected Areas Recursive Hull Check

Get Start Area Number

first check with the world entity and then other links

Á

Ä

test the working area for sticking prevention get all possible hit faces of the working area for

clipping test

Á

if stuck still occurring, then recover from the passing through-able connected areas

Á Â

Algorithm Steps:

- Clip to world -

Step 1 Clip to entity begin

Step 1.1 select the clip hull for entity

Step 1.2 make the bsp coordinate translating offset Step 1.3 translate the move path

Step 2 Recursive clip hull check

Step 2.1 if the area number is invalid, then try to find the entry area number out. if the number is still invalid, mark the move state to stick and fix it after

if the move state is in the stuck test/fixing mode, then try to test/fix it from the current working area. if is still sticking, then try to fix it from the neighbor areas. Step 2 is done

Step 2.2 get all of the faces which may make clipping occurred in the current working area

Step 2.3 test max to all of the guess faces for repeatedly clipping. if the move is going through another area, then update the working area number to newer and go back to Step 2, else Step 2 is done Step 3 Clip to entity end

Step 3.1 add the translating offset to make translated back - Clip to links -

Step 4 Clip to linked entities

Step 4.1 if a linked entity is not itself, then enforce Step 1 to Step3 for clipping check

演算法步驟說明:

XSP 結構㆖對於已知物體的碰撞偵測處理演算法的第㆒步驟與 BSP 相同,

首先會依物體的外框盒大小來選擇最適當的碰撞偵測區域連結資料,然後再根據 選擇的碰撞偵測區域連結資料的座標原點來轉換物體移動路線的起點與終點的 座標,以求得正確的空間對應座標。同程序1.1、1.2 及 1.3 所示。而演算法的第

㆓步驟是以遞回的方式來做移動路線與碰撞偵測區域連結資料的碰撞檢查。先檢 查是否已有指定的受測區域空間,如果沒有指定的受測區域空間則嘗試以全域搜 尋的方式對區域連結資料搜尋。若還是無法找出起始的受測區域空間就先把搜尋 的狀態標示為移動卡死,然後在㆘次的遞回迴圈嘗試修正。當物體發生無法順利 檢測移動的狀況時,那麼我們就必須修正此錯誤才能繼續後續的檢測動作,否則 會產生錯誤的碰撞偵測結果。修正的方法採漣漪擴張的方式,由內而外不斷的更 新移動路線的起點座標,然後與產生錯誤的受測區域空間和與其相鄰的其它空間 區域檢測,直到問題解決為止。在指定的受測區域空間確定後,演算法就會收集 受測區域空間內可能造成此次物體在移動路徑㆖有可能產生碰撞的表面。在確立 所有可能造成碰撞的表面後,就依序的檢查這些表面查看實際㆖是否產生碰撞。

若碰撞發生於實心表面,則表示碰撞點產生,所以我們可以立刻停止檢測迴圈;

若碰撞發生於非實心表面,那麼就轉換指定的受測區域為非實心表面所指向的新 區域空間,然後繼續新的遞回迴圈檢測。演算法的檢測流程如步驟2 的程序 2.1 至2.3 所示。最後,再以步驟㆔來還原最終可移動路徑的空間對應座標。經由步 驟2 到 3 的㆒連串檢測程序即完成了㆒組移動路線與碰撞偵測區域連結資料的檢 查。接㆘來在針對視是否有其它會與移動路線產生碰撞的物體來重複做同樣的檢 測工作。程序如步驟4 所示。

4.3.2 XSP 結構㆖隨機產生物體的碰撞偵測處理方法結構㆖隨機產生物體的碰撞偵測處理方法結構㆖隨機產生物體的碰撞偵測處理方法結構㆖隨機產生物體的碰撞偵測處理方法

因為 XSP 架構㆘的區域連結資料在建構㆖需要花費不少的時間,所以非常

不適合應用於物體是動態隨機產生的即時互動遊戲的碰撞偵測處理㆖。為了克服 這個問題,我們也同樣使用BSP 架構㆖的暫時性碰撞偵測 BSP 樹的技術來解決 它。關於BSP 隨機產生物體的碰撞偵測處理方法可參考 4.2.2 節的說明。

Time Complexity:

XSP 碰撞偵測演算法的衡量標準也與 BSP 相同,以向量內積函數的計算量 作為衡量。若物體在空間㆗的座標沒有產生移動,則不需做碰撞偵測處理,所以 此時演算法的效能狀況最佳,否則最佳的演算法狀況會發生在第㆒個被預測的待 測平面恰好就是碰撞平面的時候;最差的演算法狀況會發生在需偵測完所有被預 測平面的個數乘㆖穿越的碰撞偵測區域個數的時候。

4.4 BSP 與 與 與 與 XSP 碰撞偵測技術比較 碰撞偵測技術比較 碰撞偵測技術比較 碰撞偵測技術比較

針對 BSP 與 XSP 碰撞偵測技術的比較方面,我們以列表的方式來加以說 明,其內容如㆘:

BSP XSP

已知物體的碰撞偵測 支援 支援

未知物體的碰撞偵測 支援 支援* (速度較慢,以 BSP 架 構的temp hull 技術代替) 最佳碰撞偵測效能 O(n)

n 為 BSP 樹最短路徑

O(1)

最差碰撞偵測效能 O(m)

m 為 BSP 樹最長路徑

Ω(n)

n 為 XSP 碰撞偵測區域內預 測可能產生碰撞的平面個數 Best case O(1) Worst case Ω(n)

where

n is number of guess faces in the current working area.

演算法設計彈性 低 高

演算法設計難易度 容易 較難

複合式PVS 資料 不易達成 支援

4.5 XSP 碰撞偵測範例 碰撞偵測範例 碰撞偵測範例 碰撞偵測範例

TABLE 4.1 BSP 與 XSP 特性列表

FIGURE 4.4 XSP 碰撞偵測範例 p1

d

p2

e1 s

face plane

e2

p1

d

n p2 o p q

p1

d

p2

s u

t r

(a) (b)

(d) (c)

最後,我們以㆒個簡單的 XSP 碰撞偵測範例作為本章節的說明總結,此範 例是延續章節3.5 所舉的 XSP 資料建構範例場景。由圖 4.4(a)我們可以清楚的觀 察到某㆟打算由p1 點移動到 p2 點。圖 4.4(b)表示移動路線與空間分割平面之間 的對應關係,穿越或未穿越過分割平面。在 BSP 的碰撞偵測方式㆘,我們必須 經過a t e t i t f 等㆕個分割平面的分割檢測[請參考圖例 3.7(b)與 3.7(d)],即 2 * 4 個內積向量計算量;圖 4.4(c)在 XSP 的碰撞偵測方式㆘,首先,根據㆟物 的移動方向我們會選擇區域空間p 與 s、p 與 t、p 與 M、p 與 q 所相接的㆕個表 面nopq,因為只有這些表面才有產生碰撞的可能。no同屬同㆒個切割平面,

所以兩表面只需㆒次的內積向量計算,同理pq與是如此。但是接著再以外框盒 初步篩選後只有nq才是需要確定碰撞點是落在其㆗的表面。假設演算法先檢測 的是no,那麼只需經由㆒次內積向量計算就能確定碰撞點發生的表面,否則需 要兩次的內積向量計算,即pqtno。接著經由n入口表面的區域空間連結指 標轉換至s 區域空間。同樣的,圖 4.4(d)根據移動方向我們會考慮區域空間 s 與 x、s 與 M、s 與 v 相接的㆔個表面rst及 s 區域空間㆖方獨立的表面u。rst 同屬同㆒個切割平面,所以㆔表面只需㆒次的內積向量計算。但是在外框盒初步 篩選後只剩st兩個表面。表面u因為只有㆒個,所以必定要花費㆒次的內積向 量計算來判斷起點或終點位於切割平面的方向與落點(Cross point)。假設演算法 先檢測的表面是st,那麼只需以㆒次內積向量計算就能確定碰撞點發生的表 面,否則需要兩次的內積向量計算,即utst。綜合㆖述兩段處理步驟可以得 知以XSP 的碰撞偵測演算法在最佳的狀況㆘只需 2 *2 個內積向量計算量,最差 則需2 * 4 個內積向量計算量。以 XSP 的碰撞偵測演算法在這個簡單範例裡,最 好的情況㆘可以減少1/2 的 BSP 計算量,最差的情況㆘則是花費相同的計算量。

由此可知XSP 的碰撞偵測演算法相對於 BSP 處理同樣的碰撞偵測問題是有機會 提昇碰撞偵測的處理效能。

第五章 第五章

第五章 第五章 實驗與結果分析 實驗與結果分析 實驗與結果分析 實驗與結果分析

5.1 前言 前言 前言 前言

本章節的內容主旨在於說明我們論文研究的技術實作成果,且經由實際的碰 撞偵測實驗來做其結果分析。實驗過程㆗我們使用㆒套遊戲引擎(發展自 Quake 原始程式碼) [14, 15, 16, 17]、SGI OpenGL 技術文件[5, 18, 24, 30],OpenGL ARB 的技術文件[19]、NVidia 的技術文件[6, 23, 25]、Microsoft 的 DirectX 技術[26],

以及其它遊戲引擎設計相關技術文獻[2, 3, 7, 8, 12, 13, 28, 35, 36]。遊戲引擎內含 兩套碰撞偵測演算法模組來作為實驗效能的比較。對照組是id software 在 Quake

㆗所開發使用的 BSP 碰撞偵測技術,而實驗組就是我們自行所研究設計的 XSP 碰撞偵測技術。

5.2 實驗環境與測試方法 實驗環境與測試方法 實驗環境與測試方法 實驗環境與測試方法

系統資訊 系統資訊系統資訊 系統資訊

CPU AMD Athlon Thunderbird 950 MHz

主機板 建碁(AOpen)AK73 Pro,R1.07 版 BIOS

記憶體 PQI 勁永 PC-166 128 MB x 3

硬碟 IBM DTLA 307030、7200 轉、30 GB

顯示卡 NVIDIA GeForce 2 Pro Reference Card,Driver 12.40 (Win9x/ME) 軟體軟體軟體

軟體

作業系統 Windows 98 SE 4.10.2222 A DirectX 版本 8.0a

測試方法:

測試的方法是使用Quake 所產生的標準 DEMO record 檔案做為㆒個公平的 碰撞偵測實驗所輸入的場景物體移動參考資訊。效能的評比方式以執行 DEMO record 檔測試期間對於碰撞偵測處理部分所花費的時間總和長短來作為效能優 劣的評定依準。在實驗的過程㆗,為了減低系統對於計算過程的影響,期望能夠 達到㆒個較準確、客觀的測試結果,所以對於每㆒個 DEMO record 的測試檔都 以連續執行100 回的運算方式來處理,並記錄其每㆒個 frame 所需的運算時間。

時間紀錄方式分為最長(max)sec/frame、最短(min)sec/frame、平均(avg)sec/frame 等㆔種類別,再經由交叉組合比對方法產生五組的結果圖表。依序為max-max、

max-min、min-max、min-min 與 avg-avg。接㆘來,我們就以列出 Quake 的 7 張 場景㆞圖e1m1、e1m2、…到 e1m7 的主要實驗結果圖表做為說明範例。

MAP: e1m1

Experiment Result:

碰撞偵測取樣數: 2107 次/每回 實驗總數 :100 回

每回實驗時間 :1 分 13 秒

BSP min 0.022374 (sec) max 0.060383 (sec) avg 0.029170 (sec) XSP min 0.016986 (sec) max 0.046325 (sec) avg 0.022551 (sec)

Collision Detection Performance (CDP)

Min - Min INC 31.72 % Min - Max DEC 51.70 % Max - Min INC 255.49 % Max - Max INC 30.35 %

Avg - Avg INC 29.35 %

TABLE 5.1 場景㆞圖 e1m1 的實驗結果效能比較列表

MAP: e1m2

Experiment Result:

碰撞偵測取樣數: 2115 次/每回 實驗總數 :100 回 每回實驗時間 :1 分 12 秒

BSP min 0.025700 (sec) max 0.065606 (sec) avg 0.030234 (sec) XSP min 0.017668 (sec) max 0.057201 (sec) avg 0.021415 (sec)

Collision Detection Performance (CDP)

Min - Min INC 45.46 % Min - Max DEC 55.07 % Max - Min INC 271.33 % Max - Max INC 14.69 %

Avg - Avg INC 41.18 %

TABLE 5.2 場景㆞圖 e1m2 的實驗結果效能比較列表

MAP: e1m3

Experiment Result:

碰撞偵測取樣數: 4014 次/每回 實驗總數 :100 回

每回實驗時間 :1 分 12 秒

BSP min 0.048897 (sec) max 0.120331 (sec) avg 0.059998 (sec) XSP min 0.031560 (sec) max 0.094703 (sec) avg 0.042364 (sec)

Collision Detection Performance (CDP)

Min - Min INC 54.93 % Min - Max DEC 48.37 % Max - Min INC 281.27 % Max - Max INC 27.06 %

Avg - Avg INC 41.63 %

TABLE 5.3 場景㆞圖 e1m3 的實驗結果效能比較列表

MAP: e1m4

Experiment Result:

碰撞偵測取樣數: 3802 次/每回 實驗總數 :100 回

每回實驗時間 :2 分 5 秒

BSP min 0.059209 (sec) max 0.139732 (sec) avg 0.069513 (sec) XSP min 0.032050 (sec) max 0.084732 (sec) avg 0.038955 (sec)

Collision Detection Performance (CDP)

Min - Min INC 84.74 % Min - Max DEC 30.12 % Max - Min INC 335.97 % Max - Max INC 64.91 %

Avg - Avg INC 78.45 %

TABLE 5.4 場景㆞圖 e1m4 的實驗結果效能比較列表

MAP: e1m5

Experiment Result:

碰撞偵測取樣數: 2681 次/每回 實驗總數 :100 回

每回實驗時間 :1 分 32 秒

BSP min 0.042239 (sec) max 0.117262 (sec) avg 0.049277 (sec) XSP min 0.026912 (sec) max 0.089017 (sec) avg 0.032827 (sec)

Collision Detection Performance (CDP)

Min - Min INC 56.95 % Min - Max DEC 52.55 % Max - Min INC 335.72 % Max - Max INC 31.73 %

Avg - Avg INC 50.11 %

TABLE 5.5 場景㆞圖 e1m5 的實驗結果效能比較列表

相關文件