跳轉到

D-20260811-04|逐 Collider 材質接觸與滾動阻力

背景與驅動力

舊 runtime 把所有靜態場地合成單一 trimesh 並固定摩擦為 0.05,因此材質表的地面 frictionrestitution 無法按實際接觸區生效;rolling_resistance 也只有資料欄位,沒有物理 公式。車輛非輪組仍使用 AABB 代理,使真實材質套用後可能以過大的盒底接觸鎖住車輛。

考慮過的選項

  • 維持單一場地 trimesh 與固定摩擦:無法讓 authored 材質生效,也無法可靠定位接觸區,棄。
  • 只在鄰近查詢中猜測地面材質:與 Rapier 實際 manifold 可能分岔,會造成牽引、回彈與滾阻 使用不同接觸事實,棄。
  • 逐 canonical collider 保存材質並以實際 contact manifold 聚合(採納)。

決定

  • 場地依 (materialId, sourceNodeIndex) 建立最多 256 個 canonical solid regions;每 region 一個 fixed trimesh collider。entity/fragment 沿用 typed manifest 的逐 proxy 材質。
  • 一般零件由 PhysicsManifest v3 保存逐水密 mesh node 的 deterministic convex proxy:每 part 最多 32 個、每 proxy 最多 26 個量化 support points。proxy 質量份額總和必須等於 part 質量, 分割 collider 不得重複質量。
  • runtime 建立 collider handle -> material + canonical key O(1) 對映。friction 與一般 restitution 採 Average;tire/roller restitution 仍採 Min。D-20260609-01 所稱「禁止 per-collider override」限於禁止資產任意選 combine rule,不禁止 collider 攜帶自己的材質係數。
  • driven tire 只以實際 contact manifold 的 normal impulse 傳遞牽引;同輪多接觸按 canonical key 穩定累加 normalImpulse * Average(tire friction, surface friction)。無接觸時輪胎可空轉, 不得直接產生 primary body 線性推力。
  • rr_pair = tire.rolling_resistance * surface.rolling_resistancerolling_impulse = K_ROLLING_RESISTANCE * rr_pair * normal_impulse。方向由輪軸與接觸法線叉積 取得,反向於相對滾動速度,並鉗制最多降至零。只套用 hinge tire/roller 對 solid surface。
  • 車庫 Grip 改為標準柏油下 Average(tire friction, 0.85),另顯示標準柏油下低/中/高滾阻, 不再把 friction 與 rolling resistance 相加成非物理單值。
  • 專案尚未發布,直接升 asset schema v4/PhysicsManifest v3、重烘全部 builtin,無舊 proxy fallback。

後果與影響

地面材質選擇現在會改變實際接觸、牽引、回彈與滾阻;天氣 modifier 與地面熱可共用同一 collider-material lookup。代價是 collider 數量與 contact 聚合成本增加,因此上限、最大資產 benchmark、snapshot topology 與跨 snapshot conformance 都必須成為驗證門檻。