跳轉到

編輯器操作

本檔角色:Stage 2 編輯器(零件 + 場地共用)的互動 / UI 操作詳細說明。 資料 schema 見 建模參數.md;上傳流程資料層轉移見 UGC上傳.md。 對應模組:src/editor/(程式架構.md §4;路由 /editor 見 §13);實作細節見 程式架構/editor.md。 本檔僅規範操作介面——具體像素 / 配色 / 圖示屬視覺設計,由 UI 團隊決定。

0. 設計原則

  • Modeless:避免「先選工具再操作」的繁瑣;以「碰到內容 vs 碰到空白」區分手勢含意
  • PC / Mobile 雙端通用:手勢盡量對映業界慣例(PC = Blender / Unity 風、Mobile = Figma / Procreate 風)
  • 預設 top-down 正交:99% 編輯在 ⊥ 重力面俯視即可完成;3D 預覽 toggle 才進透視 + 自由 orbit
  • 即時預覽:所有可能影響結果的操作(spline 切線旋轉、Mount 拖放、材質指派…)必須有即時視覺反饋

0.5 整體版面(A1)

版面家族切換點 =用途導向 query (width < 64em):符合時使用 compact/Mobile 版面,否則使用 PC 版面;CSS 的共用 40/64/90em 級距與 script gate 是響應式權威(ui-frontend.md §10)。版面依寬度、輸入依偵測(§0.6)——兩層正交:平板直向近 compact 版面加觸控、平板橫向近 PC 版面加觸控(觸控目標仍 ≥44px)、外接鍵盤在任一版面下皆啟用快捷鍵。

PC(viewport ≥ 1024)

┌──────────────────────────────────────────────────────┐
│ [←] 資產名稱  [↶][↷][清空][刪除所選] [編輯|預覽] [3D] [本機測試][上鏈][GLB] │ ← 工具列(單列;三出口右錨 §5.3)
├──────────────────────────────────────────────────────┤
│ ⚠ 拒收 1・軟警告 2 | entity 34/100 …           [展開詳情] │ ← banner 帶(常駐計數)
├────────┬────────────────────────────────┬────────────┤
│ 頁籤欄  │                                │ 側欄        │
│(直向、  │        3D viewport             │ 屬性│圖層│統計│拒收│
│ 可收合) │     (top-down 正交)           │ (四子分頁) │
├────────┴────────────────────────────────┴────────────┤
│ X,Y,Z | 選中:RP3 | 🟥1 🟨2                            │ ← 狀態列
└──────────────────────────────────────────────────────┘
  • 工具列:返回 / 資產名 |undo・redo・清空(§1.3)| 編輯 ↔ 預覽 toggle(§1.4)|3D 預覽 toggle(§1.1)| 三出口「本機測試」「上鏈」「可編輯 GLB」(右錨、同受檢核 gate 灰掉,§5.3)
  • banner 帶(獨立於工具列的常駐計數列):收納 §3.1 警告計數、§4.3 全域上限、§2.3 材質未指派提示、§5.1 type 覆寫——多來源依「拒收 > 軟警告 > 提示」排序、詳情可展開
  • 左頁籤欄(直向、圖示 + 文字、可收合極大化 viewport):只顯示匯入資產適用的領域頁籤,不另提供零件/場地切換。零件集 = 材質 + 依 part type(chassis Mount/weapon/chip/motor/battery);場地集 = 材質 /route/checkpoint/killzone/respawn/entity/weather
  • 右側欄四子分頁:屬性(預設;跟選取上下文走)/ 圖層(§1.6)/ 統計(整車總覽,§5.2)/ 拒收清單(§5.2)
  • 底部狀態列:座標、選中資訊、紅黃計數(點擊跳拒收子分頁)

Mobile(viewport < 1024)

┌─────────────────────┐
│ [☰] 名稱 [編輯|預覽] [送出]│ ← 精簡頂列(清空・圖層等低頻收入 ☰;「送出」點開選目的地:本機測試/上鏈/可編輯 GLB)
│ ⚠ 拒收 1 ▸           │ ← banner 單條、點開展開
│                     │
│    viewport 全幅      │
│              [↶][↷] │
│               [3D]  │ ← 右下浮動鈕群(拇指區;§1.3 Mobile 按鈕落點)
├─────────────────────┤
│ ═══ bottom sheet ═══ │ ← 三段式(收合/半開/全開);頂緣子分頁=屬性│圖層│統計│拒收
├─────────────────────┤
│ 🎨 🛣 🚩 💀 🔄 🎭 ☁   │ ← 底部頁籤列(拇指區、可橫捲、點選切換 §1.5)
└─────────────────────┘
  • 半開 sheet= 常用欄位 +viewport 可見(調 weather patch 邊看預覽);全開 = 完整表單(chip skill slots 等純表單頁籤)

通則

  1. 純表單頁籤(weather/chip/motor/battery)viewport 仍顯示——僅無「點空白」預設動作(§1.2);表單住右側欄 /bottom sheet。
  2. 螢幕方向不強制(全站規則,ui-frontend.md §10)——top-down 正交無方向偏好、直橫皆支援。
  3. 快捷鍵總表見 §0.6。

工具列下方的「匯入與輸出設定」把兩種生命週期分開:單一「下一個 GLB 類型」選單包含 track 與全部 part type,和來源單位都只套用於下一個外部 GLB;匯入成功才鎖定目前工作區種類並消耗該選擇。貼圖最大邊與零件三角形目標則在按下本機測試、上鏈或可編輯 GLB 時快照,三出口共用。一般 UGC 預設為 4096px/90k;公版 authoring recipe 可選較小值以符合出貨預算,但不得藉此改變物理欄位或縮限 chassis 材質、設計尺寸與造型合法性。

零件與場地共用工具列的 Node 位移、旋轉與各軸縮放,不另設「相對縮放倍率/套用並重算」。 Mesh Node 可各別變形,也可多選後整體變形;多選預設使用共同世界包圍盒中心,另可切換各自 中心,縮放提供等比例鎖定。父節點與後代同選時只直接變形最上層被選祖先,避免階層傳遞後 再對後代套用第二次。一次拖曳或一次數值提交只產生一筆 undo transaction。

純位置 Empty 單選只可位移;帶方向 Empty 單選可位移並沿語意允許的軸旋轉;Checkpoint、 KillZone 等體積節點另可用 scale 改尺寸。多選共同旋轉/縮放可以改 Empty 相對 pivot 的空間 位置,但不得改純位置或帶方向 Empty 自身 scale;帶方向 Empty 在共同旋轉時方向會一起旋轉。 固定 canonical 掛載點仍保持唯讀。完整能力矩陣見 §2.1。

匯出可編輯 GLB 時,當前 node hierarchy、TRS、幾何、材質、分類與掛載資訊直接成為新基線。 重新匯入從匯出狀態開始,不保存或還原作者倍率、逐節點 baseline TRS、原始幾何或 undo history。 非 canonical open4wd_editor 只保存格式版本與 normalized_meters=true,讓重匯入跳過來源單位與 provisional fit;canonical finalizer 會移除此標記並從實際世界幾何重算物理事實。決策見 D-20260903-01。

0.6 快捷鍵總表(C1)

僅 PC/ 硬體鍵盤生效;輸入欄 focus 時單鍵快捷全部停用(打字優先);不覆蓋瀏覽器保留鍵(Ctrl/⌘+W・T・N、F5、Tab——Tab 保留給鍵盤 a11y focus 鏈,ui-frontend.md §11)。

平台對應

