Editor / Viewer 子域

July 10, 2026 · View on GitHub

最后更新:2026-07-09 | 覆盖源码:src/core/robot/assemblySceneProjection.tssrc/core/robot/assemblyScenePlacement.tssrc/features/editor/src/features/urdf-viewer/src/app/components/unified-viewer/src/shared/components/3d/ 交叉引用:architecture.mdfile-io.mdstyle-guide.mdwasm-build.md

1. 单模式 Editor

Editor 子域划分与快速映射见 CLAUDE.md §Editor 单模式。

新增功能前,先判断属于哪类子能力,避免跨子系统逻辑缠绕。

2. 目录结构

features/editor/
  index.ts                    # 统一 Editor 公开入口

features/urdf-viewer/
  components/                 # React 组件层
    ViewerCanvas.tsx          # viewer 画布层与共享 canvas 适配
    ViewerScene.tsx           # 统一场景编排,格式差异下沉到 RobotModel/backend
    RobotModel.tsx            # 后端驱动的机器人渲染与交互入口
    ViewerToolbar.tsx         # 顶部工具条
    ViewerLoadingHud.tsx      # loading 状态 HUD
  hooks/                      # React hooks
  renderers/                  # viewer backend 生命周期与 Three.js backend 适配
    ThreeJsBackend.ts         # legacy Three.js backend implementation
    createRendererBackend.ts  # source format -> backend factory
    loadedRobotSceneSync.ts   # runtime scene graph 同步
    sourceFormat.ts           # viewer source format 判定
    types.ts                  # renderer backend contract
  utils/                      # 交互、USD adapter、load key、可视化与 patch 工具
  types.ts                    # 共享类型收口
  runtime/                    # vendored usd-viewer runtime
    embed/                    # 嵌入适配
    hydra/                    # Hydra render delegate
    types/                    # runtime 类型
    vendor/                   # 第三方 vendor 代码
    viewer/                   # viewer 核心
    UPSTREAM.md               # 上游来源说明
  workers/                    # Web Workers

3. 核心 hooks / 能力

  • useViewerController:viewer 控制器
  • useMouseInteraction:鼠标交互处理
  • useHoverDetection:悬停检测
  • useVisualizationEffects:惯性、质心、原点等辅助可视化
  • useRendererBackend:统一模型加载与格式后端生命周期,backend 实现在 features/urdf-viewer/renderers/
  • useRobotLoader:Three.js backend 的底层 source loader
  • useHighlightManager:高亮管理

工具模式:select | translate | rotate | universal | view | face | measure

4. 实现约束

  • 新能力优先放入 hooks 或新增组件,不要恢复双壳并存
  • 保持 RobotNode <-> JointNode 交替递归渲染模式
  • 材质必须通过 materials.ts / urdfMaterials.ts 复用,不在高频路径直接 new
  • viewer backend / load scene sync 归 features/urdf-viewer/renderers/shared/components/3d/renderers/ 只保留 STL/OBJ/DAE/GLTF 等纯 mesh renderer 组件
  • 使用 RobotDataWorkspaceSelection 等共享类型,避免 any
  • TransformControls 引用注册必须完整、可追踪
  • Props 与共享类型统一收口到 types.ts
  • 可视化扩展通过 visualizationFactories.ts
  • 共享关节面板位于 src/shared/components/Panel/JointsPanel.tsx

5. Canonical Assembly scene projection

  • viewer 不持有可写机器人状态;useWorkspaceStore.workspace 是唯一模型,渲染数据由 createAssemblySceneProjection 只读派生
  • projection 输出 RobotDatadirect-component | assembled-scene 策略、globalToEntityRef / entityRefKeyToGlobal 双向映射和 component root target
  • 单个可见 component 且无 bridge 时可用 direct-component;其余情况使用 assembled-scene。这只是 renderer/resource 性能策略,不得改变 selection、mutation、history 或 source sync 路由
  • Assembly transform 与 component transform 由 createAssemblyScenePlacement 的统一 root placement 应用;不得恢复 source-scene 专用 transform fallback
  • renderer 点击、hover、focus、joint motion 与 transform controls 必须通过 projection map 往返 WorkspaceSelection / EntityRef;禁止解析全局 ID 文本猜 component owner
  • source file 只提供 loader/resource context。结构编辑始终写入目标 component 的 source-local RobotData,策略切换不得改动 canonical workspace snapshot

