scanatweb-cover-cn.png

Snapshot

角色 交互设计 · 可运行原型 · Design Engineering · AI辅助编程
项目类型 持续原型探索与整合
平台 Web(浏览器端 3D 原型,three.js / R3F)
时间跨度 2026年2月 – 8月
我的贡献 1. 独立完成从 LidarLab 3D 到 5 个专项 Demo 的设计与实现;
  1. 将验证过的交互重新整合为 3D Studio 综合原型;
  2. 整理统一拾取、功能注册、测试方式等可复用规则。 | | 当前状态 | 3D Studio 已完成整合;后续计划整理为团队共享的原型基座。 |

<aside>

Live Demo ↗

</aside>

TL;DR

Scanat 的核心操作发生在 3D 模型中。拖拽命中、相机运动、空间方向、遮挡以及多个工具共存时的交互冲突,都很难只通过 Figma 判断。

从 2026 年 2 月开始,我使用 AI 辅助编程制作可运行 3D 原型:先为具体问题建立独立 Demo,验证交互手感和几何逻辑;到 8 月再把已经验证过的功能整合进 3D Studio,检查它们进入同一产品环境后的状态和冲突。

**我的工作:**独立完成原型实现,并在整合过程中整理代码职责、统一拾取入口、Feature 注册方式和基础测试规则。

scanatdemo-01-cn.png

1. Problem 问题定义

静态稿无法验证 3D 操作

Scanat 用户需要直接在 3D 模型中测量、标注和编辑。Figma 可以说明界面结构,但无法真实判断拖拽是否容易命中、相机变化后控件是否稳定、空间方向是否正确,以及动画和遮挡在实际运行中的效果。

因此我逐渐把可运行原型加入设计过程,用浏览器直接验证这些问题。

独立 Demo 无法验证功能共存

专项 Demo 适合解决单点问题,但真实产品中的笔记、测量、Gizmo、相机控制和模型缩放会同时作用在同一个场景中。随着 Demo 增加,我开始需要验证共享指针事件、跨工具状态、坐标变化和视觉层级等问题。

这成为重新建立综合原型的直接原因。


2. Approach

3D Studio 并不是一开始就规划好的平台,而是随着真实项目逐步形成的。

阶段一:LidarLab 3D

2026 年 2 月,我先制作 LidarLab 3D,验证浏览器端加载点云、距离测量和体积可视化是否可行。后来 Scanat Volume 的部分可视化探索也直接使用了这里的测试结果。

这一版只是一次性验证工具,没有为后续扩展设计结构。主要考虑这个阶段最重要的是快速验证 3D 技术和交互是否可行,在需求尚未稳定时提前建立完整架构反而会增加维护成本。

scanatdemo-02-cn.png

阶段二:专项 Demo

2026 年 5 月到 7 月,新的 3D 交互需求陆续出现。我没有继续扩展旧原型,而是为每个问题单独建立 Demo。这样每个 Demo 都只包含验证当前问题所需的最小功能,避免已有状态和交互干扰测试。

Demo 时间 主要验证内容
scale-transition 2026-05 模型比例变化后,相机如何补偿视觉大小
cube-gizmo 2026-06 起 Gizmo 在触屏和鼠标两种输入方式下如何移动、旋转和命中
measure-copy 2026-07 复制测量项后如何把它移动到新位置,以及拖拽放大镜的交互
reset-view 2026-07 相机如何从任意状态平滑回到默认视角
note-text-display 2026-07 场景内锚点、引线和文字如何在相机运动时保持流畅

每个 Demo 只处理一个问题,可以更快地调整交互和排查边界情况。

scanatdemo-03-cn.png

阶段三:整合为 3D Studio

到 2026 年 8 月,单点问题已经积累到一定数量。我重新整理旧原型,把已验证的交互迁移进更接近 Scanat 产品环境的 3D Studio。

专项 Demo 继续用于快速单点测试,3D Studio 用来检查功能共存时的交互、状态和性能。

scanatdemo-04-cn.png


3. Design Decisions

决策一:独立 Demo 和综合原型同时保留