平台 對應
Windows/Linux 表列 Ctrl 原樣
macOS Ctrl → ⌘(⌘Z/⌘⇧Z/⌘Y/⌘S 攔截);Delete = Backspace 行為、Fn+Delete 同刪除;精簡鍵盤 Home/PgUp/PgDn = Fn+←/Fn+↑/Fn+↓(瀏覽器層自動、無需另綁)
Mobile/平板(觸控) 無快捷鍵——全部走 §0.5 按鈕(§1.3/§1.5)
平板+外接硬體鍵盤 偵測到鍵盤事件即啟用本表(iPadOS 走 macOS 對應)
手把 編輯器不支援(比賽操控鍵位見 賽內機制.md §2.4.1)

全域

鍵 動作 備註
Ctrl+Z/Ctrl+Shift+Z 撤銷/重做 §1.3
Ctrl+Y 重做(別名) Windows 習慣
Ctrl+S 攔截+toast「無草稿設計(A2);完成後由右上送出(本機測試/上鏈/可編輯 GLB)」 必攔——否則觸發瀏覽器存檔對話框
Esc 取消選取 → 關閉面板 → 關閉 modal(逐層退出) a11y 既有
Enter modal 主按鈕確認 a11y 既有

視角

鍵 動作 備註
Home 重置視角 §1.1
V 3D 預覽 toggle(正交↔透視) 不用 Tab(a11y)
F focus 選中元件(置中框住) 與 §5.2 拒收清單跳轉 focus 同行為
+/− 縮放 滾輪的鍵盤等價(a11y)

編輯

鍵 動作 備註
Delete/Backspace 刪除選中元件 §4.1.2 推廣至全部可刪元件(Checkpoint/KillZone/RespawnPoint/entity 標記)
Shift+點 多選累加 §1.2
[/] 前一層/下一層表面候選 僅 viewport 已啟用且表面選擇器開啟時攔截;Tab 仍只負責鍵盤 focus
方向鍵 選中元件平面 nudge 1mm top-down 下直觀
Shift+方向鍵 nudge 10mm
PgUp/PgDn 深度軸 nudge 1mm 僅自由 DOF 元件;貼面/canonical 約束者無效

頁籤/模式

鍵 動作 備註
1–7 切換頁籤(依當前模式頁籤序) 零件依 type 動態、超出的數字無作用
Space 編輯↔預覽 toggle 播放語意(kinematic 預覽 = 播放)

1. 通用

1.1 相機 / 視角

操作 PC Mobile
軌道(orbit) 中鍵拖曳 空白處單指拖曳
平移(pan) Shift + 中鍵拖曳 雙指拖曳(平行移動)
縮放(zoom) 滾輪 雙指捏合
重置視角 Home(§0.6) 雙擊空白
  • 預設視角:top-down 正交(垂直於 physics.gravity_direction 的俯視)
  • 3D 預覽 toggle:工具列按鈕;開啟 = 透視投影 + 自由 orbit(用於檢視立體迴圈管道內側、確認貼面正確);關閉 = 禁用 orbit 防誤觸
  • 視角操作不修改任何資料
  • Mobile 雙擊空白延遲:雙擊空白 = 重置視角、單擊空白 = §1.2 選取邏輯 → UI 需 ~300ms 延遲判定(單擊事件等待是否成第二擊);可在進階設定改為三指點代替雙擊(避免延遲)

1.2 選取 / 模式切換

點空白的判定邏輯(避免雙重含義):

當前狀態 點空白行為
有元件選中 取消選取(不觸發加點 / 加 mount)
無元件選中 + 頁籤有預設加東西動作 觸發該動作(例:route 頁籤 = 加 RoutePoint、entity 頁籤 = 進入「標記 Entity」picker、checkpoint / killzone / respawn 頁籤 = 加對應 empty)
無元件選中 + 3D viewport 內無預設動作(罕見) 無動作

「點空白」邏輯僅適用於有預設動作的頁籤;純表單頁籤(weather / chip / motor / battery)viewport 仍顯示(供預覽 patch、對照模型),但無「點空白」預設動作、不觸發此事件(§0.5 通則 1)。

其他選取規則:

  • 點現有元件(Empty / mesh / mount)= 單選並設為 active node,露出該類型合法的變形把手
  • 增減多選:PC = Shift + 點;Mobile = 長按進多選模式後連續點擊。最後加入者是 active node;不同可編輯類型可同選,實際可用工具取所有選中目標能力的安全交集
  • 父子同選:後代仍顯示為選中,但同一批世界變形只直接套用最上層被選祖先,後代由 scene hierarchy 跟隨
  • Pivot:多選預設共同中心;各自中心模式讓 Mesh/體積節點繞自身中心旋轉或縮放。純位置 Empty 在各自中心的旋轉/縮放無可觀察結果,因此停用

重疊表面選擇:同一視線可同時穿過道路、屋頂、樓板、垂直牆面或倒掛路面。編輯器依 視線距離列出至多 32 個候選,並以 triangle 外框、命中點與 authored normal 預覽目前候選; 「上一層/下一層」或 viewport 啟用時的 [/] 只切預覽,必須按「確認」才建立空間物件。 取消、切換候選與預覽都不產生 undo;Esc 先取消表面候選,下一次才取消既有元件選取。 候選超過上限時顯示提示,作者應 orbit 或局部放大後重選。

確認後鎖定 {node, primitive, connected component}。後續放置若仍命中同一層,選擇器從該層 開始;若視線不再命中該層,只能重新明示確認,禁止靜默退回最近高度。連通元件只以完全共享 幾何邊判定,不依高度、顏色、節點名稱、重力或公版模型外形推測。RoutePoint 與 viewport 貼面新增的 RespawnPoint 必須有確認後的完整 surface frame;Checkpoint、KillZone 與 entity 仍可依各工具規則使用自由空間。垂直、banked、倒掛與 360° 迴圈一律使用 authored normal/ tangent frame,不以 world Y 或重力補猜。

1.3 撤銷 / 重做 / 清空

操作 PC Mobile
撤銷 Ctrl + Z 工具列按鈕
重做 Ctrl + Shift + Z 工具列按鈕
清空當前頁籤 工具列按鈕 + 二次確認 ☰ 選單 + 二次確認(§0.5)
刪除所選 工具列按鈕 / Delete ☰ 選單「刪除所選」
  • 編輯 session 內全 undo stack;切離本 part / 場地時清空 stack
  • 清空 = 該頁籤資料全清(例如「清空 route」= 移除所有 RoutePoint)

1.4 預覽 vs 編輯模式

編輯器頂部 toolbar 提供 「預覽」toggle:

模式 行為
編輯(預設) 靜態顯示;kinematic entity 不動、weather patch 不生成、Checkpoint 統一顯示「未點亮」狀態;所有 gizmo / 把手露出
預覽 動態模擬;kinematic_move 依 motion_curve / period / amplitude 即時往返、kinematic_conveyor 表面速度可視化、weather patch 即時 spawn 並顯示色偏 / 遮蔽、Checkpoint 可滑桿切換點亮進度;gizmo / 把手隱藏避免誤拖
  • 各章節提到的局部「預覽動作 / 預覽 patch」按鈕 = 進入該局部的預覽模式(不切全域)
  • 預覽模式下禁止編輯(拖 gizmo / 改數值都灰掉),保證所見即所得;要改值需切回編輯模式

1.5 Mobile 操作通則

§1.1 相機表已涵蓋 orbit / pan / zoom;本節補內容操作的 Mobile 等價:

