跳轉到

D-20261027-02|動態目標的持續接觸回復完整形狀 TOI

背景與驅動力

issue 001082 回報兩個案例都在現行 hard CCD 下穿過動態薄目標:

  • 1 mm 刀片貼著對手車 2 mm 動態護板再推;
  • 1 cm 彈頂著車側 2 mm 護板再推。

001075 的擾動集合(7 起點 × 30/60/120 m/s)量到 F 7/7/7、TM 2/5/5、BLK 系列 7/7/7。

2026-10-27 逐幀讀回的結論分兩部分。

原始兩案不是 CCD 穿透,是量測誤判。

  • 起點已在預測帶內,撞擊由接觸求解器以完全非彈性動量交換處理。
  • 之後的「穿過」都是繞過:
  • 彈沿護板滑落,鑽過離地 12 mm 的護板下緣,或越頂、從側邊滑出;
  • 刀片受偏心衝量自旋,繞過護板邊緣。
  • 舊判準的範圍比護板加彈體還寬,也不檢查是否在護板範圍內,所以把繞過算成穿過。
  • 改用真實穿入深度,以及「中心換邊且前後兩幀都完全在板面內」的嚴格穿過判準後,F、TM、BLK、BLKS 的嚴格穿過全為 0。
  • TM 的「擋下」只是撞後路徑的混沌差異。

另有一個真缺陷:旋轉薄件對動態薄目標。 這是 D-20261026-02 帶進來的。

  • 測試場景(7 起點 × 3 速):
  • 自旋 300 rad/s 的刀片打 2 mm 動態護板;
  • 方塊打 100/300 rad/s 的 2 mm 旋轉刃;
  • 以正式 bounded frame(兩個半幀,查詢未決時二分)模擬步進。
  • 結果:
核心 嚴格穿過 幀末最大穿入(2 mm 板)
TM 6 次 7.66 mm
F 0 次 0.57 mm
  • 機制:
  • 首次接觸後,pair 成為持續接觸,動態目標只掃來源形狀質心的核心球(1 mm 刀片約 0.125 mm)。
  • 旋轉薄件的質心幾乎不動,端點卻以 ω·R 掃進目標,核心球看不到;接觸求解器只在步首 manifold 點做線性化,也擋不住。
  • 穿入超過目標半厚後,接觸法線翻轉,下一步被推穿。
  • 核心球大小由來源厚度決定,與目標厚度無關,這是根因。
  • CCD 子步加到 4 或 8 也無效:持續接觸規則在每個子步首都會套用。
  • F 的截斷問題來自輪胎對固定地面,與動態 pair 無關。D-20261026-02 要解決的截斷,只在固定目標上需要放寬。

考慮過的選項

  • 維持現狀(TM):旋轉武器、轉盤可以切進或穿過 2 mm 動態護板,穿入 7.7 mm。否決。
  • 動態目標也走 TM 固定目標規則(完整形狀先求,異面才接受):命中是同一面,又退回核心球,結果與 TM 完全相同。否決。
  • 侵蝕殼(持續接觸時,額外以來源向內縮 0.5 × 目標半厚的形狀求 TOI):
  • 能把自旋刀片的穿入壓到約 0.3 mm。
  • 但穿入一旦超過侵蝕量,步首殼就已重疊,TOI=0 被丟棄,保護從此失效。
  • rotor 仍有 9 次嚴格穿過、5.8 mm 穿入;實作還要處理各種形狀的侵蝕。
  • 否決。
  • 提高 CCD 子步(4/8):仍有 4–7 次嚴格穿過、6.6 mm 穿入,而且全域成本上升。否決。
  • 只對薄 pair 回父代規則(DT)(任一方 ccd_thickness < 2.5 mm):
  • 安全性與 F 相同:0 次穿過,穿入 0.25 mm。UGC 原生 91 案有 84 案與 TM 逐位元相同。
  • 但多一個厚度門檻常數,2.5 mm 兩側行為不連續,作者可能用造型去試門檻。
  • 不採用;若產品層顯示動態 pair 截斷顯著上升,再議。
  • 動態目標的持續接觸一律回父代規則(DA):採納。

決定

  • 修改 D-20261026-02 的「動態目標」條款:
  • 持續接觸 pair 的目標是 kinematic 或 dynamic 剛體時,照父代以完整形狀求 TOI,不掃核心球。
  • 固定目標維持 TM:完整形狀先求、異面才接受、同面或未命中改掃核心球。
  • 持續接觸判定、核心球定義、常數都不變。
  • 規則只依目標剛體型別判斷,不新增常數;由 ccd_persistent_contact_policy 新值承載。
  • 2=TM 加本決策;0/1 保留給父代與 TM 的有限等價。
  • 由 physics-version 釘住的 protocol 常數指定。
  • snapshot、immutable world config 與 restore 都要驗證,有差異就原子拒絕。
  • 不得用 thread-local 或任何不進快照的狀態。研究原型用的是全域 atomic,正式化時必須改掉。
  • vendor:與 D-20261027-01(BLKS)同一個 repair 代實作,wasm 只重建一次。 兩個設定各自關閉時,步進軌跡必須與父代 f2afeeba 逐位元相同。

後果與影響

數字取自原生研究,bounded 模擬,wasm 尚未驗證。

  • 安全:
變體 嚴格穿過 幀末最大穿入
TM 6 次 7.66 mm
DA 0 次 0.25 mm
DA+BLKS 0 次 0.70 mm
  • 車對車:UGC 原生案例與 TM 不同的只有含動態 pair 的 12 案:
  • push:截斷 0→0%,車速 0.155→0.084 m/s。
  • ram30:截斷 1.1→3.4%,車速 2.43→2.20 m/s。
  • 車對車最大穿入 2.06→0.49 mm。
  • 薄護板車頭對推截斷 0–3.4%(F 為 20–57%)。
  • 固定目標:守門 15 案、同組牆、斜刀、非圓輪、武器與底盤,皆與 TM 逐位元相同。 非圓輪截斷率與車速不受影響。
  • 成本:動態持續接觸 pair 每次多一次完整形狀掃掠;八車與完賽的產品層量測與 D-20261027-01 同代完成。
  • 決定性:
  • 兩趟 hash 全同。
  • 研究 knob 關閉時,與 kit-C 基線逐位元相同(TM 91/91、BLKS 91/91)。
  • 軌跡會改變:golden 與 conformance physics/track-entity-snapshot 跟 D-20261027-01 同代重基線。
  • 品質閘:
  • 001082 的舊判準(中心越過平面、寬鬆範圍、尖端越過前面)判不出繞過與穿過,改為 「幀末真實穿入 ≤ 目標半厚」與「嚴格穿過=0」(中心換邊且前後兩幀包圍盒完全落在板面內)。
  • 原登錄兩案(刀片貼動態護板再推、彈頂車側護板再推)屬量測誤判;真缺陷是 TM 帶入的旋轉薄件對動態薄目標。 D-20261027-01 中 001082 擾動集合表為舊判準數字,已附註。
  • 新增旋轉刃與自旋刀片對動態薄板的擾動集合。
  • pre_launch:直接更新當前基線,不保留相容。
  • 範圍:
  • vendor:sweeps.rs 持續接觸分支、整合參數、序列化與 restore 驗證、binding。
  • wasm 重建,換 RAPIER_VERSION_CURRENT。
  • golden 與 conformance 重基線。
  • canon:physics-engine.md 第 2.2 節、protocol.md、testing.md、版本規範.md。
  • pinning 的 vendored 版本值同步需另行取得同意(比照 001057)。