跳轉到

D-20261030-07|零件退化面積隨尺寸縮放與減面誤差上限

背景與驅動力

零件匯入時,Worker 以 Meshoptimizer 把高面數來源減到 PART_IMPORT_GEOMETRY_TARGET(90k),再由 strict gate 檢查退化三角形:面積低於 PART_DEGENERATE_TRIANGLE_AREA_MIN_M2(0.01 mm²)的三角超過 5% 就拒收。D-20260730-02 稱這一步為「保真減面」,列出的不變量只有 NORMAL、TEXCOORD、material、texture 與 scene node,沒有外形誤差。

2026-10-30 的量測(issue 001147)顯示兩個設計疊加後,小零件的外形會被犧牲:

  • 退化面積下限是絕對值,與零件大小無關。約 17×14×24 mm 的馬達表面積約 1,900 mm²,切成 9 萬面時平均每面約 0.02 mm²,已貼近下限。
  • 退化比例超標時,最佳化器會在已達面數目標後繼續逐輪減半,讓三角形撐大到下限以上。每輪 simplify 傳 error: 1,即允許偏移達整個網格半徑(函式庫預設為 0.01%),減多少只由比例決定。
  • 以專案最佳化器處理 e2e 原件(每顆約 197 萬面),量原件表面取樣點到結果表面的距離:導輪(約 11 mm)被減到 1,176 面、判定可送出,最大偏移 1.02 mm,約為零件大小的 9%;輪胎(約 32 mm)5,624 面,最大偏移 0.16 mm;馬達(約 24 mm)2,226 面,仍因退化比例 13.7% 被拒收(issue 001144)。整個過程沒有任何外形檢查或提示。

考慮過的選項

  • (A) 減面設外形誤差上限:每輪 simplify 改傳有意義的誤差上限,達不到面數目標就停在上一輪並照常回報 headroom 或拒收。單獨採用時,小零件仍會被退化閘門卡住,只是改為拒收而不是失真。
  • (B) 退化面積下限隨零件尺寸縮放:下限改為與零件大小成比例,小零件不必為了撐大三角形而大幅減面。直接處理主因。
  • (C) 減面後量測表面偏移,超過門檻即拒收:最直接的保證,但需要在 Worker 內對百萬面來源做距離查詢,成本高,門檻也需另行校準。
  • 維持現狀:小零件持續被悄悄減到千面級。不採用。

維護者裁決採 (B)+(A):(B) 消除主因,(A) 作為保底。(C) 暫不採用。

決定

1. 退化面積下限=min(絕對值, 比例 × 對角線²)

  • 退化三角形的面積下限改為 min(PART_DEGENERATE_TRIANGLE_AREA_MIN_M2, PART_DEGENERATE_TRIANGLE_AREA_DIAGONAL_RATIO × 對角線²)。對角線取參與判定的全部節點在世界公尺座標下的 AABB 對角線。
  • 新增協定常數 PART_DEGENERATE_TRIANGLE_AREA_DIAGONAL_RATIO=0.000002。兩者在對角線約 70.7 mm 處相等:更大的零件與場地仍落在絕對值 0.01 mm²,只有更小的零件依尺寸放寬。
  • 這個比例下,最小合格的正三角形邊長約為對角線的 0.21%:11 mm 導輪約 36 µm,仍遠大於 float32 與 Draco 14 位元量化的精度(後者在 11 mm 零件上約 0.7 µm)。
  • strict gate、零件最佳化器的清碎面與邊塌縮、定稿後的壓縮重驗都使用同一個純函式,維持「最佳化器判定可過=strict gate 不拒收」。5% 比例上限不變。

2. 每輪減面的外形誤差上限

  • 新增編輯器常數 PART_IMPORT_SIMPLIFY_ERROR_MAX=0.005:每輪 simplify 的誤差上限為網格半徑的 0.5%。
  • 一輪受誤差上限限制而無實質進展時,最佳化器照既有規則停在上一輪,並依面數回報 ready、headroom-warning 或 protocol-reject;不以犧牲外形換取面數。
  • 誤差上限是 Meshoptimizer 的二次誤差估計,不是嚴格的表面距離保證;多輪累積的偏移可能大於單輪上限。

3. pre_launch:不保留舊判定

  • 依專案生命週期 pre_launch,不保留舊判定的相容路徑。已交付的 27 個公版零件與場地不受影響:零件來源低於面數目標而未減面,場地與大於約 70.7 mm 的零件仍落在絕對下限。

後果與影響

  • 以新規則重跑同一組量測:導輪改為 22,500 面、最大偏移 0.028 mm;馬達改為 11,245 面並可送出(原本被拒收),最大偏移 0.13 mm;輪胎結果不變。
  • issue 001144(完整本機比賽 e2e 卡在馬達)隨之解除,不需更換測試素材。
  • 小零件的成品面數變多(千面級→萬面級),仍在 90k 目標與 100k 硬上限內,GLB 體積相應增加。
  • 現況規格:程式參數/protocol.md 新增 PART_DEGENERATE_TRIANGLE_AREA_DIAGONAL_RATIO 並更新 PART_DEGENERATE_TRIANGLE_AREA_MIN_M2 說明;程式參數/ui.md 新增 PART_IMPORT_SIMPLIFY_ERROR_MAX;程式架構/security.md 的退化三角形步驟改用新下限;程式架構/editor.md 的保真減面說明補上外形誤差上限。
  • 協定常數變更,pinning vendor 的 system-constants 需同步。
  • 與既有決策的關係:amends D-20260730-02,「保真減面」的不變量加入每輪外形誤差上限,退化判定改用隨尺寸縮放的下限。D-20260730-02 的 H1 之後加註一段說明指回本決策,原文不改寫。

定案紀錄

2026-10-30 使用者審閱後同意採納:退化面積下限改為 min(絕對值, 2×10⁻⁶ × 世界 AABB 對角線²),只放寬對角線約 70.7 mm 以下的零件;每輪減面誤差上限為網格半徑的 0.5%;不採用減面後表面偏移量測。