操作 Mobile 手勢
選中元件 單指點
拖移選中元件位置 單指拖該元件(覆蓋 orbit)
旋轉切線把手 / 旋轉軸 gizmo 拖切線把手 / 旋轉 gizmo(命中區自動放大 1.5–2 倍)
拖位置 gizmo(XYZ) 點該軸把手 → 拖該軸(鎖定單軸;雙指可同步拖兩軸)
scale gizmo(box trigger) 拖 box 任一面把手即可單軸縮放;雙指捏合 = 同步等比縮放
多選 長按進多選模式 → 連續單指點累加
數值欄位 點欄位 → 喚出原生數字鍵盤;滑桿欄位點滑桿後可拖
下拉選單 原生 mobile picker
切頁籤 頁籤列點選(不用 swipe,避免與內容拖曳衝突)

精度補償:手機點不準時,所有把手 / gizmo 的命中區內部放大 1.5–2 倍(畫面圖示維持原大小、命中區擴大);選中元件後把手自動依視角大小做 viewport-scaled 渲染(不論放大縮小,把手永遠看得到)。

tap vs drag 判定:單指觸空白同時肩負「點空白(§1.2 加點等)」與「拖空白(orbit)」——以位移閾值分流:落指後位移小於閾值即放開 = tap(觸發點空白邏輯)、超過 = drag(orbit);具體 px 值屬實作層(慣例 ~8px、依 DPR 縮放)。

1.6 視覺輔助層級開關

側欄露出「視覺層」面板,只列目前資產種類適用的層,並可獨立切換顯示 / 隱藏:part 只列 Mount marker;track 列其餘場地視覺層。

  • spline 曲線預覽
  • 走廊邊界(±width/2)
  • forward 切線箭頭
  • Mount marker(chassis 編輯時)
  • RoutePoint 編號標籤
  • Checkpoint trigger box / 編號
  • KillZone box
  • RespawnPoint forward 箭頭
  • Entity gizmo

預設全開;進階創作者可關特定層減少視覺干擾。設定不寫入 GLB(純客戶端偏好,跨 session 用 localStorage 保留)。

1.7 進場 loading(wave A 自動計算)

進 Stage 2 時,編輯器自動跑 wave A(建模 §4 列表):volume / mass / bbox / centroid / surface_area / watertight 驗證 / 無 marker 來源的 provisional uniform fit guidance / decimate(若編輯後超 tri 上限)。

  • 顯示 loading 覆蓋層,中央進度條 + 文字「正在分析 mesh 結構...」並列當前項目(如「watertight 驗證中... 3/8」)
  • mesh 越大 / 三角形越多越久(簡單 part 1-2 秒,場地大 mesh 可能 30-60 秒)
  • 完成後自動進入編輯器(材質指派見 §2.3)
  • 失敗回滾:wave A 任一項目嚴重失敗(如 mesh 完全無法解析)→ 退回 Stage 1 並顯示錯誤;非致命失敗(如 watertight 失敗 → 跑 voxelization 備援)僅旁白提示,不中斷流程
  • 進場路徑二:重開本機測試資產(自車庫的 local 資產列進入)——載入既有 GLB+extras(含材質指派 /auto_),wave A 結果沿用不重算*(mesh 未變、產物都在 extras);改完可再走 §5.3 送出(存本機覆寫、上鏈轉正或匯出可編輯 GLB)

2. 共用元件操作

2.1 Empty Node 拖放(Mount / Axis / Pivot / Chain_Segment / RoutePoint / Checkpoint / KillZone / RespawnPoint)

  • 選中可編輯 Empty → 露出位置把手(XYZ 三軸 gizmo);拖曳或輸入數值會更新位置
  • 純位置 Empty 單選時不提供旋轉或縮放
  • 帶方向 Empty 額外有旋轉把手:Axis 依 +Z、RespawnPoint 依完整 surface frame、RoutePoint 依 surface normal 上的 1 DOF、roller Mount_Roller_* 依 +X hinge;只露出合法旋轉 DOF
  • Checkpoint/KillZone 是體積 Empty,scale 表示 trigger box 尺寸,因此可位移、旋轉與各軸縮放
  • 多選共同旋轉時,純位置 Empty 只改繞 pivot 的位置,帶方向 Empty 同時改位置與方向;共同縮放只改兩者相對 pivot 的位置,自身 scale 保持 [1,1,1]
  • 固定 canonical mount 的位置/方向不可編輯;選取其祖先 Mesh 時以反向 local 補償維持原 world transform,若補償無法精確表示為 glTF TRS 則整批取消;自訂 mount 才依 scene hierarchy 跟隨父變形

各 Empty 的具體約束 / DOF 見對應章節(§3 零件 / §4 場地)

2.2 切線把手(spline 用,RoutePoint 限定)

見 §4.1。

2.3 材質指派

多材質單位 = 水密 sub-mesh(node):一顆 mesh 由數個各自水密的 sub-mesh 組成,每個 sub-mesh 指派一種材質(質量 / 摩擦 / restitution / stress / fatigue / thermal / 磁性逐 sub-mesh well-defined,見 材質表.md §7)。單一 fused mesh = 單一材質;要多材質須有數個水密 sub-mesh——可用編輯器切分工具(§2.4)作平面切割+封蓋,或沿既有 Primitive/不連通幾何島分離;也可用拼接工具加入數個水密實體,或於 Blender 等外部工具先切好(見 UGC機制.md §3.7),再逐 sub-mesh 指派材質。

進場後創作者看到什麼

  • §1.7 wave A 計算結束後,側欄材質頁列出 mesh 的每個 sub-mesh(node)一行:sub-mesh 名稱 + 材質 dropdown(預設「繼承主材質」)
  • 主 / fallback 材質選單置於側欄頂部:整顆 mesh 的預設材質(單材質 mesh 只需設這一個)
  • 點選某 sub-mesh 列 → 視埠高亮對應 node(選取視覺回饋);材質分佈以列表 dropdown 呈現
  • 頂部提示 banner:「本 mesh 有 N 個 sub-mesh;未指派者繼承主材質」

材質指派操作

  • 主材質:側欄頂部單選(材質表 enum,依 scope / part type 過濾)
  • 逐 sub-mesh 材質:側欄每列一個材質 dropdown(材質表 enum;預設「繼承主材質」→ 可覆寫為指定材質)
  • 材質變動即時反應:質量 / 質心等依密度的衍生量重算(見 UGC機制.md §3.4)

規則

  • 零件:未指派 sub-mesh 自動繼承主 material(提示 banner)
  • 場地:至少 1 sub-mesh 指派才能送出(Stage 3 gate 條件之一)
  • 主 material(part Root Extras)來源 = 玩家指定;未指定則取最大 sub-mesh 的指派

2.4 幾何工具:拼接(assembly)/切分(split)

編輯器提供兩種體積分割幾何工具,作為在瀏覽器內產生多零件 / 多材質資產(數個水密 sub-mesh node)的手段;兩者產物皆為各自封閉水密的 sub-mesh,與材質模型(材質表.md §7:質量 = Σ(水密體積 × 密度))一致。逐 sub-mesh 材質指派見 §2.3。

拼接(assembly,由下而上)

  • 從目前資產追加:先開啟一個 GLB,再逐次選擇一個外部 GLB 加入;不可在空工作區啟動拼接
  • 來源準備:新來源單獨經 sanitize、canonical 幾何解碼與目前「匯入單位」的公尺正規化, 不套用整件零件/場地的 provisional fit;目前資產不重複准入或換算
  • 保留結構:新來源既有的 Mesh、primitive 與內部 node hierarchy 原樣保留,整包以獨立場景根 加入;節點重名依輸入順序決定性加 _2、_3 後綴,不提供 Mesh 熔接或重新掛父層
  • 加入後定位:新增的 Mesh node 自動多選,直接使用 §1.2 的共用 位移、旋轉、各軸縮放與共同/各自中心工具;面板不另維護一套 position-only 欄位
  • 工作階段:加入前先把目前 scene edits 攤平,加入動作以單一 undo transaction 保存;draft、 資產名稱、來源血緣及「下一個 GLB 類型」選擇皆不變。仍有未物化表面筆刷或拓樸 patch 時先拒絕, 作者須完成或復原該幾何編輯後再加入
  • 輸出:每個來源實體成為同一資產內可獨立選取的 sub-mesh node,後續匯出以當前 hierarchy、 TRS、幾何與材質形成新基線

