furniture-3d-system-Wu/furniture-3d-system/docs/solutions/workflow-issues/assembly-3d-interaction-regression-20260223.md
WuYongJie 5821d73291 初始提交:3D家具安装展示系统
包含:
- furniture-3d-system:Next.js 16 全栈应用(资产中心、产品管理、3D装配动画)
- autocad-plugin:AutoCAD 家具导出插件源码
- 资产中心改造:编辑弹窗化、删除功能、Toast反馈、自定义Select组件

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 14:00:19 +08:00

4.1 KiB
Raw Blame History

title, date, module, problem_type, severity, symptoms, root_cause, resolution_type, status, confidence, tags, related_patterns
title date module problem_type severity symptoms root_cause resolution_type status confidence tags related_patterns
装配页 3D 交互回归(选中/右键材质/孔位/爆炸拖动) 2026-02-23 assembly-editor workflow_issue high
中键平移偶发触发浏览器默认行为,平移手感异常
板件点击命中率下降,选中高亮不稳定
右键材质菜单缺少完整层级与材质预览
孔位高亮与模型孔位存在偏移,爆炸拖动时错位更明显
爆炸程度滑块拖动时卡顿
交互链路在多轮重构后出现能力回退,菜单结构、拾取兜底、覆盖层坐标映射与渲染节流未统一 code_fix active high
assembly
threejs
context-menu
picking
hole-overlay
performance
WF-UI-TOKEN-RAF-001
WF-UI-WORKSPACE-MODULAR-001

现象与影响

装配页多个核心交互同时回退:板件难选中、材质菜单不完整、孔位高亮不准、爆炸拖动卡顿,直接影响装配演示与编辑效率。

排查路径

  1. 先复跑类型检查与核心测试,确保没有基础语法/类型噪音干扰。
  2. 对交互链路逐层定位:AssemblyEditorWorkspace -> ModelViewer -> ThreeDEngine -> HoleOverlay2D -> ContextMenu。
  3. 对比当前行为与预期能力,确认回退点主要集中在:
    • 拾取失败时没有兜底路径;
    • 右键菜单缺少材质三级结构与预览;
    • 爆炸滑块每次输入都触发重计算;
    • 孔位候选坐标选择策略过松,导致对齐偏差。

最终修复

  1. src/components/3d/ModelViewer.tsx
    • 增加拾取兜底:候选名拾取失败时自动执行全场拾取,再做节点名规范化映射。
    • 中键按下补 preventDefault,避免浏览器默认中键行为干扰平移。
  2. src/lib/3d/engine.ts
    • applyMaterialToMesh 补充 normalizeTooBrightMaterial,动态换材后依然执行近白灰化。
  3. src/components/3d/HoleOverlay2D.tsx
    • 引入多坐标候选择优(原始坐标/模型矩阵/板件矩阵),并收紧阈值,减少孔位偏移。
  4. src/components/ui/ContextMenu.tsx
    • ContextMenuItem 增加缩略图与预览图字段。
    • 子菜单支持材质小图和悬停大图气泡。
  5. src/app/products/[id]/assembly/AssemblyEditorWorkspace.tsx
    • 恢复右键三级材质菜单(材质、复制/粘贴、UV ±90°、材质分类、具体材质项)。
    • 爆炸滑块改为 UI 值和渲染值分离,渲染值通过 requestAnimationFrame 合帧提交。
    • 关键文案统一中文化(孔位高亮、板材折角线、爆炸程度、菜单标题)。

2026-02-23 二次回归补丁

  1. src/components/ui/ContextMenu.tsx
    • 右键菜单改为 createPortal 渲染到 document.body,修复父级 transform 场景下菜单偏移。
  2. src/app/products/[id]/assembly/AssemblyEditorWorkspace.tsx
    • showPanelLeaders 改为跟随 showFoldLines,修复板材折角线开关无效。
  3. src/components/3d/HoleOverlay2D.tsx
    • 对有 panelId 的孔位优先面板解算,失败不再回落到宽松模型兜底,避免孔位聚集到底部错位。
    • 吸附仅在近距离候选启用,并将 transformVersion 量化到 30fps,缓解拖动爆炸滑块卡顿。
  4. src/lib/3d/engine.ts
    • 爆炸进度增加小幅变化跳过与最近进度缓存,减少高频重复重算。
  5. src/lib/3d/engine-highlight-resources.ts
    • 近白灰化逻辑扩展到通用颜色材质,修复白膜材质仍偏白的回归场景。

验证

  • npm run type-check -- --pretty false 通过
  • npm test -- tests/api/auth-me.test.ts --runInBand 通过
  • npm test -- tests/lib/zip-parser.test.ts --runInBand 通过
  • npm test -- tests/services/sku-upload.service.test.ts --runInBand 通过
  • npm test -- tests/lib/engine-events.test.ts --runInBand 通过

预防策略

  • 装配页交互变更必须按“拾取 -> 菜单 -> 覆盖层 -> 性能”四段链路回归。
  • 右键菜单能力作为固定清单项(层级、复制粘贴、UV、缩略图、悬停预览)纳入 UI 回归检查。
  • 爆炸滑块与孔位覆盖层同时变更时,强制检查拖动帧率和孔位贴合度,避免单点优化引入联动退化。