brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
beat-performance-pipeline把"3D角色一段连续表演"(如 揭小贤走到茶桌坐下冲茶讲解)拆成 Beat(与配音cue逐句对齐的最小动作单元), 每个 Beat 走 设计→实现→多维evaluator(workflow)→loop 的生产管线。核心物料=【坐标契约 scene-layout.json】 (角色/道具/落座点/抓取点共用一份坐标,authoring与runtime一致=手到壶到)。当任务涉及:分镜化角色表演、 与配音同步的动作序列、道具拿放(re-parent)、走路/坐下/倒茶类动作、茶汤/重力类物理合理性检查、 逐beat评审 —— 时使用本 skill。配套 workflow:项目 workflows/beat-eval-loop.star。 ⚠️ 活文档:揭小贤茶艺表演的每个 beat 实作经验都往本文件追加。
Independent GitHub snapshot · Automated classification · Original documentation governs
扫功夫茶冰箱贴 → 揭小贤完整演出【临现招手 → 走到茶桌 → 坐下 → 拿壶 → 六式冲茶(烫杯/纳茶/高冲/低斟/关公巡城/韩信点兵) → 敬你一杯】的 29.6s 表演,与配音逐句同步,AR 尺度下可爱、对版、物理可信、流畅 —— 让用户的体感是"一个小向导刚刚请我喝了杯功夫茶"。
| 层 | 选型 | 为什么(替代方案为何不用) |
|---|---|---|
| 角色动画 | Blender 程序化 IK+bake | 已验证(Greet/Pour);Mixamo 要登录且 502 过;Tripo preset 与 mixamo-spec 骨架不兼容且无茶艺动作 |
| 走路位移 | clip 原地走 + runtime position lerp | 游戏标准技法;烘根位移会和锚定/重播打架 |
| 道具建模 | Tripo text_to_model + gltf-transform 狠减(28MB→<1MB) | 静物是 Tripo 甜区;手工建模不必要 |
| 对版 2D | codex 图生图(-i 锁参考) | 已验证可出对版可爱图;是"美术手感"的来源 |
| 口型 | 2D 说话脸 + 离线振幅包络 | 3D 口型在此资产上四法皆败(死路已证);Web Audio 在 iOS 截断配音(已踩) |
| 时序编排 | audio.currentTime = 唯一时钟驱动 beat 状态机/口型/字幕 | 单时钟零漂移(已验证);不用独立计时器 |
| 空间布局 | scene-layout.json 坐标契约(authoring与runtime共读) | "手到壶到"的根基;杜绝散落硬编码 |
| 茶流/热气 | billboard sprite(条件显隐) | 移动端流体模拟不现实;sprite 够读、够轻 |
| 评审 | Tier A python/Blender 机检 + Tier B harness 双模型 workflow + Tier C 用户 | 三层闭环已验证(口型一役);缺陷只下沉不上浮 |
| 运行时/部署 | MindAR+A-Frame / GCE+cloudflare | 既有栈不动;iOS 非 meshopt+webp 铁律 |
一段 30s 连续表演没法整体评审/迭代;Beat = 与配音 cue 逐句对齐的最小动作单元(0.7–4s), 每个 beat 有自己的【物料/动作规格/可机检不变量/视觉评审点】→ 评审环才有抓手,失败只重做一个 beat。
任务本质=一出微型舞台剧。工程件自底向上(runtime/管线),内容件自顶向下(剧本→分镜→资产→舞台→表演)——旧流程所有返工都源于把内容也自底向上做。
阶段0 立项 北极星+验收标准+工具能力实证清单(依赖的能力先真实成功调用一次才进计划)
阶段1 剧本 配音文案→TTS→cue表=唯一时钟
阶段2 分镜★ 先出**空间设定包**(2a):场景平面图/侧视图(从坐标契约正交渲染,非画的)+人-桌-凳-茶具尺寸关系图
+道具三视图(turnaround)——作为分镜与建模的**输入**;再(2b)codex 逐cue生成分镜
(每格带全套茶桌茶盘,空间一致,有位移的格要画出移动轨迹/起止位)→评审→【用户批G0】
阶段3 资产★ 从分镜推导道具清单→输入标准先行(对版参考/A-pose/无道具)→生成→压制gate
→Tier V 视觉美感闸(§2.5)→资产总览用户过目;原点/bbox实测,不许拍脑袋
阶段4 舞台★ 照分镜摆3D:原点修正+bbox进契约+可达性预验(臂长vs所有交互点)
→"3D vs 分镜"并排图→【用户批G1】→契约冻结(冻结前禁止下游并行)
阶段5 表演 逐beat串行闸:codex设计→codex脚本(/tmp工件)→主循环Blender执行(每次干净导入)
→Tier A(本地确定性,不依赖provider)→渲染(机位=分镜机位)
→Tier B(基准=像不像分镜那格)→过闸入库;walk/sit优先动捕,程序化只做手势
阶段6 集成 白名单导出→资产链路检查表(新模型必须确认动画已重绑)→【无视觉证据不得部署】→真机=用户终审
| 步骤 | ① 自动脚本验收(确定性,本地) | ② 视觉验收 | ③ 代码验收 |
|---|---|---|---|
| 3a 道具参考图 | 文件存在>100KB;轮廓比例机检(PIL 前景 bbox,如桌 h/w∈[0.32,0.48]) | 主循环对版分镜+美感初筛 | — |
| 3b 建模+压制 | GLB 可 parse;bbox 三轴比例进容差;压后≤单件预算、总和≤3MB | 4 视角渲染→双模型 Tier V(对版/美感/压缩损伤/语义,基准=参考图+分镜) | 压制参数有出处 |
| 4 舞台 v3 | 接地误差<0.005;桌上物 y=桌面±0.005;bbox 互不穿插;出生点+路径点距桌 footprint≥0.05;全交互点 reach≤0.95×臂长 | 正交三视图+与 sb_S 对位并排图→双模型+主循环(G1') | 契约 diff 审:每个数字写得出推导来源 |
| 5 动画重校 | 每 clip 自检 print PASS(脚穿/髋漂/触达/躯干上限/循环闭合) | (并入渲染步统一看) | 脚本 diff 审:只许坐标/时序变,逻辑不许漂 |
| 6 渲染+Tier B | 帧数=窗口×24±1;角色入画机检(前景 bbox 占画面高 25-70%);strip 拼装 exit 0 | 每 beat 单帧先审→全量;beats-visual-batch 双模型 5 维,基准=对应分镜格;主循环终筛 GIF | 机位表逐项=分镜镜头表 |
| 7 集成 | 导出 clip 清单=JYX_BEATS 引用集合(脚本读 GLB 比对);beat 窗口铺满 [0,29.6] 无缝隙无重叠(脚本验);build/tsc 0 错;资产总预算复核 | 本地 preview 逐 beat 截图证据包(=「无视觉证据不得部署」的证据) | runtime diff claude 关键位审 |
| 8 部署+终审 | 部署后 curl 200;线上资产 hash=本地 | 真机=用户终审 | — |
横切纪律(根因→规则):
{ "units":"character_height=1.0", "anchor":"magnet center, x右 y上 z朝用户",
"P0_spawn":[0,0,0.05], "table_pos":[...], "table_top_z":0.xx,
"stool_pos":[...], "seat_hip":[...], "pot_on_table":[...],
"cups":[[c1],[c2],[c3]], "gaiwan":[...], "walk_path":[[..],[..]] }
pot_on_table 的 IK 目标 = runtime 壶的真实位置 = 手到壶到。blender = (c_z, c_x, c_y) × H + (0,0,z0),其中 H=角色 Blender 世界身高(实测 0.997≈1.0,契约单位≈Blender 米),z0=脚底。循环置换、行列式+1,相对几何全保。**推导曾给出错的 −c_x(把桌放反到角色右侧),靠"放标记物→渲染→对照 AR ry=270 真实朝向"才抓出来——映射永远实证,别信推导。**角色在 Blender 面朝 +X=契约 +z(朝用户);角色左手侧=+Y=契约 +x。runtime 侧契约直接用(A-Frame 锚系原生),无转换。audio.currentTime 是唯一时钟;beat 状态 = currentTime 的纯函数(给定 t 能无状态推导出:当前 beat、walk 位移比例、壶/杯父子关系、茶流显隐)→ 暂停/seek/重播/锁屏中断天然正确。禁止事件驱动累积状态(中断后对不上)。重听=seek 到 7.5s(B3 起点)。字节/三角数 gate(Tier A)只是底线,不是验收。 每个道具(桌/凳/壶/杯/盖碗/…)必须再过:
Tripo 生成 → 压到 gate → 渲两视图 → 双模型视觉评审 → 过才进契约摆位。public/beats/,用户看的是动图不是静帧。测量层原则(评审纠出的关键):Blender 只测得到骨骼/物体变换;走路 lerp、re-parent 连续性、茶流 sprite、音频生命周期是 runtime 现象,必须用 R 层测——做法:页面挂
window.__jyxBeatProbe(每帧记录 t/beat/关键世界坐标/倾角),headless Chromium(Playwright)跑一遍录下来→python 断言;V 层=渲染给视觉 agent/人。
配音 cue:0-4.5 你来啦/小向导 | 4.5-7.5 来先坐下 | 7.5-12 待客泡茶 | 12-14 工夫二字 | 14-14.7 烫杯 | 14.7-15.4 纳茶 | 15.4-16.1 高冲 | 16.1-16.9 低斟 | 16.9-18 关公巡城 | 18-19.2 韩信点兵 | 19.2-21.1 都有学问 | 21.1-26.3 品字/七分满/人情 | 26.3-29.6 敬你慢慢品
时间戳=cue 显式绑定(状态机/机检/重播 seek 的依据);倾角单位一律【度】;不变量后括号=测量层(B/R/V)。
| Beat | [t_start,t_end] | 物料 | 动作要点 | 特别注意(物理/空间) | 关键不变量 |
|---|---|---|---|---|---|
| B0 茶席组装 | (离线) | 桌/凳/壶/3杯/盖碗 GLB + scene-layout.json | Blender 统一尺度朝向;桌高≈角色腰;第一件事:实证坐标系映射 | 尺度=角色身高1.0;按概念图 scene_1 摆 | 桌高=0.45±0.05;契约真值回写;映射函数冻结 |
| B0.5 临现招手 | (点击前,不计时) | Greet clip(已有) | 循环招手,茶席已在右侧 | 等「听讲解」;点击=用户手势解锁 audio | (已验收的 Greet) |
| B1 走步 | [0.0,4.5] 哎/你来啦/我是揭小贤/小向导 | WalkInPlace clip | 2-3步弧线+lerp位移+渐转向 | 防滑步;下摆穿模→抬腿小;绕开桌角;bob 2-3%;4.5s走~0.5单位=慢悠悠正好 | (R)速度匹配±10%;(B)脚不入地;(R)终点=凳前±5% |
| B2 坐下 | [4.5,7.5] 来/先坐下/喝杯功夫茶 | SitDown clip+凳 | 髋先后移到凳上方再降;膝~90°;脚触地 | 长袍穿模→桌面遮挡;凳高=契约seat_hip | (B)落座髋=凳面±2%;脚触地;髋xy=凳心±5% |
| B3 拿壶 | [7.5,9.0] 我们潮汕人待客 | (壶在桌) | 右手IK→pot_on_table→抓→提 | mitten手:壶贴掌心柄朝外;先验可达性;re-parent快照法 | (B)抓帧手壶距<2%;(B)可达;(R)切换位置差<1% |
| B4 持壶介绍 | [9.0,14.0] 头一桩…工夫二字 | — | 持壶轻晃+左手比划 | 壶口朝上不漏茶 | (B)倾角<15° 全程 |
| B5 烫杯 | [14.0,14.7] 烫杯 | 茶流sprite | 壶横扫三杯上方浅倒(snap) | 0.7s=17帧:只做"扫"一个要素,无预备 | (B)壶x扫过≥2杯;(R)流随壶 |
| B6 纳茶 | [14.7,15.4] 纳茶 | — | 左手向壶口捏指撒茶 | 左手别穿壶/脸 | (B)左手-壶口距<5% 一次 |
| B7 高冲 | [15.4,16.1] 高冲 | 茶流(长) | 壶猛提向下倒,标志动作 | 壶别穿帽/头;先验坐姿可达——够不到头顶就改"尽臂长最高点" | (B)壶y>可达上限90%;倾角>40°;壶-头距>阈 |
| B8 低斟 | [16.1,16.9] 低斟 | 茶流(短) | 壶降到杯沿高贴近倒 | 与高冲对比明显 | (B)壶y<桌面+2杯高;倾角25–40° |
| B9 关公巡城 | [16.9,18.0] 关公巡城 | 茶流 | 持续出水匀速横扫三杯往返 | 壶嘴对准杯列;流终点依次划过三杯 | (B)壶x单调扫3杯再返;倾角>25°全程;平滑 |
| B10 韩信点兵 | [18.0,19.2] 韩信点兵 | 茶流(滴) | 三次点滴,一杯一点 | 每点壶嘴对准杯心 | (B)倾角峰=3;每峰壶x=杯x±半杯距 |
| B11 放壶 | [19.2,21.1] 一道道都有学问 | — | 壶放回桌+直腰点头 | 壶底贴桌;放下倾角→0 | (R)壶位=初始±2%;(B)倾角<5° |
| B12 品字手势 | [21.1,26.3] 品字/七分满/人情 | 液面sprite升至70% | 左手摊掌指三杯 | 茶汤状态机在此段完成"七分满" | (R)液面=纯函数(t) |
| B13 敬茶 | [26.3,29.6] 来/这第一杯敬你/慢慢品 | 前杯re-parent | 双手捧前杯向用户前伸+微躬定格 | 杯水平<10°(带茶面);杯不穿桌 | (B)抓帧手杯距<阈;前伸>15%;杯倾<10° |
| B14 复位 | [29.6+](ended) | — | 杯归位→坐姿呼吸idle | 状态=纯函数(t),重播seek 7.5s即自洽 | (R)道具=契约初始位 |
nla.bake(visual_keying;Blender 5.x 用 bpy.ops.pose.select_all 不是 bone.select)→ ACTIONS 导出多 clip。见 blender-mcp。a-gltf-model position lerp(标准游戏技法)。bone.add(obj)/快照世界矩阵;A-Frame 实体可被 three bone.add 收编(jyx-handprop 组件)。Blockers(不修没法做 beat)
action.time = t − beatStart(纯函数,支持任意 seek 进场)。Object3D.attach 语义,B0 在桌上、B3-enter 挂手、B11-enter 放回;永不拿可见性当抓取;杯(B13)复用同组件。Majors(精选)
action.time = t − beatStart 一并解决)。二跑补全(36 条确认+完整综合)的精确化增量
pot_spout(茶流起点/B6 左手目标)、pot_grasp(抓取点≠壶中心,柄朝外)、cup_dims{height,radius}(B8 用)、table_bbox(躯干-桌沿距的"沿")。audio.pause()+冻结 mixer+pill 提示"对准冰箱贴继续看表演";re-found → 同 t 恢复(纯函数天然续上)。静音按钮在播放中常驻(不随 cameraState 卸载)。mixer 不喂墙钟 dt,改 dt = currentTime − lastT(或 setTime(beatLocalT));补 onPause/onStalled/onWaiting;beat 转换一律电平触发(状态=纯函数,re-parent 幂等),漏帧自愈。scale 0→1.5 弹出动画,jyx-locomotion 在 model-loaded 时量身高 → 量到 ~0 → __jyxUnit 无效 → 所有 jyx-place 永远等待 → 道具以原始尺寸(米级)堆在原点,巨型白杯吞掉角色。修:① 删 scale 弹出动画(正确性>花哨)② 测量改 tick 重试直到"值>0.3 且连续两帧稳定" ③ 道具就位前一律 visible=false(防原始尺寸闪堆,这条升级为通用规则)。教训:任何"等模型加载后测一次"的逻辑都要怀疑入场动画/异步时序;隐藏直到就绪是默认姿势。ANKLE_FIX≈1.8%H;Tier A 的"脚不入地"逮住了它(这就是闸的价值)。
② beat-build workflow 实战形态:codex 设计+落脚本(/tmp/beat_scripts/.py 工件)质量可以很高(631行体系完整);claude 评审 worker 掉线时,主循环顶上当关键位(本来就更强:能直接跑验证)。
③ 脚本必须自带自检 print(逐帧脚z/髋漂移/循环角差/PASS 总判)→ 主循环 grep 即 Tier A,零额外脚本。
④ 验收 GIF 标准通道 = repo public/beats/<beat>.gif 随部署上线,用户手机开 URL 看动图签字;Next 生产模式不认 build 后塞进 VM 的文件(404),别走捷径。
⑤ 坐姿一致性(B2 起的硬规矩):B2 坐下的末帧姿势存成 /tmp/beat_scripts/seated_pose.json(骨→四元数),B3-B14 所有坐姿 clip 从它加载作基底——否则每个 clip 的"坐姿"各坐各的,切 beat 必跳。