D-20260730-02|Part 首次匯入自動縮放、減面與掛點¶
背景與驅動力¶
外部建模來源無法保證單位、尺寸、polygon 數與 Open4WD mount 契約。若在自動處理前直接以 canonical 100k 上限拒收,大多數可安全修正的模型無法進入 Stage 2;若使用既有 vertex clustering,則會遺失 NORMAL、UV、材質與貼圖。另一方面,規格要求 chassis 9 個 canonical 與 9 個 custom mount 自動產生,但實作只讀取已存在節點。
考慮過的選項¶
- 只在 finalizer 減面與補 mount:高面數原檔仍會直接進 UI,互動成本過高,且 Stage 2 無 mount 可編輯,棄。
- 延用 vertex clustering:現行寫回只保留 POSITION / indices,會破壞有貼圖模型,棄。
- 首次匯入先由 Worker 做保真 preparation,finalizer 維持嚴格收件權威(採納)。
決定¶
- 只對 unmarked 外部 part 執行一次 client-side preparation;current canonical 重開、下載重匯與 fork 不重做。
- UI 在選檔前確定 part type。單位正規化為公尺後,以各類型 client guidance 對 world AABB 最長邊做 uniform fit;創作者仍可再套正值 uniform scale。guidance 不進 protocol。
- 使用 Worker 內 Meshoptimizer 保真減面,以 90k vertices / triangles 作 headroom、100k 為 canonical hard cap;NORMAL、TEXCOORD、material、texture 與 scene node 是不可破壞的不變量。
- chassis 依 world AABB bottom-center anchor 自動建立 canonical 9 + custom 9;canonical 校正並鎖定,existing custom 保留、缺少者補齊。其他 part 依 type 自動建立 part-side mount,只有 weapon mount 可調。
- Stage 1 只保留 3M triangles / 80MB 等不可信輸入絕對 admission ceiling;canonical 100k cap 在 Stage 2 自動修正後由 Stage 3/finalizer 嚴格收件。
- Stage 3 part finalizer 在攤平作者編輯後透過 Worker 重新執行相同保真減面,再跑 Wave A 與嚴格上限;避免切割等後續 mesh 操作繞過 100k canonical cap,也避免大型模型在送出時凍結 UI。
- current canonical marker 的精確 type 是身分權威;重開、fork 或重新匯入不提供 UI 類型覆寫。
- 不新增 schema 版本、legacy migration 或第二套單位;縮放與減面不重採樣貼圖。
後果與影響¶
創作者可直接使用一般 glTF 建模工具輸出的高面數、有貼圖 part,編輯器會先把它轉成可操作的公尺工作檔並補齊裝配介面。代價是 import preparation 必須非同步、具取消/stale 防護,並增加 meshoptimizer 精確直接依賴與真實瀏覽器 GLB 驗收。