跳轉到

D-20260808-03|武器執行期物理拓撲

2026-08-16 關聯追補:公版 part 單檔預算已由 D-20260816-12 從 104 KiB 調整為 112 KiB;增加額度仍只供 deterministic physics metadata。

背景與驅動力

D-20260628-01 已定案 general multi-actuator、剛體轉子、 鏈條 joint、功率守恆與 weapon-level 反作用;建模與算式 canon 亦已定 launch 逐發子節點、 local_transform、Axis +Z、有限彈藥與 Rapier contact 遞送。然而現有 runtime 只保留高階命令: general actuator 沒有 body/collider/joint,launch 把全部彈藥壓成第一發材質與體積,發射時從車體固定 偏移新增球體。RenderFrame 也只有 primary body 位姿,因此單補物理後畫面仍會靜止。

現行 weapon aggregate AABB 已涵蓋基座、payload 與彈藥;直接疊加動態 body 會重複碰撞與質量, 發射時另建 body 又會在原 weapon 質量未移除時憑空增加質量。既有 ADR 定了「武器要做什麼」,尚未 定「Stage 3 如何烘焙、runtime 如何建立及 rollback 如何驗證」;本 ADR 補該執行契約,不另創武器規則。

考慮過的選項

  • 保留 aggregate AABB,只讓畫面做 kinematic 動畫:碰撞與傷害仍是假象,否決。
  • 發射時依第一發體積新增球體:忽略逐發形狀/位置且不守恆質量,否決。
  • runtime 直接從任意 mesh 即席猜 collider:UGC 跨 peer 共識面過大,也無可稽核的烘焙產物,否決。
  • Stage 3 烘焙有界 convex compound、runtime 建真 body/joint、彈藥預配置再釋放、同步 presentation 與 rollback(採納)。

決定

  • Stage 3 新增 versioned auto_weapon_physics:固定基座、每 actuator payload、chain segment/joint、 Axis/Pivot frame 與逐發 projectile 全部具名且有界;每 mesh node 以固定方向 support points 烘焙 deterministic convex proxy。特殊角度、非標準比例與搞怪造型合法,不以公版形狀或固定世界軸推斷。
  • descriptor wire 的質量以正整數微克、位置/質心/support point/joint anchor 以整數微米保存;runtime 嚴格驗證後轉回 gram/meter。這是有界 deterministic 編碼,不是按 builtin 形狀做精度降級;rotation 與 root-space axis 保留有限 float。
  • 凹形碰撞採 compound 慣例:一 mesh node 一 convex child;需要凹形精度時由創作者拆多 mesh node。 退化 hull、遺失 semantic node、重複歸屬、非有限 frame 或質量不守恆皆 Stage 3 拒收。
  • weapon aggregate collider 被分類後的 proxies 取代。固定基座掛 primary body;rotor/chain 建 auxiliary dynamic bodies。所有 proxies 的 per-node mass 總和須與 auto_mass_g 相等。
  • actuator 使用可讀回驗證的 Revolute limits 與每幀等量反向 torque impulse;不用 Rapier 0.19.3 只有 setter、沒有 getter 的 joint motor。360° 追目標角速度;小於 360° 依既有 sin/linear 與 snapshotted phase 追有界目標。未觸發或無電不施 torque,不 teleport payload。
  • launch projectile 於 world 建立時依各自形狀、材質、質量及 authored pose 預配置,以 fixed joint 持彈; 發射依 children index 移除下一顆 hold joint、owner 轉 bullet、沿 mounted Axis +Z 施 impulse 並對 chassis 施等量 recoil。不得在發射時另創替代球體或新增質量。
  • 一個 part 可擁有多 collider;damage、deploy、touching owners、磁力位置、teleport、freeze、velocity scaling 與診斷皆改用明確 {handle, partIndex} 對映。已發射 projectile 不再屬 vehicle-wide 操作。
  • rollback 由 immutable VehicleSpec+已驗證 ammo/phase state 推導應存在的 body、collider、joint 與 held-joint 集合;不得信任 snapshot 自述 topology,也不得只與接收端「當下已射幾發」的 world 比較。
  • physics presentation 輸出有界具名 rotor/chain/projectile pose;本機賽事及 10Hz spectator 使用同一 node-name domain 更新既有 GLB 節點,不允許網路資料建立任意 scene object。

後果與影響

武器行為、碰撞、質量、畫面與 rollback 首次共用同一拓撲來源;D-20260628-01 的功率、角度、鏈序、 反作用與 launch 規則不變。Stage 3 descriptor 會增加 GLB extras 體積但點數有硬上限,runtime 不必掃 100k 頂點。公版 part 單檔預算由 100 KiB 調為 104 KiB,只容納有界的 deterministic physics metadata, 全套 4 MiB 上限不變;不以刪減 support directions 犧牲特殊造型。公版 provisional weapon-02/03 可只 重烘衍生 metadata 作回歸,不人工調模型;首次公開前最終 Editor 匯出仍屬 builtin v1。

固體 projectile 永久留場納入本決策。既有 canon 的 fluid projectile 落地轉 deploy zone 若仍無獨立 consumer,須另立 issue 實作,不得以 solid fallback 冒充完成。