切分(split,由上而下)

  • 三種模式:
  • 平面切割並封蓋:沿 X / Y / Z 選一軸與世界位置,把選中的水密 Mesh node 切成兩片;對切口邊界環三角化補面(含中空/環狀多邊界環),使兩片各自封閉水密、整體 Σ 體積守恆,切面沿用原 primitive 材質。
  • 依不連通幾何島分離:在每個 primitive 內,以位置焊接後的 exact-edge 連通性分組;只拆既有三角面、不猜測或新增封蓋面。至少有兩個島且每個輸出島原本就水密才開放。
  • 依 Primitive/材質區塊分離:每個既有 triangle primitive 成為一個 Mesh node,保留該 primitive 的材質、attributes 與 indices;至少有兩個 primitive 且每個輸出原本就水密才開放。Primitive 常對應材質區塊,但材質相同的多個 primitive 仍各自輸出,不按材質名稱自動合併。
  • 輸出結構:第一片沿用原 node 名稱,後續片依序使用 _2、_3 等唯一名稱;所有片成為原父節點下的同層 Mesh node,保留原 node local TRS,之後可由共用 Node 工具分別或多選調整。
  • 原子操作:一次切分是一筆 asset-replacement undo transaction;仍有未物化表面筆刷或拓樸 patch 時先拒絕,避免遺失修改。
  • 失敗封閉:任何候選輸出不是水密實體時不修改模型;不提供把多個 Mesh 熔接成單一 Mesh 的「合併」功能。
  • 目前平面範圍:僅軸向平面(X / Y / Z + 位置);自由朝向切面 gizmo 與即時雙片預覽候選見其他.md。

與純表面著色的差異:切分分割的是體積(切 + 封蓋 → 封閉水密實體),體積 / 質量 well-defined;純表面色塊分割(open patch、無獨立體積)無法定義 per-region 質量 / 熱,不採此路。

2.5 數值欄位 / 下拉選單 / Toggle

  • 標準表單元件,無特殊處理
  • 數值欄超範圍 → 即時紅字提示(不阻擋輸入,但 Stage 3 拒收)
  • Toggle 互斥情境(例:destructible vs visual_only)→ 一邊勾選自動灰掉另一邊 + tooltip 說明

3. 零件編輯

3.1 chassis Mount:10 個必要點與條件選配槽

Mount 露出 UI

  • 進入 chassis 編輯頁籤 → 顯示 chassis mesh + 10 個必要 Mount empty marker,以及 Chip/Weapon 與六個 roller 候選列
  • canonical 9 個(Body × 4 / Battery / Tire × 4):帶鎖頭、不可選;viewport proxy 以 Body/Tire/Battery 的不同無字形狀、類別色與小鎖區分,維持固定畫面尺寸,不常駐任何語系文字。側欄列已顯示類別時只補「左前/右後」等在地化方位,Battery 等單一項不重複名稱,但仍保留不可見的彈性位置欄,讓右側「唯讀」等狀態徽章與其他列靠右對齊;一般側欄與 finding 均不顯示 Mount_* 技術節點名
  • 必要自訂 1 個(Motor):匯入時補齊,可選 / 可拖
  • 條件選配 0–2 個(Chip / Weapon):可個別新增、移除、選取與拖曳;Weapon 只有在 Chip 已存在時可新增,移除 Chip 會在同一筆可復原操作連同 Weapon 一起移除
  • roller 0–6 個:FL / FR / CL / CR / RL / RR 分別為選配候選,可個別新增、移除、選取與拖曳;未新增者不顯示 viewport marker、不計缺件警告

Mount 操作

  • 點 Mount marker → 選中 → 露出 3D 位置 gizmo(XYZ 三軸)
  • 拖位置 gizmo → 改 Mount 位置;數值即時顯示
  • roller mount 額外露出旋轉 gizmo(hinge 軸方向,1 DOF 繞慣例 +X 軸;見 零件與共用介面.md §6.4)
  • 組裝只能在 chassis 實際存在的 roller mount 安裝;loadout 使用不存在的槽時不得靜默套用候選位置
  • 組裝只能使用 chassis 實際存在的 Chip/Weapon mount;Mount_Weapon 存在但 Mount_Chip 缺少時 Stage 3 拒收
  • tire mount 為 canonical 固定:軸由 chassis 模板預設、創作者無須也無法調,不露旋轉 gizmo
  • 其他自訂 mount(Motor / Chip / Weapon)位置可拖、不檢核軸向故無旋轉 gizmo

Mount 即時驗證 / 警告

條件 視覺
Mount 達 MOUNT_AABB_WARN_M 🟨 黃框警告
Mount 違反 MOUNT_AABB_REJECT_M 🟥 紅框 + 「Stage 3 拒收」標籤
Mount 間距達 MOUNT_GAP_WARN_M 🟨 黃框警告
Mount 違反 MOUNT_GAP_REJECT_M 🟥 紅框
roller hinge 達 HINGE_AXIS_WARN_SIN 🟨 黃框警告
roller hinge 違反 HINGE_AXIS_REJECT_SIN 🟥 紅框
  • 頂部 banner 顯示「X 軟警告、Y 拒收條件未解決」即時計數
  • 任一紅框 → 三出口(本機測試 / 上鏈 / 可編輯 GLB)灰掉

門檻值只讀 protocol.md §3 的具名常數。

詳細 schema / 約束見 零件與共用介面.md §6。

3.2 weapon(Axis / Pivot / Mount / weapon_main_mesh_node / weapon_mechanism / weapon_actuators[])

weapon 露出 UI

  • passive toggle:active = chip weapon 槽觸發、passive = 純物理被動常駐
  • Part-side Mount_Weapon 拖放(active / passive 共用):可改位置(武器外觀無法預知);3D gizmo 拖;即時預覽與 chassis 端 Mount_Weapon 對接後的最終裝配姿態
  • magnet_source_strength_n 0-10 數值欄:當該 part 任一 sub-mesh 含 magnetism_role: source 材質時露出(部件含 source 材質 = 設定錯誤的 fallback;靜態磁源正常用於場景物件 / 地板、武器磁鐵走 active 分支不用此欄;見 材質表.md §8.2 / 場地.md §9.4)

active(passive: false)額外設定

依 weapon_mechanism dropdown 動態露欄位:

Mechanism 必要欄位
general Axis empty(+Z = 動作方向);weapon_actuators[] 有項 = general_actuated(每項 Pivot + payload 剛體 / 鏈條 + weapon_max_angle_deg / speed_weight / phase_offset_deg)、無項 = general_push。單 / 多 actuator 皆用下方「多 actuator 編輯流程」列表面板
magnet Axis empty(+Z = N 極)、weapon_main_mesh_node 從 GLB node tree 下拉(磁場原點);動態強度 = battery.available_output_w × allocation_pct / 100,無強度欄位
launch Axis empty(發射朝向)、weapon_main_mesh_node 從 GLB node tree 下拉(launcher_body);bullet sub-mesh 列在 launcher_body 子節點清單,每顆顯示 material dropdown(可與 launcher 不同)與獨立 LaunchExit 距離。視埠平面固定垂直 Axis +Z、只沿 Axis 平移,顯示完整 convex sweep 及有效/無效狀態;資料不保存 rotation

