跳轉到

編輯器操作

本檔角色: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

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

0.6 快捷鍵總表(C1)

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

平台對應

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

全域

動作 備註
Ctrl+ZCtrl+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)

編輯

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

頁籤/模式

動作 備註
17 切換頁籤(依當前模式頁籤序) 零件依 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_movemotion_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

各 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 軸向平面切 + 封蓋)把 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

  • 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_degspeed_weightphase_offset_degmotion_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_wvolume × 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 < 100mmy < 100mmz < 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 dropdowndecoration / kinematic_move / kinematic_conveyor
  • physics toggledefault / visual_onlydecoration 可選 visual_only,其他類 physics 鎖 default
  • material dropdown:材質 31 種 enum(visual_only 時可不指派)
  • destructible checkboxphysics: 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 / linearrotation_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——本機品 = 上鏈品物理一致、本機可存即保證可上鏈):

  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_versionauto_*;保留 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