6. USD runtime 边界

  • runtime/* 是 vendored usd-viewer runtime,不要在 core/parsers/usd/* 重复实现 viewer runtime 职责
  • URDF Studio 应把 runtime 输出适配到 ViewerRobotDataResolution / RobotData
  • public/usd/bindings/* 必须保留在静态资源目录,供浏览器运行时 fetch
  • WASM 构建系统位于 third_party/OpenUSDscripts/build/;重编命令与故障排查见 wasm-build.md

7. USD worker / metadata 链路约束

适用范围:runtime/hydra/render-delegate/*workers/*utils/usd*app/hooks/useFile*.ts 中消费 worker 结果的 USD 工作流

必须遵循:

  • USD stage preparation、runtime metadata、robot hydration、prepared export cache、roundtrip archive 的修复,默认优先放在 worker/runtime 链路完成,不要搬到主线程 adapter 或 debug bridge
  • runtime/hydra/render-delegate/* 产出的 metadata snapshot 是该链路的 source of truth;缺字段应修 worker/runtime 生成逻辑
  • 禁止新增"worker 结果缺失 -> 主线程重建 metadata -> 静默继续"的 fallback
  • 对 folded fixed link、collision-only semantic child link 的推断只能基于 stage/truth 中的明确证据,不做纯命名猜测
  • visual_* / collision_* / group_* / xform_* / scene / root 这类 roundtrip 容器 prim 不是 link identity;runtime metadata 不得把它们提升为 synthetic link 或 fixed joint

验证要求:

  • 改动上述链路时,必须跑 test/unitree_model 整套 USD 浏览器验证
  • 至少覆盖 Go2 + B2 + H1-2
  • 浏览器验证产物写入 tmp/regression/

8. USD offscreen / runtime 生命周期约束

适用范围:usdOffscreenViewer.worker.tsruntime/hydra/render-delegate/*shared/utils/three/dispose.ts

必须遵循:

  • 主线程宿主只负责 handoff、尺寸同步与错误透传;不要重建 runtime truth
  • teardown 必须完整释放 observer、DOM/worker 事件监听、RAF/timer、OffscreenCanvas 关联 runtime、scene graph 与 driver 引用
  • runtime 全局 handler/registry/active owner 必须提供对称的 unregister/reset
  • worker 侧创建的 ImageBitmap、object URL、临时 geometry/material/texture 必须显式释放
  • 禁止通过全局单例把旧实例挂死

9. 关键 utils 职责速查

文件职责
viewerRobotData.ts统一 viewer 层消费的数据形态
workspaceSceneProjection.tscanonical selection/motion 与 renderer global ID 映射
viewerResourceScope.tssource file / assets / robot links 资源域
usdExportBundle.tsUSD 场景快照与导出缓存协调
usdRuntimeRobotHydration.tsruntime -> RobotData hydration
usdSceneRobotResolution.ts场景级 robot resolution
usdViewerRobotAdapter.tsviewer runtime / snapshot 到应用数据适配
usdOffscreenViewerWorkerClient.ts主线程对 offscreen worker 请求封装
usdStageOpenPreparationWorkerBridge.tsprepared-open 链路 worker bridge
usdPreparedExportCacheWorkerBridge.tsprepared-export 链路 worker bridge
runtimeSceneMetadata.tsruntime scene metadata 标准化读模型
visualizationFactories.ts辅助可视化对象创建
dispose.tsTHREE 资源清理

10. Renderer Backend 职责速查

文件职责
renderers/createRendererBackend.ts根据 source format 创建 viewer backend
renderers/ThreeJsBackend.tslegacy Three.js 机器人加载、patch、scene 同步
renderers/loadedRobotSceneSync.tsloaded scene 与 runtime robot data 的结构同步
renderers/robotLoaderSourceMetadata.tsloader source metadata 标准化
renderers/sourceFormat.tsviewer source format 分类
renderers/urdfXmlFallbackPolicy.tsURDF XML fallback 策略