Axis fallback 推斷

Axis empty 未標時:UI 用 mesh 主軸推斷並顯示推斷結果 + 🟨「建議手動標」提示;auto_inferred 自動填入。

鏈條 / 鞭 / 雙節武器(Chain_Segment_<n>,詳見 零件與共用介面.md §5.3 / §3.7.2)

  • 鏈節為 GLB 內已存在的 mesh node(某 actuator 的 chain payload),命名 Chain_Segment_<n>(n 從 1 遞增);全武器剛體轉子 + 鏈段總數上限 MAX_WEAPON_DRIVEN_BODIES 16 段,見 protocol.md §3
  • UI 不負責建模或拖 joint:convert script 在 Stage 2 / 3 自動掃描連續編號的 segment、自動推 RevoluteJoint(單軸轉動)或 SphericalJoint(三軸轉動);joint 鏈錨定於該 actuator 的 pivot_node
  • 編輯器互動僅限:mesh node 命名(rename)、視覺檢視 auto_chain 推導結果(segment 數 + joint 類型清單)
  • 視覺輔助:選中 weapon 時,鏈節之間自動繪 joint 圖示(線連起點+終點 mesh)以便檢視推導正確

多 actuator 編輯流程(機制權威見 零件與共用介面.md §3.7・算式表.md §3/§4)

列表式 actuator 面板(住右側欄「屬性」子分頁 /Mobile bottom sheet 全開,§0.5;比照 chip skill_slots 多列):

  • 每列 = 色標 + 編號 |Pivot empty 選取 |payload|weapon_max_angle_deg/speed_weight/phase_offset_deg/motion_curve;可增刪列(上限 MAX_WEAPON_DRIVEN_PIVOTS 8,達上限「加列」灰掉)
  • 多 pivot 選取 / 區分:每 actuator 一專屬色,列色塊 ↔ 3D pivot marker 同色 + 同編號;點列 = 3D focus 該 pivot(同 F 行為)、點 3D pivot = 高亮對應列(雙向連動)
  • payload 切換:每列 segmented control「剛體 mesh| 鏈條」——剛體 → GLB node tree 下拉選 mesh_node;鏈條 → 下拉列出自動掃描到的 Chain_Segment_* 鏈(各顯示 segment 數;選一串 = 該串歸屬本 actuator,鏈序依 children 陣列、非手動排)
  • speed_weight 呈現:數值欄 + 列內迷你「快慢條」(各列以 Σweight 正規化的相對比例視覺化)
  • 即時預覽:預覽模式同時動畫全部 actuator(各自 phase 錯開、weight 不同速);編輯器端為 kinematic transform 更新、N ≤ 8 無效能議題
  • Mobile:擺 pivot = 選中後拖 gizmo(§1.5 命中區放大)、參數逐列住 bottom sheet;actuator ≥ 3 時顯示「桌面操作更順手」軟提示(降級可用、不阻擋)

weapon 即時驗證 / 警告

條件 視覺
active 但缺 weapon_mechanism 🟥 紅
active 但缺 weapon_main_mesh_node 🟥 紅
general actuator 缺 weapon_max_angle_deg 🟥 紅
Chain_Segment_<n> 編號斷號(例 1, 2, 4 跳 3) 🟥 紅「斷號 → joint 推斷會接不起來」
全武器剛體轉子 + 鏈段超 MAX_WEAPON_DRIVEN_BODIES(16)或驅動 pivot 超 MAX_WEAPON_DRIVEN_PIVOTS(8) 🟥 紅 + 「Stage 3 拒收」標籤
Chain_Segment 節點重名 🟥 紅 + 重命名提示(node 名稱須唯一;鏈序 = children 陣列順序,非名稱後綴)

詳細 schema 見 零件與共用介面.md §3.7 / §5.2。

3.3 chip(skill_slots + allocation_pct)

chip 露出 UI

  • 標題列顯示 auto slot 數(從 volume_m3 算 1-4 個;玩家不可宣告)
  • 要增加 slot 數 → 加大 chip mesh 的體積(slot 數隨 volume_m3 階梯升 1→2→3→4,閾值見 零件與共用介面.md §3.6);UI 旁邊提示「當前 volume = X cm³,slot = Y;下一階 slot Y+1 需 ≥ Z cm³」
  • 露出對應數量的 slot row,每 row 含:
  • skill dropdown(8 enum:boost / brake / swerve_left / swerve_right / jump / slam / stabilize / weapon;同 chip 已選過的 skill 在其他 row 灰掉)
  • allocation_pct 數值欄(0-100%)+ 滑桿
  • 底部進度條:「總和 X / 100%」即時計算

chip 操作

  • 點 skill dropdown 選 skill
  • 拖滑桿或輸入 allocation_pct 數值
  • 空 slot 可留白(不一定要全填)

chip 即時驗證 / 警告

條件 視覺
兩 row skill 重複 🟥 紅 + 「不可重複」提示(理論上 dropdown 已防,作為防線兜底)
總和 allocation_pct > 100% 🟥 紅 + 進度條紅色 + 「Stage 3 拒收」標籤

weapon skill 與 weapon part 搭配檢查屬組裝階段(chip part 編輯時還沒組車、無從得知有沒有 weapon mount);組裝時若 chip 上的 weapon skill slot 對應之車輛 weapon mount 為空 → 組裝畫面 🟨 黃提示「weapon skill 未掛載武器」。詳見組裝編輯流程(車輛組裝.md)。

上鏈後鎖死提示

組裝 / 檢視階段每 row 顯示 🔒 圖示 + tooltip「上鏈後 skill / allocation_pct 皆不可改,要改需 fork 重上鏈」。

詳細 schema 見 零件與共用介面.md §3.6。

3.4 motor / battery

motor

欄位 UI
torque_ratio 0-100% 滑桿 + 數值欄;旁邊軸示意「← 扭力 / 速度 →」即時跟著滑桿移動
auto_input_mw 唯讀顯示(系統算 round(volume_m3 × K_MOTOR_INPUT_W_M3 × 1000);K 預估 80,000,000 W/m³)

battery

欄位 UI
configured_output_w 數值欄;旁邊即時顯示「上限 = volume × K_BATTERY_OUTPUT_W_M3 = X W」
auto_energy_capacity_mj 唯讀顯示(系統算 round(volume_m3 × K_BATTERY_ENERGY_MJ_M3);K 預估 90,000,000,000,000 mJ/m³)

motor / battery 即時驗證

條件 視覺
battery configured_output_w 超 volume × K_BATTERY_OUTPUT_W_M3 上限 🟥 紅 + 「Stage 3 拒收」標籤

詳細 schema 見 零件與共用介面.md §3.2 / §3.3。

3.5 零件表面微調與拓樸修補

零件與場地共用 §4.6 的 raise/lower/smooth/flatten、 補洞與橋接核心。零件預設 radius/strength 採毫米級;沒有合法閉合 boundary loop 時不顯示 補洞或橋接,一個 loop 只提供補洞,至少兩個同 primitive loop 才提供橋接。局部變形不移動 mount;變更後重新檢查 mount 相對模型的位置與既有拒收規則。決策見 D-20260830-02。

4. 場地編輯

4.1 RoutePoint(路徑點 / 起終點)

資料層狀態與合法 op 見 UGC上傳.md §2.1。本節規範 UI 互動。

4.1.1 加點

  • 點空白 → ray-cast 從相機投到 mesh 表面 → 點生成在 hit point(自動貼面)
  • 若 ray-cast 沒打到 mesh → 不生成(UI 提示「請點選場地表面」)
  • 預設 forward = 沿前一點到新點的弦方向投影到該點 surface 切線平面(不主動旋轉時,曲線退化為類折線手感)
  • 滿 2 點起自動連成 spline 線(資料層 fixed-2)