两种原型解决的问题不同:

独立 Demo 3D Studio
主要目的 验证单个交互是否成立 验证多个功能同时存在时是否冲突
修改范围 小,可以快速试错 需要考虑已有功能和产品状态
适合观察 拖拽手感、数学、局部边界情况 跨功能状态、视觉层级、指针冲突、整体操作流程

后续复杂交互仍可以先在专项 Demo 中快速验证,再放入 3D Studio 检查真实产品环境下的共存问题。

决策二:先整理原型结构,再整合功能

开始整合时,核心文件 LidarViewer.tsx 已有 3543 行,组件、算法和面板 UI 混在一起。如果继续把专项 Demo 接进去,后续很难单独定位问题。

因此我先按职责拆成:

拆分后,主文件缩到约 1559 行,主要保留场景总装和壳层状态。

scanatdemo-05-cn.png

决策三:统一多功能共存时的交互规则

当笔记、测量和 Gizmo 等功能逐渐进入同一个 3D 场景后,我关注的不再只是单个 Demo 是否可用,而是它们同时存在时会不会互相干扰。例如一次点击可能被多个工具同时响应,或者不同功能争夺同一类操作。

因此我先统一了输入规则:由当前任务和工具状态决定谁响应用户操作,避免多个功能同时处理同一次输入。规则确定后,再在 AI 的协助下把它落实到可运行原型中。

功能入口:根据使用时机决定位置。 不同功能的使用方式并不一样:有些属于持续使用的工具,有些只在选中对象后才有意义。我根据任务状态把入口分别放在工具栏、侧边面板或选中态操作区,而不是把所有功能平铺在同一层级。实现上,再在 AI 的协助下整理成可复用的功能注册方式。

scanatdemo-09-cn.png

验证方式:先确认逻辑,再测试手感。 Gizmo 等 3D 交互既有空间计算,也有实际操作体验。如果两类问题混在一起,很难判断到底是交互方案还是实现出了问题。因此我先在 AI 协助下验证移动、旋转等基础逻辑,再回到浏览器测试命中范围、拖拽手感和不同视角下的表现。

整合过程中还发现了显隐状态、浏览器运行状态等静态稿无法暴露的问题。这些情况进一步说明:对于复杂 3D 交互,可运行原型不仅用于展示方案,也是在设计阶段提前发现边界问题的一种工具。


4. Prototype Examples

3D Studio 综合工作区

在接近真实产品的界面中同时运行多个 3D 功能,用于检查跨工具状态与交互冲突。

https://res.cloudinary.com/v7b2p5ho/video/upload/v1786953524/cljqazqkn2zgc7kperws.mov

专项 Demo 入口

每个功能仍然保留独立页面。在需要调整单个交互时,可以回到专项 Demo 中快速测试,再把确定后的版本同步到 3D Studio。

https://res.cloudinary.com/v7b2p5ho/video/upload/v1786953526/qi4qgbid6okgfi5ahpun.mov

5. Outcome

**原型产出:**2026 年 2 月到 8 月,共完成 LidarLab 3D、5 个专项 Demo 和整合后的 3D Studio。

**产品应用:**几个Demo的可视化探索均应用于生产环境的效果和参数交付,尤其是体积测量、立方体Gizmo以及修改比例等,大大减少了设计与开发的沟通成本。几项功能也均已上线,整体的交互和动画效果与Demo基本一致。

**内部评价:**立方体Gizmo、重置视角、修改比例功能的动画和交互参数直接应用于生产环境,开发同事认为这大大节省了开发时长,减少了试错成本。

6. Reflection 反思

  1. 原型粒度需要根据问题选择。 独立 Demo 适合快速验证单个交互,综合原型适合检查它进入真实产品环境后的冲突,两者不是替代关系。
  2. 原型被反复复用后,需要基本的工程边界。 一次性 Demo 可以更快,但当多个功能开始共存,就需要整理职责、输入入口和测试方式。
  3. AI 缩短的是实现和排查时间,不替代产品判断。 哪些交互需要保留、如何适配当前产品结构,仍然需要结合具体场景重新决定。