如 果 同 一 個 detector-region 中 所 有 的 三 角 形 都 是 屬 於 S+ 或 是 S−,則 該 detector-region 沒有自身碰撞。否則,根據 Jordan Curve Theorem,一個 positive-oriented 的三角形和一個 negative-positive-oriented 的三角形對,可能會發生自身碰撞。因 此,我們必須針對 (S+, S−)形成的三角形對以及 (S0, U ) 形成的三角形對做追 蹤,找出 potentially colliding pairs。
BVH 的每個節點都會有三個 flag,分別是 positive flag、negative flag 和 zero flag,flags 記錄該節點是否包含這三種類型的三角形。如同前面所說,我們將
藉由 BVH 追蹤找出 (S+, S−)的三角形對以及 (S0, U )的三角形對,進一步找出 potentially colliding pairs。
基本的 BVH 追蹤由兩個 BVHs 的根節點開始檢查,檢查兩個節點的 bounding volume 是否重疊,沒有重疊就不用繼續檢查子節點,表示物體沒有自身碰撞;如 果有重疊再針對兩個節點的四個子節點兩兩檢查,直到葉節點為止,每個葉節 點都存在著一個三角形,因此只要兩個節點都檢查到葉節點就能找出 potentially colliding pairs。
我們的做法類似基本的 BVH 追蹤,只是為了找出 (S+, S−)的三角形對,我 們會先檢查兩個 BVHs 節點的 flags,如果一個為 positive 一個為 negative,則繼續 檢查兩個節點的 bounding volume 是否重疊;不是則結束追蹤。此外如果一個節 點的子節點都是 positive 或者都是 negative,就不用檢查此節點和另一個節點的 bounding volume 是否重疊,直接檢查子節點。
同樣的要找出 (S0, U )的三角形對,先檢查一個 BVH 節點的 flag 是否為 zero,
不需要檢查另一個 BVH 節點的 flag 是哪種類型,若其中一個節點的 flag 是 zero,
則檢查兩個節點的 bounding volume 是否重疊,否則結束追蹤。
4.6 Duplicate Features
在 做 完 BVHs 的 追 蹤 後 我 們 將 搜 集 的 potentially colliding pairs 都 存 入 PCP Queue 中,PCP Queue 中的 potentially colliding pairs 都是在這個時間區間有可能發 生碰撞的三角形對,我們必須再進一步去測試這些三角形對是不是真的會發生碰 撞。
Figure 4.2: 三角形對的重複測試。
共享的 feature 可能會造成重複測試,如 Figure 4.2,舉例來說,假設我們 的 PCP Queue 中有 (T0, T2),(T1, T2)這兩個 potentially colliding pairs,(v0, f2)是 (T0, T2)其中一對 feature pair 也是 (T1, T2)的 feature pair,在做 elementary test 時,
會重複對這對 features 作測試。相同的情況,(v1, f2)和 (e0, e1)、(e0, e2)、(e0, e3) 也都是這兩對 potentially colliding pairs 所共同擁有的 feature pairs,這些多餘的測 試都是不需要的。
我們利用 procedure representative triangles [TCYM09] 來解決 feature 重複測試 的問題。在前置處理時,會先將每個點所相鄰的三角形都存入該點的 oneRingList 中,如 Figure 4.3。一組 potentially colliding pairs (T1, T2)要做 vf -test,v 屬於 T1,
Figure 4.3: Procedure representative triangles: vf -test。
f 屬於 T2,在 v 的 oneRingList 的三角形中,只有第一個三角形是有被 assigned v 這個 feature,所以我們要做 vf -test 前,必須先檢查 T1 是不是 v 的 oneRingList 中 的第一個,若不是就不需要作 vf -test。在這裡 v 的 oneRingList 的順序是固定的。
ee-test 也是類似的情況,和一條邊 e 相鄰的兩個面,只有其中一個被 assigned e 這 條邊,一組 potentially colliding pair (T1, T2)要做 ee-test,e1 屬於 T1,e2 屬於 T2, 若 T1 沒被 assigned e1或 T2沒有被 assigned e2,我們就不處理這組 feature pair。
Chapter 5
Implementation and Results
在這個章節我們將對實作的細節部分作敘述,首先對於我們要拿來比較的兩 個方法:ICCD 以及利用 K-means 分割物體作 detector-based 碰撞偵測的方法敘述 實作細節,接下來討論一些其他實作上參數的細節部分,最後展示出我們作的實 驗以及實驗的結果。
我 們 使 用 Microsoft Visual Studio 2008 C++ 撰 寫 我 們 的 系 統,執 行 環 境 為 Intel(R) Core (TM)2 Quad CPU Q9400 @ 2.66GHz,4GB 的 RAM,32-bit Windows 7 的作業系統。
5.1 ICCD
在這個章節,我們敘述我們是如何實作 ICCD [TCYM09]。總括 ICCD 的流 程,在前置處理的過程,先將相鄰三角形對需要作 elementary test 的 feature pairs 存入 orphan set,並對物體建立 BVH。在執行時間,利用 continuous normal cone 將物體表面分成好幾個 regular patches。在追蹤的過程,每個 regular patch 經過 continuous contour test 來決定一個 regular patch 是否發生自身碰撞,若發生碰撞則 對此 regular patch 的兩個 sub-patches 繼續作 continuous contour test,遞迴這樣的過 程直到找出 potentially colliding pairs;若一個 regular patch 通過 continuous contour test,表 示 這 個 regular patch 沒 有 自 身 碰 撞 發 生,結 束 追 蹤。並 利 用 procedure representative triangles 處理不相鄰的 potentially colliding pairs,orphan set 則處理
相鄰的 potentially colliding pairs。Tang 等人在這篇論文的主要貢獻為: continuous normal cone、continuous contour test 和 orphant set,在我們的系統,相鄰的三角 形被視為不會發生碰撞,所以在這篇論文不對 orphan set 作討論,我們主要對 continuous normal cone 和 continuous contour test 敘述實作方法的細節。
5.1.1 Continuous Normal Cone
Normal cone 的觀念是: 給一個連續的表面 S,N 為 S 上任一點的法向量,若 能找到一個向量 V ,使得 (N · V ) > 0,我們就將 S,看成一個 regular patch,並 且存在一個 normal cone,而向量 V 則為這個 normal cone 的軸。Continuous normal cone 延伸了這個方法,在一個時間區間 [0,△t] 中,我們利用由下而上的方式 對一個物體的 BVH 節點檢查該表面是不是有 continuous normal cone 存在,在葉 節點的部分,一個三角形的法向量在 t = 0 時為 n0、在 t = △t 時的法向量為 n△t,在這個時間區間中,此三角形的法向量不會超出 n0 和 n△t的範圍,我們將
n0+n△t
2 定義為葉節點 continuous normal cone 的軸,而將 n0和 n△t夾角的一半視為 此 continuous normal cone 的夾角 α。而在每個內部節點,我們則利用兩個子節點 的 continuous normal cones 來更新此節點的 continuous normal cone。
Figure 5.1: 利用兩個子節點的 continuous normal cones,算出一個節點的 continuous normal cone 之示意圖,灰色是兩個子節點的 continuous normal cones,黑色是此節 點的 continuous normal cone。
見圖 Figure 5.1,兩個子節點的 continuous normal cones 軸分別為 axis0、axis1, 夾角 α 分別為 α0、α1,我們將此節點 continuous normal cone 的軸定義為:
axis = normalize(axis0+ axis1), (5.1)
而此 continuous normal cone 的 α 為:
α = β/2 + max(α0, α1), (5.2)
β為 axis0和 axis1 的夾角 [Pro97]。
我們會在每個節點定義一個布林值,作為一個節點是否有 cone 存在的指標,
若一個節點的 α 值小於 π,我們就視此節點有 cone 存在,追蹤時若一個節點有 cone 存在,該節點所有的三角形則被視為一個 regular patch。
5.1.2 Continuous Contour Test
我們在前置處理時會先將每個節點的表面輪廓用 linklist 存在節點中,在追 蹤時,若一個節點有 cone 存在,則進一步做 continuous contour test。Continuous contour test 首先要先將此節點的輪廓投影到一平面,此平面的法向量為 cone 的軸 V,並且每對投影的邊都要做邊和邊的碰撞測試 planar-EE Test,若兩條邊在一個 時間區間要發生碰撞,那麼一定會在一個時間點發生一條邊的其中一點和另一條 邊共線的情況,因此在 planar-EE Test 中,我們可以將其簡化成四次點和邊的碰撞 測試 planar-VE Test。若四次的 planar-VE Test 都沒有發生碰撞,表示作 planar-EE Test 測試的兩條邊沒有發生碰撞,若每對邊都沒有發生碰撞,則此節點的整個表 planar-EE Test。在 planar-EE Test 部分,也對每條投影的邊做 bounding volume,
若兩條輪廓邊的 bounding volume 有重疊,我們才將此兩條邊作 planar-EE Test。