D-20260810-01|跟車距離與世界水平穩定視角¶
背景與驅動力¶
既有跟車鏡頭使用固定後距與高度,並直接套用車體完整四元數。玩家無法依螢幕、車速或個人偏好調整取景;車體前翻、後翻或翻滾時,鏡頭也可能跟著跨到車底或倒轉,造成方向感中斷與暈動風險。participant 與 spectator 又共用 RacePage/O4Viewport,因此必須由同一套純顯示規則處理。
考慮過的選項¶
- 完整車體相對鏡頭:能忠實呈現翻滾,但鏡頭會隨 pitch/roll 倒置,否決。
- 以車速方向決定鏡頭:倒車、碰撞或低速時容易突然換側,且把 presentation 綁到更多模擬狀態,否決。
- 以賽道路線切線決定鏡頭:需要場地 route 資料且不適用所有 UGC 場地,否決。
- 世界水平加最後穩定水平車頭(採納):只讀顯示位姿,直立安全時平滑接回 yaw,傾斜/倒置/退化時保留上一個穩定方向。
決定¶
- 跟車直線距離可在
0.30–2.00 m調整,預設0.50 m;HUD 與滾輪步距為0.05 m。既有atan2(0.22, 0.45)仰角比例固定,水平後距與高度等比例縮放。 - 相機 up 永遠是世界
+Y。車體 up 與世界 up 的 dot 小於0.5,或水平投影車頭長度小於1e-4時,不更新水平朝向;恢復安全姿態後按 elapsed-time half-life 平滑接回 yaw。切換跟車目標立即重設,不跨車飛行。 - participant 與 spectator 共用同一偏好與實作。輸入包含滑鼠滾輪、雙指縮放、手把右搖桿 Y,以及 HUD 的拉近/數值重設/拉遠按鈕。
- 偏好保存於裝置本機
GameplaySettings.followCameraDistanceM;合併延遲寫入失敗時保留本次 session 值並顯示 warning。 pagehide/freeze/轉為 hidden 時取消尚未到期的 debounce 並啟動 best-effort 本機寫入;visibility 切換重設 gamepad 取樣時鐘,單次 elapsed 上限 250ms,避免背景 rAF 停頓在回前景第一幀被當成持續輸入。所有 lifecycle listener 隨 RacePage destroy 清除。- 場景遮擋可立即縮短 effective distance,解除後平滑回到 preferred distance;遮擋不得改寫偏好。
- 距離與鏡頭狀態是純 presentation,不加入 physics input、deterministic state、rollback、spectator wire message、room state、ledger 或 checksum。
後果與影響¶
車體翻覆期間鏡頭仍保持世界水平與原本車後側,使用者可以在不影響任何共識資料的前提下調整取景。遮擋與儲存失敗只影響本機顯示;網路觀戰快照與比賽結果格式維持不變。