4.1.2 刪點

  • 選中 RoutePoint → 工具列「刪除」按鈕 / Delete 鍵 / 二次點同一點
  • 端點被刪 → 鄰點遞補為端點;中間點被刪 → spline 重新插值

4.1.3 刪線

  • 僅 fixed-2 狀態(2 點 1 線)可用:選中線 → 「刪線」按鈕 → 變 open
  • 其他狀態下按鈕灰掉 + tooltip 說明

4.1.4 旋轉切線(spline 把手)

  • 選中 RoutePoint → 從點伸出兩條對稱切線把手(前 / 後,象徵 spline 兩側 tangent)
  • 拖把手 → 切線在該點 surface 切線平面內旋轉(1 DOF,繞 surface normal)
  • 把手長度 = 視覺固定(不代表 tangent magnitude,magnitude 由系統算 = 弦長 × 1/3)
  • 即時更新 spline 曲線預覽

4.1.5 寬度(width_m)

  • 選中 RoutePoint → 側欄露出 width_m 數值欄(UI 可另顯示公分/毫米換算)
  • 視覺輔助:spline 旁同步繪出 ±width/2 的走廊邊界線(fixed 用、open 不顯示)
  • RP1 特殊:旁邊額外顯示「玩家上限:floor(width_m / 0.18) clamp 8」即時計算

4.1.6 飛越段(無 mesh 中段)

  • 創作者無法在無 mesh 處放點 → spline 兩端點貼面、中段曲線自然浮空
  • 編輯器仍渲染 spline 浮空線(業界編輯器慣例,創作者能看到「racing line 飄越坑洞」)
  • 走廊邊界繪製:浮空段隱藏邊界線(b-soft 該段不檢核,繪了反而誤導)
  • 落地段恢復繪製

4.1.7 即時驗證 / 警告

條件 視覺
RoutePoint 未貼 mesh 表面 ±5mm(編輯器強制 ray-cast 貼面,正常情況不會發生) 🟥 紅框 + 「Stage 3 拒收」標籤
相鄰 RoutePoint 中心距 < ROUTEPOINT_MIN_SPACING_M(0.1,protocol.md §3;spline 段退化。例外:loop 之 RP1 ↔ RPn 允許重合,場地.md §8.2) 🟥 紅框(兩點都標紅 + 提示「相鄰點過近,請拉開」)
RP1.width_m < 1.44 🟨 黃「場地最多支援 X 人(依 floor(width_m / 0.18)),低於 8 人滿員門檻 1.44m」(不阻擋;房間設定由玩家賽前決定)
open 點數 ≠ 2 / fixed 點數 < 2 🟥 紅 + 「Stage 3 拒收」

4.1.8 視覺輔助

  • 順序編號:每點旁顯示 RP1 / RP2 / ... / RPn
  • 方向指示:每點 forward 切線方向用小箭頭標
  • spline 預覽:粗線 + width 範圍半透明色塊
  • 起終點高亮:RP1 綠色、RPn 紅色(或同色但加圖示區分)
  • loop 模式特殊:RP1 ≈ RPn 兩點視覺貼近 → 改用單一「起=終」雙色圖示(綠紅各半)+ tooltip「loop 起點 = 終點(RP1 ↔ RPn 中心距 < LAP_MODE_LOOP_DISTANCE_M,1m——即 lap_mode 推斷門檻)」避免兩個高亮疊死

4.2 Checkpoint / KillZone / RespawnPoint

4.2.1 Checkpoint(有序防抄近路關卡)

  • 加法:工具列「加 Checkpoint」→ 點 mesh 表面或空白都可生成(box trigger 可橫跨空中);自動編號 Checkpoint_1 / _2 / ...
  • 編輯:選中後露出位置 gizmo + scale gizmo(即時拉伸 box)+ 順序欄(= track.checkpoints[] 陣列位置,改值 / 拖曳重排;名稱僅為識別、不承載順序)
  • scale 限制:min 100×100×1000mm、max 場地 AABB 各軸 1/10(建模 §5.4)
  • 視覺輔助:trigger box 半透明色塊 + 編號標籤;點亮 / 未點亮狀態在預覽模式可切換查看

即時驗證 / 警告

條件 視覺
Checkpoint scale x < 100mm 或 y < 100mm 或 z < 1000mm 🟥 紅「scale 低於下限」
Checkpoint scale 任一軸 > 場地 AABB 該軸 / 10 🟥 紅「scale 超上限」
節點重名 🟥 紅 + 重命名提示(名稱須唯一;順序由 checkpoints[] 陣列承載、無跳號問題)

4.2.2 KillZone(死亡區)

  • 加法:工具列「加 KillZone」→ 點空白或 mesh 表面生成 box trigger
  • 編輯:選中後位置 gizmo + scale gizmo(同 Checkpoint);scale = 死亡範圍
  • 視覺輔助:trigger box 紅色半透明(與 Checkpoint 色區分)

即時驗證 / 警告

條件 視覺
位置 ± scale/2 任一頂點超出場地 AABB 🟥 紅框 + 「Stage 3 拒收」(KillZone box 必須完全在場地 AABB 內)

4.2.3 RespawnPoint(掉出 fade in 落點)

  • 加法:工具列「加 RespawnPoint」→ 點 mesh 表面生成(必須在場地 AABB 內)
  • 編輯:選中後位置 gizmo + 旋轉把手(empty forward 軸 = fade in 後車輛朝向)
  • 視覺輔助:empty 位置 + forward 箭頭 + 「車輛朝此方向重生」標籤

即時驗證 / 警告

條件 視覺
RespawnPoint 位置超出場地 AABB 🟥 紅框 + 「Stage 3 拒收」(必須在場地 AABB 內)
場地有 KillZone 但無 RespawnPoint 🟨 黃「無 RespawnPoint,掉出將 fallback 至 RP1 中心」(不阻擋)

4.3 Entity(裝飾 / kinematic_move / kinematic_conveyor + destructible flag)

標記 Entity

  • entity 來源 = GLB scene graph 內已存在的 mesh node(編輯器不負責建模,整體模型由創作者用 Blender / Tripo 等出 GLB 時就建好)
  • 工具列「加 Entity」→ 從 GLB scene graph 選一個 mesh node → 標記為 entity 並寫入該 node extras.entity_type
  • Entity 位置 = 該 mesh node 在 GLB 內的 local transform;可拖 3D gizmo 改位置 / 旋轉 / scale(限場地 AABB 內)

共用設定(所有 entity_type)

  • entity_type dropdown:decoration / kinematic_move / kinematic_conveyor
  • physics toggle:default / visual_only;僅 decoration 可選 visual_only,其他類 physics 鎖 default
  • material dropdown:材質 31 種 enum(visual_only 時可不指派)
  • destructible checkbox:physics: visual_only 時自動灰掉並 uncheck,tooltip「destructible 需 physics: default」
  • magnet_source_strength_n 0-10 數值欄:僅當 entity 任一 sub-mesh 含 magnetism_role: source 材質時露出 + 生效;UI 偵測並提示

kinematic_move 專屬

