編輯器操作¶
本檔角色: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 等純表單頁籤)
通則¶
- 純表單頁籤(weather/chip/motor/battery)viewport 仍顯示——僅無「點空白」預設動作(§1.2);表單住右側欄 /bottom sheet。
- 螢幕方向不強制(全站規則,ui-frontend.md §10)——top-down 正交無方向偏好、直橫皆支援。
- 快捷鍵總表見 §0.6。
工具列下方的「匯入與輸出設定」把兩種生命週期分開:part type/來源單位只套用於下一個外部 GLB;貼圖最大邊與零件三角形目標則在按下本機測試、上鏈或可編輯 GLB 時快照,三出口共用。一般 UGC 預設為 4096px/90k;公版 authoring recipe 可選較小值以符合出貨預算,但不得藉此改變物理欄位或縮限 chassis 材質、設計尺寸與造型合法性。
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)= 選中,露出對應把手(位置 / 旋轉 / 數值欄)
- 同類元件多選:PC = Shift + 點;Mobile = 長按進多選模式(軟需求)
重疊表面選擇:同一視線可同時穿過道路、屋頂、樓板、垂直牆面或倒掛路面。編輯器依
視線距離列出至多 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) |
- 編輯 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 視覺輔助層級開關¶
側欄露出「視覺層」面板,各層可獨立切換顯示 / 隱藏:
- 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 / RespawnPoint / RoutePoint / roller
Mount_Roller_*):拖把手繞局部軸旋轉 - 部分 Empty 的位置 / 旋轉被約束(例如 RoutePoint 貼 mesh 表面 + 切線在表面平面內、tire mount canonical 固定)→ 把手只露出合法 DOF
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 軸向平面切 + 封蓋)把 fused 水密實體切成數片、用拼接工具(§2.4)合併數個水密實體、或於 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:每個為完整水密實體;逐一以 position 位移定位
- 指定父 / 子關係:例如把數顆 bullet 指為
launcher_body的子件 - 合為單一資產 GLB:每個來源實體成為結果內一個水密 sub-mesh node
- 目前範圍:僅 position 定位;旋轉/縮放候選見其他.md
切分(split,由上而下:平面切+封蓋)¶
- 軸向平面切:沿 X / Y / Z 選一軸 + 位置,把選中的水密 mesh node 切成兩片
- 封蓋:對切口的開口邊界環三角化補面(處理中空 / 環狀多邊界環)→ 每片成為封閉水密實體、封閉體積正確 → 質量正確(整體 Σ 守恆);切面沿用該片材質
- 成為獨立 node:每片為結果內一個水密 sub-mesh node
- 僅對水密 node 開放:非水密 node 無法保證封蓋後體積正確 → 工具灰掉
- 目前範圍:僅軸向平面(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 自訂 9 槽(Motor / Chip / Roller × 6 / Weapon)¶
Mount 露出 UI¶
- 進入 chassis 編輯頁籤 → 顯示 chassis mesh + 18 個 Mount empty marker
- canonical 9 個(Body × 4 / Battery / Tire × 4):灰色鎖頭圖示、不可選;tooltip「canonical 固定位置不可改」
- 自訂 9 個(Motor / Chip / Roller × 6 / Weapon):可選 / 可拖;各帶不同色標區分類別
Mount 操作¶
- 點 Mount marker → 選中 → 露出 3D 位置 gizmo(XYZ 三軸)
- 拖位置 gizmo → 改 Mount 位置;數值即時顯示
- roller mount 額外露出旋轉 gizmo(hinge 軸方向,1 DOF 繞慣例 +X 軸;見 零件與共用介面.md §6.4)
- 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¶
passivetoggle:active = chipweapon槽觸發、passive = 純物理被動常駐- Part-side
Mount_Weapon拖放(active / passive 共用):可改位置(武器外觀無法預知);3D gizmo 拖;即時預覽與 chassis 端 Mount_Weapon 對接後的最終裝配姿態 magnet_source_strength_n0-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 的
chainpayload),命名Chain_Segment_<n>(n 從 1 遞增);全武器剛體轉子 + 鏈段總數上限MAX_WEAPON_DRIVEN_BODIES16 段,見 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_PIVOTS8,達上限「加列」灰掉) - 多 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 拒收」標籤 |
weaponskill 與 weapon part 搭配檢查屬組裝階段(chip part 編輯時還沒組車、無從得知有沒有 weapon mount);組裝時若 chip 上的weaponskill 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。
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_typedropdown:decoration/kinematic_move/kinematic_conveyorphysicstoggle:default/visual_only;僅decoration可選visual_only,其他類 physics 鎖defaultmaterialdropdown:材質 31 種 enum(visual_only時可不指派)destructiblecheckbox:physics: visual_only時自動灰掉並 uncheck,tooltip「destructible 需physics: default」magnet_source_strength_n0-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 |
| 平滑 | 半徑、強度、硬度、邊界保護 | 只平滑鎖定 component 的局部頂點 |
| 整平 | 半徑、強度、硬度、邊界保護 | 朝筆劃起點的 tangent plane 收斂,不朝世界水平面 |
| 補洞 | 明確選一個閉合 boundary loop,先預覽再確認 | 僅用既有 boundary vertices 嚴格三角化;winding 依有向 boundary half-edge 閉合 |
| 橋接 | 同 primitive 明確選兩個 loop,作者切換正/反兩種預覽 | 依周長參數建立 zipper faces;不自動猜作者想要的方向 |
畫筆固定以 radius / 4 重採樣。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 獨立處理;本工具 不建立區域抓地力、每面質量或熱語意。
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——本機品 = 上鏈品物理一致、本機可存即保證可上鏈):
- wave B 自動計算(Voronoi 預烘焙 / aero 六軸面積與各向壓力中心 / typed exposure /
auto_feature_deviations介面特徵絕對公差 / thermal_limit 合成)→ 顯示進度條 + 當前項目;任一失敗 → 退回編輯器並標紅出錯欄位 - 嚴格 schema 檢核(見 §5.2 拒收清單)→ 任一條件未過 → 退回編輯器並顯示「拒收清單」側欄
出口 A:本機測試(免燒幣、無確認 modal、可覆寫重存):
- 跳過反複製 / similarity 宣告 / 文字黑名單(純鏈上關卡)→ 存
local:<uuid>(IndexedDBlocal-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 - 直接下載,不新增本機資產、CID 或 ledger 事件;轉換失敗不產生部分檔。再次匯入走正常 Stage 1–3;精確保存/補回原 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。