
開場一個粗篩之后到底怎么精確判斷的追問小王剛理解了物理流水線又冒出新疑問“老鳥前面說物理檢測分’寬階段’和’窄階段’。寬階段是粗篩’可能碰的物體對’我懂了。那窄階段具體干什么它不光要判斷’到底碰沒碰’還要算出’接觸點、法線、穿透深度’——這三個東西分別是什么為什么動態(tài)剛體必須要它們引擎具體怎么算出來的”老鳥說“窄階段是碰撞檢測的’精密工序’寬階段只是快速排除明顯不碰的窄階段才真正’一對一精確檢測’而且它的產(chǎn)出——接觸點、法線、穿透深度——是后面’物體怎么彈開’的唯一依據(jù)今天講透這三樣” 第一幕先定位窄階段在流水線的位置寬階段 vs 窄階段碰撞檢測分兩個階段 ① 寬階段(Broad Phase): → 快速粗篩可能碰的物體對 → 用AABB包圍盒等快速排除 → 目標: 排除明顯不碰的(省時間) ② 窄階段(Narrow Phase): ← 本篇 → 對寬階段篩出的可能碰的對 → 精確檢測到底碰沒碰 → 并算出詳細碰撞信息! ↓ 寬階段粗篩,窄階段精算!為什么要分兩階段如果直接對所有物體做精確檢測: → N個物體兩兩精確檢測 → 太貴! ↓ 先用寬階段(便宜)排除大部分不碰的: → 只剩少量可能碰的對 → 再對這少數(shù)做窄階段(貴但精確) ↓ 兩階段配合 又快又準!生動理解兩階段兩階段像安檢的粗篩細查 寬階段像金屬探測門 → 快速過一遍,響的才要細查 → 排除大部分沒問題的人 窄階段像開箱細查 → 對響的人仔細檢查 → 精確找出到底帶了什么 ↓ 先粗篩再細查 高效! 第二幕窄階段的第一職責——精確判斷碰沒碰寬階段的局限寬階段用包圍盒(AABB)粗判 → 兩個盒子重疊 可能碰 ↓ ?? 但盒子重疊不代表真的碰! 如: 兩個斜放的膠囊 → 包圍盒重疊了,實際沒接觸! ↓ 所以窄階段要精確判斷真的碰沒碰!圖示寬階段誤判兩個斜膠囊: ╱ 包圍盒: ┌───┐ ╲ │ ╱ │ ← 盒子重疊 ╱ │╱ │ └───┘ 包圍盒重疊 → 寬階段說可能碰 實際兩膠囊沒碰! ↓ 窄階段: 用精確幾何判斷真沒碰!窄階段的精確檢測窄階段根據(jù)實際形狀精確判斷 - 兩個球: 算圓心距離 vs 半徑和 - 凸體: 用GJK算法 - 精確到幾何層面! ↓ 輸出: 真的碰了還是沒碰生動理解精確判斷窄階段判斷像從大概位置重疊到真的接觸 寬階段: 這倆物體的地盤重疊了,可能碰 窄階段: 仔細看,它倆表面真的貼上了嗎? ↓ 精確到形狀的真實接觸! 第三幕核心產(chǎn)出①——接觸點(Contact Point)?接觸點是什么接觸點(Contact Point) 兩個物體實際接觸的位置 ↓ 就是: 碰撞發(fā)生在空間中的哪個點 ↓ 比如: 球撞墻 → 接觸點是球貼上墻的那個點為什么動態(tài)需要接觸點動態(tài)剛體彈開時,力要作用在接觸點上 ↓ 為什么? 因為力作用點影響是否產(chǎn)生旋轉(zhuǎn)! ↓ 例子: 你推箱子 - 推箱子正中 → 箱子直線滑 - 推箱子邊角 → 箱子會轉(zhuǎn)起來! ↓ 接觸點決定了碰撞后平移旋轉(zhuǎn)的表現(xiàn)!接觸點可能有多個?? 接觸不一定是一個點 球撞墻: 1個接觸點 盒子平放地面: 4個接觸點(四個角) ↓ 多個接觸點組成接觸流形(Contact Manifold) → 描述完整的接觸區(qū)域 ↓ 平面接觸需要多點才能穩(wěn)定支撐!生動理解接觸點接觸點像兩物體親吻的位置 球吻墻 → 一個吻點(1接觸點) 書平放桌面 → 四角都貼著(4接觸點) ↓ 力作用在這些點上 → 決定物體是滑、是轉(zhuǎn)、還是穩(wěn)穩(wěn)撐住! 第四幕核心產(chǎn)出②——碰撞法線(Normal)?碰撞法線是什么碰撞法線(Contact Normal) 碰撞的方向 物體該往哪個方向分開 ↓ 是一個方向向量: 指向兩物體應(yīng)該分離的方向 ↓ 比如: 球從上砸地 → 法線朝上(球該往上彈)為什么動態(tài)需要法線?法線決定物體往哪個方向彈開 ↓ 碰撞沖量沿著法線方向施加: - 球砸地,法線朝上 → 球往上彈 - 球撞左墻,法線朝右 → 球往右彈 ↓ 沒有正確的法線 → 不知道往哪彈! → 這就是凹網(wǎng)格矛盾法線的問題根源!圖示法線球砸地面 ? 球 ↑ 法線(朝上) ━━━━━━━━━ 地面 ↓ 球沿法線方向(朝上)彈開! 球撞右墻 ? → 法線朝左 ┃墻 ↓ 球沿法線(朝左)彈回!生動理解法線法線像碰撞的反彈方向指示牌 球砸地,指示牌指向上→ 球往上彈 球撞墻,指示牌指離開墻→ 球彈回 ↓ 法線告訴引擎該往哪個方向把物體推開! ↓ 凹網(wǎng)格問題: 多個三角形給多個矛盾指示牌 → 引擎不知聽誰的 → 抖動! 第五幕核心產(chǎn)出③——穿透深度(Penetration Depth)?穿透深度是什么穿透深度(Penetration Depth) 兩個物體陷進彼此多深 ↓ 因為物理是離散步進(每幀算一次): → 物體會先輕微陷進去才被檢測到 ↓ 穿透深度 需要把它們推開多少才不重疊為什么會有穿透物理每幀步進(不連續(xù)): 這一幀: 球在墻外一點 下一幀: 球已經(jīng)陷進墻里一點了! ↓ 檢測到時球已經(jīng)穿進去一點 → 這個進去的量就是穿透深度 ↓ 求解器要用它把球推回到剛好不穿!為什么動態(tài)需要穿透深度?穿透深度決定分離的力度 陷得越深 → 要推開的力越大 ↓ 求解器: 陷進去2cm → 施加沖量讓它退出2cm ↓ 沒有穿透深度 → 不知道推多少 → 要么推不夠(還嵌著) → 要么推太多(彈飛)! ↓ 這就是凹網(wǎng)格多個矛盾深度導致震蕩的根源!圖示穿透深度球陷進地面 ? ━━━━━╪━━━ 地面 ? 穿透深度(陷進0.02米) ↓ 求解器: 把球往上推0.02米 → 剛好不穿!生動理解穿透深度穿透深度像陷進泥里多深 腳陷泥里2cm → 要拔出2cm才出來 腳陷泥里5cm → 要拔出5cm ↓ 陷多深就拔多少 → 精確恢復! ↓ 凹網(wǎng)格: 每個三角形說陷的深度不同 → 該拔多少? 引擎亂了 → 震蕩!?? 第六幕三樣產(chǎn)出如何配合求解?三樣信息組合成接觸約束窄階段輸出的三樣 接觸點 法線 穿透深度 ↓ 組合成一個接觸約束(Contact Constraint) → 交給約束求解器 ↓ 求解器據(jù)此算出: 在接觸點、沿法線方向、 施加多大沖量把物體分開完整的碰撞響應(yīng)邏輯求解器用三樣信息算碰撞響應(yīng) ① 法線 → 決定彈開方向 ② 穿透深度 → 決定推開力度(位置修正) ③ 接觸點 → 決定力作用位置(是否旋轉(zhuǎn)) ↓ 三者齊全 → 物體正確、穩(wěn)定地彈開! ↓ 缺一不可!生動理解配合三樣配合像精確處理一次碰撞 法線(方向): 往這邊推! 穿透深度(力度): 推這么多! 接觸點(位置): 在這個點推! ↓ 方向力度位置齊全 → 物體完美彈開(該滑滑該轉(zhuǎn)轉(zhuǎn))! ↓ 這就是為什么動態(tài)必須要這三樣! 第七幕回連——為什么凹網(wǎng)格產(chǎn)出不了好的三樣現(xiàn)在能深刻理解凹網(wǎng)格的問題凹網(wǎng)格逐三角形檢測: 接觸點: 多個三角形 → 一堆零散接觸點 → 難以組織成一致的接觸流形 法線: 每個三角形一個法線 → 互相矛盾! → 不知往哪彈(抖動/彈飛) 穿透深度: 每個三角形一個深度 → 不一致! → 不知推多少(震蕩) ↓ 三樣全部不可靠、矛盾 → 動態(tài)求解崩潰! ↓ 凸體: 三樣都唯一、一致 → 完美!生動理解回連窄階段三樣產(chǎn)出 動態(tài)物理的原料: 凸體: 提供純凈一致的原料 → 求解器做出穩(wěn)定的碰撞響應(yīng) 凹網(wǎng)格: 提供矛盾混亂的原料 → 求解器做出崩潰的結(jié)果(抖動彈飛) ↓ 原料質(zhì)量決定成品! 凸性保證了原料純凈!? 窄階段理解檢查清單定位 □ 明白窄階段在寬階段之后? □ 明白寬階段粗篩、窄階段精算 □ 明白為什么分兩階段(效率) 第一職責 □ 明白窄階段精確判斷真碰沒碰 □ 明白寬階段包圍盒會誤判 三樣產(chǎn)出 □ 明白接觸點接觸的位置(影響旋轉(zhuǎn))? □ 明白法線彈開的方向? □ 明白穿透深度陷多深(決定推多少)? 配合 □ 明白三樣組成接觸約束 □ 明白求解器用三樣算碰撞響應(yīng) □ 明白方向力度位置缺一不可 回連 □ 明白凹網(wǎng)格三樣都矛盾→動態(tài)崩潰 □ 明白凸體三樣唯一一致→穩(wěn)定 一句話總結(jié)窄階段Narrow Phase的職責與目標窄階段是碰撞檢測的第二階段在寬階段粗篩可能碰的物體對之后負責對每一對可能碰的物體做精確的一對一檢測。它有兩大職責【職責一·精確判斷】寬階段只用包圍盒粗判盒子重疊就算可能碰會誤判——比如兩個斜膠囊包圍盒重疊實際沒碰窄階段則根據(jù)真實形狀精確判斷到底碰沒碰球算圓心距離、凸體用 GJK?!韭氊煻ぎa(chǎn)出碰撞信息】這是窄階段的核心價值產(chǎn)出三樣關(guān)鍵數(shù)據(jù)① 接觸點Contact Point——碰撞在空間中的實際位置決定力作用點推正中直線滑、推邊角會旋轉(zhuǎn)平面接觸會有多個點組成接觸流形② 碰撞法線Normal——物體該往哪個方向分開的方向向量決定彈開方向球砸地法線朝上就往上彈③ 穿透深度Penetration Depth——兩物體陷進彼此多深因為物理離散步進會先輕微穿透才檢測到?jīng)Q定要把它們推開多少陷 2cm 就推 2cm。這三樣組合成接觸約束交給求解器求解器據(jù)此算出在接觸點、沿法線方向、施加多大沖量把物體分開——方向法線 力度穿透深度 位置接觸點三者缺一不可物體才能正確穩(wěn)定地彈開。這也徹底解釋了凹網(wǎng)格的問題逐三角形檢測產(chǎn)出的接觸點零散、法線互相矛盾、穿透深度不一致——三樣原料全都混亂求解器自然崩潰抖動/彈飛/震蕩而凸體三樣都唯一一致所以動態(tài)穩(wěn)定核心口訣窄階段在寬階段粗篩之后做精確一對一檢測職責一精確判斷真碰沒碰(包圍盒會誤判)職責二產(chǎn)出三樣接觸點是位置影響旋轉(zhuǎn)法線是方向決定往哪彈穿透深度是陷多深決定推多少三樣組成接觸約束交求解器方向力度位置缺一不可凹網(wǎng)格三樣矛盾崩潰凸體三樣一致穩(wěn)定 窄階段三樣產(chǎn)出速查表產(chǎn)出是什么決定什么凹網(wǎng)格問題接觸點碰撞的位置力作用點(是否旋轉(zhuǎn))?零散多點難組織法線分離的方向往哪彈?多三角形矛盾→抖動穿透深度陷多深推多少?多值不一致→震蕩 一句話記住核心窄階段在寬階段粗篩后做精確檢測核心價值是產(chǎn)出三樣碰撞信息接觸點位置影響旋轉(zhuǎn) 法線方向決定往哪彈 穿透深度陷多深決定推多少。這三樣組成接觸約束交給求解器算沖量——凸體三樣唯一一致所以穩(wěn)定凹網(wǎng)格三樣矛盾所以崩潰 延伸窄階段在碰撞流水線的承上啟下【窄階段是碰撞流水線的信息生產(chǎn)核心】 完整碰撞流水線的承上啟下: 寬階段(上游): AABB/空間劃分粗篩 → 給窄階段可能碰的對 ↓ 窄階段(本篇·核心): ← 生產(chǎn)碰撞信息 精確檢測 產(chǎn)出接觸點/法線/深度 → 給求解器接觸約束 ↓ 約束求解器(下游): 用三樣信息迭代算沖量 → 讓物體正確彈開 ↓ 積分: 更新速度和位置 ↓ 窄階段是承上啟下的信息樞紐: - 承接寬階段的粗篩結(jié)果 - 生產(chǎn)求解器需要的精確信息 ↓ 它的產(chǎn)出質(zhì)量,直接決定物理表現(xiàn)! (這也是凸性如此重要的原因)