欄位 UI
motion_curve dropdown sin / step / linear(rotation_amplitude_deg: 360 連旋時灰掉、不適用)
period_ms 數值欄
phase_offset_ms 數值欄
amplitude_m 3 軸 [x, y, z] 數值欄(m;entity local frame);3D 視角下用虛線箭頭從 entity 起始位置往 amplitude 方向延伸預覽
rotation_axis + rotation_amplitude_deg 旋轉模式(與平移至少填一、可並用):軸 3 欄(entity local)+ 角度 1-360(360 = 連旋 / < 360 = 往返);3D 視角下繞軸弧形虛線預覽
open_duration_ratio 0-1 數值欄;僅 motion_curve: step 時露出
  • 「預覽動作」按鈕:時間軸滑桿模擬 state(t),視覺即時看 entity 從起始位置往返

kinematic_conveyor 專屬

欄位 UI
conveyor_velocity_m_s 數值欄;entity 表面繪箭頭動畫示意(速度方向 + 大小,負值反向)

全域上限提示

頂部全域 banner(場地所有頁籤共用,不只 entity 頁籤):顯示「總 entity X / 100、destructible X / 50、patch X / 50」即時計數;接近上限 🟨、超 🟥(Stage 3 拒收)。

  • entity / destructible 數 = 創作者直接標記的 mesh node 數,即時計數
  • patch 數 = 預估同時存在數 ≈ spawn_rate_per_min × lifetime_ms / 60000(依 §4.4 Weather 設定即時換算;實際 deterministic spawn 由 race_seed 決定)

詳細 schema 見 場地.md §9。

4.4 Weather

Weather 露出 UI

主面板兩區:

基本(始終露出)

欄位 UI
weather.type 3 選 1 dropdown(normal / rain / snow)
temperature 數值欄;依 type 限制範圍(normal -20~+40 / rain +2~+35 / snow -30~+2),預設 normal=20 / rain=15 / snow=-5
wind_speed_mps 數值欄(0-30 m/s)
wind_direction_deg 數值欄(0-360:水平 X-Z 面繞 +Y、俯視逆時針,0 = +X、90 = −Z;= 風的吹向)+ 風向羅盤視覺

Patch 子區塊(僅 rain / snow 露出)

欄位 範圍 預設
spawn_rate_per_min 0-30 5
lifetime_ms 30000-60000 45000
radius_m 0.2-1.0 0.5
friction_modifier 0.3-0.9 rain=0.65 / snow=0.5
rolling_modifier 1.0-2.5 rain=1.5 / snow=2.0
  • 「預覽 patch」按鈕:在編輯器場景內模擬 30s 動態 spawn,顯示色偏(rain 壓暗 / snow 提亮 base albedo)與遮蔽(auto_exposure 區域不變色、physics patch 不生成)

Weather 即時驗證

條件 視覺
temperature 逾該 type 範圍 🟥 紅
任一 patch 數值逾範圍 🟥 紅
type 為 normal 但 patch 欄位被填 🟥 紅「normal 不可帶 patch」+「Stage 3 拒收」標籤

詳細 schema 見 場地.md §8.3。

4.5 場地材質指派

  • 同 §2.3 通用材質指派流程(逐 sub-mesh 指派 + 主 / fallback 材質)
  • 額外:場地允許 visual_only 純視覺 mesh(無 collider)→ 該 sub-mesh 不需指派材質

4.6 零件與場地表面微調與拓樸修補

表面工具適用於零件與場地,只作用於作者已明確確認的 {node, primitive, connected component},不依公版模型 形狀、道路名稱、世界高度、重力或 world Y 猜測目標。局部放大或 orbit 後仍可重新選取較低層 道路;若目前視線命中不到既有 lock,必須重新確認,不能自動切到屋頂或其他樓層。

模式 作者控制 幾何行為
拉凸/壓凹 半徑、強度、硬度、邊界保護 沿命中連通表面的 area-weighted authored normal 位移;兩者使用同一 hardness falloff
平滑 半徑、強度、硬度、邊界保護 沿 authored local normal 朝一環鄰點平均表面收斂,使凸起降低、凹陷補高;不沿切平面橫向重排頂點
整平 半徑、強度、硬度、邊界保護 朝筆劃起點的 tangent plane 收斂,不朝世界水平面
補洞 明確選一個閉合 boundary loop,先預覽再確認 僅用既有 boundary vertices 嚴格三角化;winding 依有向 boundary half-edge 閉合
橋接 同 primitive 明確選兩個 loop,作者切換正/反兩種預覽 依周長參數建立 zipper faces;不自動猜作者想要的方向

畫筆固定以 radius / 4 重採樣。拉凸、壓凹與整平在同一筆筆劃的重疊 stamp 只取最高權重; 平滑則把重疊 coverage 轉成最多八輪同步的一環收斂,每輪都由當輪幾何重算法線、以強度為 單輪位移上限,且不因 pointer 事件頻率或頂點遍歷順序改變結果。成功提交後介面顯示上一筆 實際移動的頂點數與最大位移,讓沒有變更與位移過小可被分辨。banked、垂直、倒掛與 360° 迴圈使用 authored surface frame;不把重力當局部幾何方向。拓樸工具遇到 non-manifold、開鏈、退化面、自交、非有限數值、 不相容 NORMAL/TANGENT 或超出成本上限時整筆拒絕。若沒有 exact boundary edge,介面明示 視覺開口可能是遮擋、法線或材質,不提供假補洞。

一次筆劃或一次修補各是一筆全 editor undo transaction;POSITION/NORMAL/TANGENT、indices、 viewport、surface query、碰撞輸入及 RoutePoint/RespawnPoint surface anchor 同時成功或同時回復。 必要 anchor 無法保留時不允許部分套用。材質仍由 §4.5 獨立處理;本工具 不建立區域抓地力、每面質量或熱語意。

每次提交都 materialize 當前 overlay 並完整重跑 Wave A;volume、surface area、AABB、 質心/質量、頂點/三角形與 surface index 必須由修改後幾何重建,失敗時整筆補償。undo/redo 同時切換相符 facts。零件三出口之後仍完整重跑 PhysicsManifest、part canonical finalizer 與 strict validation;編輯期能預覽不代表可繞過發布 gate。

5. Stage 1 / Stage 3 互動

5.1 Stage 1 上傳預檢提示

type 定案的 marker 分支與 5 情境 UI

帶 current marker 的 canonical reopen/fork 直接顯示其精確 type 並鎖定;UI 不得覆寫。下表只適用 於沒有 current marker 的一般外部來源,依 runtime.md §10.1 判定:

情境 UI
GLB 無 type + 幾何符合 UI type 直接進 Stage 2,無提示
GLB 無 type + 幾何不符 🟥 上傳失敗 modal:「GLB 幾何不符合所選類別 <UI type>,請重選類別或重出 GLB」
GLB 有 type + 幾何符合 + 與 UI 同 直接進 Stage 2,無提示
GLB 有 type + 幾何符合 + 與 UI 不同 🟨 提示 banner:「GLB 內宣告為 <GLB type>,但 UI 選 <UI type>;以 UI 為準覆寫 GLB type」+ [繼續] / [取消]
GLB 有 type + 幾何不符 🟥 上傳失敗 modal:「GLB 宣告為 <GLB type> 但幾何不符所選類別 <UI type>」

其他寬鬆檢核拒收 UI

詳細條件只以 流程/UGC上傳.md §3 為權威。UI 將同一個 Stage 1 finding code 映射為紅色 modal,顯示實際值、上限與可行修正;禁止材質則顯示為「已剃除,請在 材質頁重新指派」提示,不產生 Stage 1 reject。

5.2 Stage 3 拒收清單

送出前置 gate = 即時檢核紅框(§3/§4 各表)——任一紅框存在時三出口皆灰掉;按下送出後才跑 wave B + 嚴格 schema 檢核(§5.3),任一條件未過:

  • 退回編輯器
  • 側欄露出「拒收清單」可滾動列表,每條:
  • 拒收條件中文敘述
  • 對應元件 / 欄位連結(點按跳轉並高亮,3D 視角自動 focus)
  • 修復建議(如有)

