跳轉到

D-20260811-06|輪組二元損壞與固定驅動份額

2026-08-14 關聯追補:broken 輪組保留 collider/joint 與零摩擦/制動的條款已由 D-20260814-05 取代;固定驅動份額與 broken 單一狀態來源仍有效。

背景與驅動力

舊實作只把 broken tire 從驅動集合移除,碰撞摩擦不變;驅動又除以剩餘完好輪數,使總推力 幾乎不隨損壞下降。結果是 fatigue、撞擊與過熱雖可把輪胎標成 broken,實際 Grip 與動力懲罰 卻沒有完整成立。專案仍在開發期,不保留錯誤行為或舊 snapshot 相容層。

考慮過的選項

  • 只從驅動集合移除:仍有完整側向摩擦,且剩餘輪會取得全部推力,棄。
  • 損壞後刪除 wheel body/joint:會改 Rapier topology、增加回滾與 presentation 複雜度,棄。
  • 以二元 broken 派生完整係數、固定原始驅動份額並保留拓撲(採納)。

決定

  • broken 是輪組唯一狀態來源,疲勞、撞擊與過熱只會把它由 false 改 true;respawn 不修復, 新回合建立全新 world 時才回 false。tire/roller 都保留 mass、rigid body、collider 與 Revolute。
  • broken tire 的所有 collider 改為 friction=0、friction combine=Min,restitution 仍為 Min; 解析牽引上限同步為零,法向支撐保留。滾阻乘以 K_BROKEN_TIRE_ROLLING_MULTIPLIER=2
  • 驅動以安裝時原始 driven tire 數固定分母,失效份額不重分配;標準四輪的總驅動依序為 100/75/50/25/0%,各完好輪仍受實際 manifold normal impulse 與地表材質上限約束。
  • broken roller 每 fixed frame 把軸向角速度向零削減至多 K_BROKEN_ROLLER_BRAKE_RAD_S_PER_FRAME=4 rad/s,形成拖行/貼牆阻力且不反轉。
  • state-dependent friction/combine 不屬 immutable topology;SavedState v7 仍把它們納入 mutable runtime hash,並以 envelope broken 雙向驗證。restore 成功後從 broken 重建係數,任何不一致 原子拒絕,rollback 重播保持 bit-exact。
  • HUD 對自車新增一次性 PartBroken 文字提示,使用 PartInstance 的 canonical mount slot;同幀 多件聚合數量。既有保留音效仍由破壞邊沿觸發;提示只用文字、無位移動畫,不能只靠顏色。
  • 2 與 4 都是 synthetic reference 初值;半成品 builtin 只驗接線與拓撲,最終數值由正式 Editor GLB playtest 校準,不重開狀態或公式設計。

後果與影響

輪胎破壞現在同時損失該輪 Grip 與固定動力份額,導輪破壞也有可感知阻力;所有路徑共用同一 不可逆狀態,沒有第二份 damage flag。代價是每幀須同步少量 collider 係數並對 broken roller 施一次有界制動,snapshot 驗證也多一層 derived-state 檢查;輪組數受既有上限限制,成本有界。