motion-batch3 · 引线 / 主题波 / 拆解(候选样张)
留档说明(2026-10-09):样张代码在
prototypes/motion-batch3/,未并入主应用。文中提到的*.patch是当时交付的补丁,内容就是该目录;补丁文件本身不入库。
基线:6782659 + motion-batch1 + motion-batch2。样张只在 prototypes/motion-batch3/,服务端口 8889,不改 app/jmos。 做法与数值参考 reference.md §3.1、§3.8、§3.9 和 §4.1 第 5、7、8、9 条;代码为本仓库新写,未复制外部代码(不需要 MIT 声明)。没有用参考方的名称、配色或字体,也没有新增色值:样张文件里 HEX / rgba / color-mix 为 0 处;verify.mjs 里只有用来比对计算结果的 rgb() 期望值。
产出:motion-batch3.png、motion-batch3.mp4、本文件、motion-batch3-sample.patch(只含 prototypes/motion-batch3/,没有模型文件)。
1. 三项内容
1.1 跟随 3D 的标注引线(04 GLB 孪生 + 04 低多边形查看器)
- 形态:1px 折线(设备 → 拐点 → 信息牌)+ 两个 6px 端点;颜色
--jmx-3d-select,信息牌用--jm-bg-overlay/--jm-border-strong/--jm-shadow-2。 - 跟随:每次 3D 重绘后用当前相机投影设备中心,和 3D 同一帧写入,不另起定时器。
- 展开 360ms:端点 0–90ms → 线 50–270ms → 信息牌 190–360ms(三次缓出);收起 200ms。
- 换选:信息牌留在原处只换内容,线从新设备重新展开;新设备会被牌挡住时才换边,换边时先在原处收起(200ms),再在另一侧展开(360ms),不瞬移。
- 遮挡:设备被别的设备挡住时,线改虚线、设备端点改空心。出视野:不画线,信息牌提示「在视野外」并给「定位 / 复位视角」。
- 避让:信息牌盖住的工位标签暂时隐藏;牌的位置避开视窗里的工具条、图例。
- ≤640 不画线、不出信息牌(详情本来就在页面下方)。
- 查看器原页面只画静态视图;样张打开了 TwinScene 自带的轨道相机(页面提示里本来就写了「拖动旋转 / 滚轮缩放」)。
1.2 05 应用中心主题波
- 点主题按钮:从焦点卡开始按距离向外换色,每张卡在 0–280ms 内依次开始,单卡 240ms,界面外框 450ms,全部在 600ms 内结束。
- 同一个 rAF 时钟驱动卡片(含 CSS 3D 卡里的图和阴影)和页面外框;结束时卡片不再保留自己的主题,整页只看
<html data-theme>。 - 中途再切换:已换的卡按反方向退回,没换的卡直接取消,继续走到底。
- 减少动态效果:直接切换。05 已批准的角度、参数、交互不变;嵌在 07 里的 05 仍按原规则随 07 重载换主题。
1.3 设备拆解(04 GLB 内的模式)
- 入口:信息牌「拆解查看」、
?mb3=explode、Esc 收起。 - 用现有 GLB,按材质分 9 类,单台设备出现 4–8 组(OP070:8 组);每组按层向上 + 水平外推。
- 阻尼展开(速率 5.5,指数逼近),取景同步拉近 8%;镜头先飞到设备(保持视向,仰角 0.6 rad)。展开和合拢都能中途反向,从当前位置接着走。
- 右侧部件清单 ↔ 3D 双向联动(点清单高亮部件描边;点 3D 部件选中清单);方向键切换。
- 就地问小锦「这个部件是什么」:答案在清单下方,演示文案并注明来源;提工单只生成待确认项(A-1009-0xx),设备数据不变。
- 材质:深色下拆开的部件加
--jmx-3d-rim边缘描边(不透明度 .42)表现层次,浅色用edge色描边;不改原有材质和灯光。 - 分档:接第一批 JMRender,流畅档没有阴影,拆解时也不重算阴影;其他档每帧标记阴影更新。
- 手机:部件清单变成底部抽屉(42dvh,行高 44px,在标签栏之上),3D 画面中心随展开上移,收起复原。
2. 验证(两个引擎 Chromium + WebKit,软件渲染)
| 项目 | 结果 |
|---|---|
| 矩阵:浅/深 × 390 触屏/768/1440/2560 × 04 GLB、04 查看器、05、07 里的 04 | 64/64(改 leader.js 后、检查改为最多等 6s 轮询后全量重跑):0 报错、无横向溢出、切主题后 07 与内嵌页同步、≥641 有引线、≤640 无引线 |
| 行为 | 50/50(每引擎 25) |
| 引线跟随(拖动旋转 + 滚轮缩放,逐帧比较端点与相机投影) | 最大误差 1.20–1.37px(< 2px),端点移动 408–448px |
| 展开时间线 | 360ms,信息牌 200ms 起淡入,线 270ms 画满 |
| 换选 | 同侧:信息牌全程不透明;换边:位置只在看不见时改变(无瞬移) |
| 遮挡 / 出视野 | 虚线 + 空心端点;出视野不画线,点「定位」回来重新连线 |
| 拆解 | 单调到 1,zoom 1.08,8 组 = 清单 8 行;合拢中途再展开、展开中途合拢均从当前位置反向,多次反向后位置误差 0、zoom 1、选中框和引线恢复 |
| 05 主题波 | A-01 → A-02 → A-03 依次开始,全部结束 528–560ms;反向后回到原主题,卡片不留自己的主题 |
| 05 角度 / → 键 | 和第一、二批逐个 transform 一致 |
| 减少动态效果 | 主题直接切换;信息牌直接出现;拆解直接到位 |
| 对比度 | 引线对视窗底 4.77(浅)/ 6.76(深);信息牌小字 ≥ 4.65 |
| 手机拆解 | 抽屉 354px 高、8 行、行高 44、在标签栏上方,画面上移 71px,收起后复原 |
说明:软件渲染一帧要几百毫秒,所以展开时间线用虚拟时钟逐 10ms 取样(只替换 performance.now),拆解反向按进度触发,每帧步长检查「从上一帧位置按阻尼逼近当前目标」。
分档相对成本(拆解展开 + 合拢期间每次 3D 重绘的耗时,Chromium 软件渲染,1440×900)
| 档位 | 像素 | 阴影 | 重绘中位数 | 相对 |
|---|---|---|---|---|
| 流畅 | 0.48M(分辨率 0.8,像素 0.64×) | 关 | 277ms | 0.59 |
| 均衡 | 0.75M | 开 | 473ms | 1 |
| 高画质 | 0.75M(DPR 1 下与均衡同像素) | 开 | 469ms | ≈1 |
绘制调用约 96、三角形约 3.1 万,三档相同;拆解额外增加的是每个部件一组边线。这里的绝对值没有意义,只看相对值;真实帧时间须在 MacBook Air 上实测。
3. 录屏与慢放检查
motion-batch3.mp4:97.4s,6.1MB,1440×900,7 段:引线 0:00 / 拆解浅色 0:20 / 拆解深色 0:41 / 手机抽屉 0:54 / 查看器 1:06 / 主题波 1:14 / 减少动态效果 1:25。 软件渲染直接录会严重掉帧:一帧 300–500ms,飞镜头只录到 1–2 帧,看起来像跳切。所以录制时把页面时钟(performance.now、rAF、setTimeout、CSS 动画)放慢 6 倍(主题波段 14 倍),成片再加速回原速。动效代码和参数都没改。 主题波在成片里看起来约 1s,原因是录屏取帧延迟。在同样放慢时钟的页面里逐帧取样,三张卡分别在 219、364、499ms 换完,和不放慢时(265 / 424 / 533ms)一致。 慢放检查记录见第 5 节。
4. 待决事项(已按默认继续)
- 查看器样张打开了轨道相机(否则引线无从「跟随」)。
- 拆解只放在 04 GLB 里;查看器原有的「拆解」按钮不动。
- 部件按模型材质归组,不是 BOM;接入真实 BOM 后替换适配层
parts-adapter.demo.js。 - 拆解时隐藏浅色全局边线,改用每个部件自己的边线。
- 主题波只做单独打开的 05;嵌在 07 里仍按重载规则;07 卡片(可选项)未做。
- 主题波期间(≤600ms)页面上其他属性的过渡暂停,只保留外框 450ms 和卡片 240ms。
- 拆解时不显示引线,合拢后恢复。
- 动效分组:引线归 surfaces,拆解归 camera(减少动态效果时都直接到位)。
5. 慢放检查记录
逐段按 2–10 帧/秒抽帧查看:
- 引线:换选时信息牌留在原处只换内容,线从新设备重新画出,没有闪烁。拖动旋转、滚轮缩放时端点贴着设备,没有抖动或滞后(逐帧误差 < 1.4px,见第 2 节)。被遮挡时变虚线、端点变空心;出视野时线消失、信息牌出现「在视野外 · 定位」,点定位后镜头飞回、线重新画出。
- 拆解:镜头飞到设备,部件逐渐分开,过程连续;清单项和 3D 描边同步。合拢中途再展开、展开中途再合拢都从当前位置接着走,没有跳回端点。合拢结束后选中框和引线回来,没有空白信息牌。深色下边缘描边清楚。
- 手机:抽屉从底部出现,画面上移到抽屉上方,收起后复原;不画引线。
- 主题波:A-01 → A-02 → A-03 依次换色,没有卡片和页面颜色错乱。中途再切换时,已换的卡反向退回,最后整页一致,不残留单独主题的卡。
- 减少动态效果:05 直接切换;信息牌直接出现;拆解直接到位。
- 发现并已修复:换选时如果信息牌要换边,原来会瞬移到另一侧。第一次改成在新位置淡入,结果旧牌会瞬间消失(自动检查抓到不透明度跳到 0)。最终改为:只有挡住新设备时才换边,换边时先在原处收起,再到另一侧展开。已补自动检查,并重录引线段。
- 录屏本身的问题:第一版成片有两段结尾少了 1–3 秒,原因是录屏取帧延迟,页面状态本身正确(单独取样验证过)。这两段已加长结尾重录。
6. 限制
- 只在软件渲染(SwiftShader / WebKit)下验证。真实 GPU 上的帧时间、阴影成本和拆解期间的帧率,须在 MacBook Air 上实测。
- 部件归组来自材质名,讲解是演示文案;接入设备手册和 BOM 之前不能作为规范。
- 新视觉(引线、信息牌、拆解清单、主题波)是候选样张,确认前不进规范。