拒收條件對應 UI 行為

拒收條件 跳轉目標
必填欄位缺失 對應欄位,紅框
整車質量 / AABB / 密度比超範圍 統計面板「整車總覽」
Mount 偏離 / 重疊 / 軸夾角超 對應 Mount empty,3D 視角 focus
destructible + visual_only 同時設 對應 entity 設定面板
chip skill 重複 / 總 allocation_pct > 100% 對應 chip part 編輯面板
weapon active 但缺 weapon_mechanism / weapon_main_mesh_node 對應 weapon part 編輯面板
general actuator 缺 weapon_max_angle_deg 同上
RoutePoint 未貼面 ±5mm / 相鄰重合 / 數量不合(open ≠ 2 / fixed < 2) route 編輯頁籤,跳轉該 RoutePoint
KillZone / RespawnPoint 超場地 AABB 對應 empty,3D 視角 focus
反複製檢查回傳拒收 🟥 顯示相似對象(CID)與可執行救濟入口;門檻、對象分層與處理只見 流程/UGC上傳.md §4
反複製檢查回傳 pending 🟨 顯示隔離狀態與可執行後續;經濟效果只見 版權.md §5.3

反複製兩列(fingerprint)僅出口 B(上鏈)適用;出口 A 本機測試與出口 C 可編輯 GLB 跳過純鏈上關卡(§5.3)。

詳細條件見 UGC上傳.md §4。

Stage 2 編輯個別 part 時無從預警的條件(僅組裝 / Stage 3 才能檢核,編輯時不顯示警告):

  • 整車層約束(數值只見 零件與共用介面.md §7.1)— 需所有 part 都選齊才能算
  • Mount 對接 schema 合法性(chassis 端 mount 與 part 端 mount 配對成功)— 需 chassis + part 都上傳才能驗

編輯個別 part 時 UI 不顯示這些紅框;組裝階段 / Stage 3 才檢核並提示。創作者應理解「單 part 編輯通過 ≠ 組裝後一定能上鏈」。

5.3 送出(本機測試 / 上鏈 / 可編輯 GLB)

互動骨架

頂部 toolbar 提供「本機測試」「上鏈」「匯出可編輯 GLB」(Mobile 收進單一「送出」目的地選單,§0.5);未通過檢核時皆灰掉(hover 顯示拒收條件數量)。三出口共用 canonical 前段管線(UGC上傳.md §2——本機品 = 上鏈品物理一致、本機可存即保證可上鏈):

  1. wave B 自動計算(Voronoi 預烘焙 / aero 六軸面積與各向壓力中心 / typed exposure / auto_feature_deviations 介面特徵絕對公差 / thermal_limit 合成)→ 顯示進度條 + 當前項目;任一失敗 → 退回編輯器並標紅出錯欄位
  2. 嚴格 schema 檢核(見 §5.2 拒收清單)→ 任一條件未過 → 退回編輯器並顯示「拒收清單」側欄

出口 A:本機測試(免燒幣、無確認 modal、可覆寫重存):

  • 跳過反複製 / similarity 宣告 / 文字黑名單(純鏈上關卡)→ 存 local:<uuid>(IndexedDB local-parts / local-tracks);測試零件只可裝入本機測試車位,測試場地只可用於本機測試
  • 結果頁:[前往車間組裝測試] / [繼續編輯] / [上鏈轉正];編輯 session 保留(可續改)

出口 B:上鏈:

  • 燒幣確認前顯示 presentation 欄:顯示名稱、描述與 tags。欄位以共用 canonical validator 即時檢核(NFC、控制字元與 byte/code-point 上限);這些值不寫入 GLB 或 immutable admission metadata。
  • 燒幣確認 modal:「將燒 50 minor units(零件)/ 500(場地)登記上鏈;此為 ledger 註冊費,不購買永久檔案託管或可得性保證。CID 與 GLB extras 鎖死後不可改。確認上鏈嗎?」+ [確認] / [取消]
  • 上鏈進度頁:三段進度條(CID 計算 → IPFS 寫入 → ledger 簽章),全程不可中斷
  • 結果頁:
  • 成功:顯示 CID + [檢視我的資產] / [繼續上傳下一個],編輯 session 狀態清除(記憶體、A2 無草稿)
  • 失敗(網路 / IPFS / ledger 異常):顯示錯誤訊息 + [重試] 按鈕(未發生扣款——燒幣內嵌於上鏈事件、事件未落地即無燒幣;session 狀態保留可立即重試)

已發布 UGC 的詳情/資產管理面另提供「編輯顯示資訊」:載入 current revision,送出完整替換的 name/description/tags,簽署 UgcMetadataUpdateEvent(revision = current + 1)。若 revision 競爭、 一小時冷卻未滿、作者不符或 CID 已黑名單,保留輸入並提示重新整理/可再送時間;不得覆寫舊事件。 可再送時間以帳本 current presentationUpdatedAt(canonical state.derivedAt)為錨;送出 preflight 把即將 stamp 的本機時間代入 max(mirrorHead.derivedAt, now),投影 fold 會採用的 effective time, 不得只讀可能停滯的 mirror head,也不得任意自填 timestamp。提交期間採 single-flight,不建立離線多筆更新佇列。ledger append 完成只代表日誌寫入,UI 必須等 provider 刷新權威 state 並確認目標 revision 後才關閉 modal/顯示成功。

出口 C:匯出可編輯 GLB:

  • canonical finalizer 成功後才展開 Draco、將 KTX2 轉為內嵌 PNG,並移除 open4wd_version/auto_*;保留 hierarchy、material、authored transform、Mount/Pivot/Axis 與 authored extras
  • 另寫 editor-only open4wd_editor provenance;幾何與 Node TRS 本身已是最終新基線,重匯入不還原作者倍率或匯出前狀態,只依 normalized_meters 跳過二次單位換算/provisional fit。canonical finalizer 會以權威 extras 取代它,不進 runtime 或鏈上格式
  • 直接下載,不新增本機資產、CID 或 ledger 事件;轉換失敗不產生部分檔。再次匯入仍重新 sanitize、Wave A/B、驗證、標記與壓縮;精確保存/補回原 CID 請使用 UGC 詳情頁的 CAR 保存包

跨檔對接

具體流程細節(Stage 3 wave B 計算項目、IPFS pinning、ledger 簽章內容、燒幣事件)見 UGC上傳.md §2 Stage 3 + §5 階段對照表。具體文案 / 視覺屬 UI 設計層,不在本 spec 規範。

6. 跨檔對接

來源 內容
建模參數.md 欄位 schema、約束、auto_* 規則
流程/UGC上傳.md Stage 流程、資料層狀態轉移、拒收條件
程式參數.md PART_VERTEX_COUNT_MAX / TRACK_COLLIDER_TRIANGLE_COUNT_MAX 等常數來源
UGC機制.md sanitize / 反複製 / sub-mesh 切分 · 拼接
材質表.md 材質 enum + 物理欄位
遊戲機制.md runtime 玩法(脫離 / 掉出 / b-soft 觸發條件)
車輛組裝.md 組裝階段提示(chip weapon skill 未掛 weapon 等跨階段警告)
程式架構/editor.md 實作層(wave A Worker 管線 / 檢核引擎與收件端共用 validator / session / 三出口與 editable 轉換)
ui-frontend.md RWD 斷點(§10)/ a11y(§11)/ 表單檢核兩層(§4.1)/ o4-* 元件

7. 契約沿革

具名介面的廢止、改名與取代關係見 決策索引的廢止與改名索引;完整變更流水帳見 歷史記錄.md。