@biunow/agent-biuart 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/bin/server.mjs +575 -0
  2. package/data/styles.json +533 -0
  3. package/engine/audit_clip.py +46 -0
  4. package/engine/clip.html +24 -0
  5. package/engine/clip.js +104 -0
  6. package/engine/clip_schema.json +19 -0
  7. package/engine/clips/t1_3b1b.js +203 -0
  8. package/engine/clips/t2_keynote_ui.js +347 -0
  9. package/engine/clips/t3_finance_chart.js +206 -0
  10. package/engine/clips/y1_kurzgesagt.js +183 -0
  11. package/engine/clips/y2_vox.js +150 -0
  12. package/engine/clips/y3_whiteboard.js +209 -0
  13. package/engine/clips/y4_storytime.js +194 -0
  14. package/engine/clips/y5_kinetic_type.js +134 -0
  15. package/engine/compare.py +19 -0
  16. package/engine/demos/_shared/hero/c1_0.png +0 -0
  17. package/engine/demos/_shared/hero/c1_1.png +0 -0
  18. package/engine/demos/_shared/hero/c1_2.png +0 -0
  19. package/engine/demos/_shared/hero/c3_line.png +0 -0
  20. package/engine/demos/_shared/hero.js +96 -0
  21. package/engine/demos/long_scroll/eras.js +23 -0
  22. package/engine/demos/long_scroll/frames/8bit_act/01.png +0 -0
  23. package/engine/demos/long_scroll/frames/8bit_act/02.png +0 -0
  24. package/engine/demos/long_scroll/frames/8bit_act/03.png +0 -0
  25. package/engine/demos/long_scroll/frames/8bit_act/04.png +0 -0
  26. package/engine/demos/long_scroll/frames/8bit_act/05.png +0 -0
  27. package/engine/demos/long_scroll/frames/8bit_act/06.png +0 -0
  28. package/engine/demos/long_scroll/frames/8bit_act/07.png +0 -0
  29. package/engine/demos/long_scroll/frames/8bit_act/08.png +0 -0
  30. package/engine/demos/long_scroll/frames/8bit_act/meta.json +69 -0
  31. package/engine/demos/long_scroll/frames/8bit_walk/01.png +0 -0
  32. package/engine/demos/long_scroll/frames/8bit_walk/02.png +0 -0
  33. package/engine/demos/long_scroll/frames/8bit_walk/03.png +0 -0
  34. package/engine/demos/long_scroll/frames/8bit_walk/04.png +0 -0
  35. package/engine/demos/long_scroll/frames/8bit_walk/05.png +0 -0
  36. package/engine/demos/long_scroll/frames/8bit_walk/06.png +0 -0
  37. package/engine/demos/long_scroll/frames/8bit_walk/07.png +0 -0
  38. package/engine/demos/long_scroll/frames/8bit_walk/08.png +0 -0
  39. package/engine/demos/long_scroll/frames/8bit_walk/meta.json +69 -0
  40. package/engine/demos/long_scroll/frames/egypt_dodge/01.png +0 -0
  41. package/engine/demos/long_scroll/frames/egypt_dodge/02.png +0 -0
  42. package/engine/demos/long_scroll/frames/egypt_dodge/03.png +0 -0
  43. package/engine/demos/long_scroll/frames/egypt_dodge/04.png +0 -0
  44. package/engine/demos/long_scroll/frames/egypt_dodge/05.png +0 -0
  45. package/engine/demos/long_scroll/frames/egypt_dodge/06.png +0 -0
  46. package/engine/demos/long_scroll/frames/egypt_dodge/07.png +0 -0
  47. package/engine/demos/long_scroll/frames/egypt_dodge/08.png +0 -0
  48. package/engine/demos/long_scroll/frames/egypt_dodge/meta.json +69 -0
  49. package/engine/demos/long_scroll/frames/egypt_walk8/01.png +0 -0
  50. package/engine/demos/long_scroll/frames/egypt_walk8/02.png +0 -0
  51. package/engine/demos/long_scroll/frames/egypt_walk8/03.png +0 -0
  52. package/engine/demos/long_scroll/frames/egypt_walk8/04.png +0 -0
  53. package/engine/demos/long_scroll/frames/egypt_walk8/05.png +0 -0
  54. package/engine/demos/long_scroll/frames/egypt_walk8/06.png +0 -0
  55. package/engine/demos/long_scroll/frames/egypt_walk8/07.png +0 -0
  56. package/engine/demos/long_scroll/frames/egypt_walk8/08.png +0 -0
  57. package/engine/demos/long_scroll/frames/egypt_walk8/meta.json +69 -0
  58. package/engine/demos/long_scroll/frames/monet_throw/01.png +0 -0
  59. package/engine/demos/long_scroll/frames/monet_throw/02.png +0 -0
  60. package/engine/demos/long_scroll/frames/monet_throw/03.png +0 -0
  61. package/engine/demos/long_scroll/frames/monet_throw/04.png +0 -0
  62. package/engine/demos/long_scroll/frames/monet_throw/05.png +0 -0
  63. package/engine/demos/long_scroll/frames/monet_throw/06.png +0 -0
  64. package/engine/demos/long_scroll/frames/monet_throw/07.png +0 -0
  65. package/engine/demos/long_scroll/frames/monet_throw/08.png +0 -0
  66. package/engine/demos/long_scroll/frames/monet_throw/meta.json +71 -0
  67. package/engine/demos/long_scroll/frames/monet_walk/01.png +0 -0
  68. package/engine/demos/long_scroll/frames/monet_walk/02.png +0 -0
  69. package/engine/demos/long_scroll/frames/monet_walk/03.png +0 -0
  70. package/engine/demos/long_scroll/frames/monet_walk/04.png +0 -0
  71. package/engine/demos/long_scroll/frames/monet_walk/05.png +0 -0
  72. package/engine/demos/long_scroll/frames/monet_walk/06.png +0 -0
  73. package/engine/demos/long_scroll/frames/monet_walk/07.png +0 -0
  74. package/engine/demos/long_scroll/frames/monet_walk/08.png +0 -0
  75. package/engine/demos/long_scroll/frames/monet_walk/meta.json +71 -0
  76. package/engine/demos/long_scroll/lib/acts.js +87 -0
  77. package/engine/demos/long_scroll/lib/crossing.js +463 -0
  78. package/engine/demos/long_scroll/lib/world.js +143 -0
  79. package/engine/demos/long_scroll/lib/xing2_ding.js +42 -0
  80. package/engine/demos/long_scroll/lib/xing2_jia.js +114 -0
  81. package/engine/demos/long_scroll/lib/xing2_yi.js +133 -0
  82. package/engine/demos/long_scroll/segments/02_egypt.js +234 -0
  83. package/engine/demos/long_scroll/segments/14_8bit.js +118 -0
  84. package/engine/demos/long_scroll/segments/28_monet.js +86 -0
  85. package/engine/demos/t1_3b1b/eras.js +11 -0
  86. package/engine/demos/t1_3b1b/t1_s1.js +101 -0
  87. package/engine/demos/t1_3b1b/t1_s2.js +74 -0
  88. package/engine/demos/t1_3b1b/t1_s3.js +65 -0
  89. package/engine/demos/t2_keynote_ui/eras.js +10 -0
  90. package/engine/demos/t2_keynote_ui/t2_s1.js +57 -0
  91. package/engine/demos/t2_keynote_ui/t2_s2.js +70 -0
  92. package/engine/demos/t2_keynote_ui/t2_s3.js +61 -0
  93. package/engine/demos/t3_finance_chart/eras.js +11 -0
  94. package/engine/demos/t3_finance_chart/t3_s1.js +48 -0
  95. package/engine/demos/t3_finance_chart/t3_s2.js +42 -0
  96. package/engine/demos/t3_finance_chart/t3_s3.js +51 -0
  97. package/engine/demos/y1_kurzgesagt/eras.js +10 -0
  98. package/engine/demos/y1_kurzgesagt/kurzgesagt.js +347 -0
  99. package/engine/demos/y2_vox/eras.js +10 -0
  100. package/engine/demos/y2_vox/vox.js +240 -0
  101. package/engine/demos/y3_whiteboard/eras.js +10 -0
  102. package/engine/demos/y3_whiteboard/whiteboard.js +162 -0
  103. package/engine/demos/y4_storytime/eras.js +14 -0
  104. package/engine/demos/y4_storytime/s1_desk.js +18 -0
  105. package/engine/demos/y4_storytime/s2_screen.js +82 -0
  106. package/engine/demos/y4_storytime/s3_react.js +39 -0
  107. package/engine/demos/y4_storytime/s4_wide.js +16 -0
  108. package/engine/demos/y4_storytime/s5_close.js +18 -0
  109. package/engine/demos/y4_storytime/story.js +25 -0
  110. package/engine/demos/y4_storytime/vo_env.js +2 -0
  111. package/engine/demos/y4_storytime/world.js +73 -0
  112. package/engine/demos/y5_kinetic_type/eras.js +16 -0
  113. package/engine/demos/y5_kinetic_type/k1_title.js +38 -0
  114. package/engine/demos/y5_kinetic_type/k2_complete.js +55 -0
  115. package/engine/demos/y5_kinetic_type/k3_chat.js +47 -0
  116. package/engine/demos/y5_kinetic_type/k4_agent.js +49 -0
  117. package/engine/demos/y5_kinetic_type/kinetic.js +52 -0
  118. package/engine/engine.js +277 -0
  119. package/engine/eras.js +60 -0
  120. package/engine/eras_gallery.js +115 -0
  121. package/engine/eras_style_studies.js +20 -0
  122. package/engine/examples/assets/K/347/272/277/345/233/276_/346/250/252/345/261/217.png +0 -0
  123. package/engine/examples/assets//347/273/210/347/253/257_for/345/276/252/347/216/257/346/261/202/345/222/214.png +0 -0
  124. package/engine/examples/assets//347/273/210/347/253/257_sum/346/261/202/345/222/214.png +0 -0
  125. package/engine/examples/assets//350/220/245/346/224/266/345/233/276_/347/253/226/345/261/217.png +0 -0
  126. package/engine/examples/assets//350/264/242/347/273/217/345/233/276/350/241/250_/346/250/252/345/261/217.png +0 -0
  127. package/engine/examples/t1_3b1b.json +19 -0
  128. package/engine/examples/t2_fullbleed_pulse.json +15 -0
  129. package/engine/examples/t2_keynote_ui.json +15 -0
  130. package/engine/examples/t3_finance_chart.json +29 -0
  131. package/engine/examples/y1_kurzgesagt.json +16 -0
  132. package/engine/examples/y2_vox.json +14 -0
  133. package/engine/examples/y3_whiteboard.json +17 -0
  134. package/engine/examples/y4_storytime.json +52 -0
  135. package/engine/examples/y5_kinetic_type.json +14 -0
  136. package/engine/index.html +42 -0
  137. package/engine/lib/THREE_LICENSE.txt +21 -0
  138. package/engine/lib/brush.js +149 -0
  139. package/engine/lib/camera.js +99 -0
  140. package/engine/lib/chart.js +152 -0
  141. package/engine/lib/collage.js +97 -0
  142. package/engine/lib/diagram.js +264 -0
  143. package/engine/lib/finish.js +70 -0
  144. package/engine/lib/fonts/AlfaSlabOne-400.woff +0 -0
  145. package/engine/lib/fonts/Anton-400.woff +0 -0
  146. package/engine/lib/fonts/ArchivoBlack-400.woff +0 -0
  147. package/engine/lib/fonts/Bangers-400.woff +0 -0
  148. package/engine/lib/fonts/Caveat-600.woff +0 -0
  149. package/engine/lib/fonts/Cinzel-400.woff +0 -0
  150. package/engine/lib/fonts/Cinzel-700.woff +0 -0
  151. package/engine/lib/fonts/CormorantGaramond-500.woff +0 -0
  152. package/engine/lib/fonts/CormorantGaramond-500i.woff +0 -0
  153. package/engine/lib/fonts/CormorantGaramond-700.woff +0 -0
  154. package/engine/lib/fonts/EBGaramond-400.woff +0 -0
  155. package/engine/lib/fonts/EBGaramond-400i.woff +0 -0
  156. package/engine/lib/fonts/EBGaramond-600.woff +0 -0
  157. package/engine/lib/fonts/Exo2-800i.woff +0 -0
  158. package/engine/lib/fonts/GochiHand-400.woff +0 -0
  159. package/engine/lib/fonts/IMFellEnglish-400.woff +0 -0
  160. package/engine/lib/fonts/IMFellEnglish-400i.woff +0 -0
  161. package/engine/lib/fonts/Inter-var.woff +0 -0
  162. package/engine/lib/fonts/JosefinSans-700.woff +0 -0
  163. package/engine/lib/fonts/Kalam-700.woff +0 -0
  164. package/engine/lib/fonts/LICENSES.md +40 -0
  165. package/engine/lib/fonts/LXGWWenKai-500.woff +0 -0
  166. package/engine/lib/fonts/LibreBaskerville-400.woff +0 -0
  167. package/engine/lib/fonts/LibreBaskerville-700.woff +0 -0
  168. package/engine/lib/fonts/LilitaOne-400.woff +0 -0
  169. package/engine/lib/fonts/Marcellus-400.woff +0 -0
  170. package/engine/lib/fonts/NotoSansSC-500.woff +0 -0
  171. package/engine/lib/fonts/NotoSansSC-700.woff +0 -0
  172. package/engine/lib/fonts/NotoSansSC-800.woff +0 -0
  173. package/engine/lib/fonts/NotoSansSC-900.woff +0 -0
  174. package/engine/lib/fonts/NotoSansSC-sub.woff +0 -0
  175. package/engine/lib/fonts/NotoSerifJP-600.woff +0 -0
  176. package/engine/lib/fonts/NotoSerifSC-sub.woff +0 -0
  177. package/engine/lib/fonts/OFL.txt +94 -0
  178. package/engine/lib/fonts/PlayfairDisplay-400i.woff +0 -0
  179. package/engine/lib/fonts/PlayfairDisplay-700.woff +0 -0
  180. package/engine/lib/fonts/PlayfairDisplay-700i.woff +0 -0
  181. package/engine/lib/fonts/Poppins-600.woff +0 -0
  182. package/engine/lib/fonts/Poppins-700.woff +0 -0
  183. package/engine/lib/fonts/Poppins-800.woff +0 -0
  184. package/engine/lib/fonts/PressStart2P-400.woff +0 -0
  185. package/engine/lib/fonts/Righteous-400.woff +0 -0
  186. package/engine/lib/fonts/RobotoCondensed-var.woff +0 -0
  187. package/engine/lib/fonts/Rye-400.woff +0 -0
  188. package/engine/lib/fonts/UnifrakturMaguntia-400.woff +0 -0
  189. package/engine/lib/fonts/cmunrm.woff +0 -0
  190. package/engine/lib/fonts/cmunti.woff +0 -0
  191. package/engine/lib/fonts/index.json +1 -0
  192. package/engine/lib/fonts.js +56 -0
  193. package/engine/lib/kit.js +91 -0
  194. package/engine/lib/media.js +118 -0
  195. package/engine/lib/medium.js +258 -0
  196. package/engine/lib/motion.js +111 -0
  197. package/engine/lib/paint.js +200 -0
  198. package/engine/lib/palettes.js +57 -0
  199. package/engine/lib/post.js +108 -0
  200. package/engine/lib/render.js +189 -0
  201. package/engine/lib/rig.js +390 -0
  202. package/engine/lib/rig_huashu.js +171 -0
  203. package/engine/lib/three.min.js +7 -0
  204. package/engine/lib/toon.js +186 -0
  205. package/engine/lib/typo.js +136 -0
  206. package/engine/lib/ui.js +141 -0
  207. package/engine/lib/util.js +92 -0
  208. package/engine/render.py +157 -0
  209. package/engine/scenes/01_cave.js +364 -0
  210. package/engine/scenes/02_egypt.js +524 -0
  211. package/engine/scenes/03_greek.js +448 -0
  212. package/engine/scenes/04_roman.js +555 -0
  213. package/engine/scenes/05_gothic.js +522 -0
  214. package/engine/scenes/06_renaissance.js +338 -0
  215. package/engine/scenes/08_impressionism.js +206 -0
  216. package/engine/scenes/09_postimp.js +183 -0
  217. package/engine/scenes/10_nouveau.js +334 -0
  218. package/engine/scenes/11_cubism.js +265 -0
  219. package/engine/scenes/12_bauhaus.js +214 -0
  220. package/engine/scenes/13_pop.js +269 -0
  221. package/engine/scenes/14_8bit.js +238 -0
  222. package/engine/scenes/15_raytrace.js +300 -0
  223. package/engine/scenes/16_2026.js +565 -0
  224. package/engine/scenes/17_ink.js +273 -0
  225. package/engine/scenes/18_klimt.js +227 -0
  226. package/engine/scenes/19_munch.js +153 -0
  227. package/engine/scenes/20_dunhuang.js +215 -0
  228. package/engine/scenes/21_kusama.js +124 -0
  229. package/engine/scenes/22_constructivism.js +205 -0
  230. package/engine/scenes/23_dali.js +221 -0
  231. package/engine/scenes/24_hopper.js +150 -0
  232. package/engine/scenes/25_ghibli.js +251 -0
  233. package/engine/scenes/26_vaporwave.js +191 -0
  234. package/engine/scenes/27_kirby.js +255 -0
  235. package/engine/scenes/28_monet.js +176 -0
  236. package/engine/scenes/29_seurat.js +104 -0
  237. package/engine/scenes/30_matisse.js +151 -0
  238. package/engine/scenes/31_haring.js +109 -0
  239. package/engine/scenes/32_rembrandt.js +217 -0
  240. package/engine/scenes/33_rubberhose.js +219 -0
  241. package/engine/scenes/34_shadowpuppet.js +195 -0
  242. package/engine/scenes/35_shinkai.js +197 -0
  243. package/engine/scenes/36_picasso_blue.js +123 -0
  244. package/engine/scenes/38_giotto.js +133 -0
  245. package/engine/scenes/39_piero.js +53 -0
  246. package/engine/scenes/40_raphael.js +96 -0
  247. package/engine/scenes/41_michelangelo.js +112 -0
  248. package/engine/scenes/42_guardi.js +70 -0
  249. package/engine/scenes/43_lorenzetti.js +145 -0
  250. package/engine/scenes/44_cortona.js +86 -0
  251. package/engine/scenes/45_renoir.js +86 -0
  252. package/engine/scenes/46_pissarro.js +82 -0
  253. package/engine/scenes/47_sisley.js +94 -0
  254. package/engine/scenes/48_gauguin.js +107 -0
  255. package/engine/scenes/49_chagall.js +60 -0
  256. package/engine/scenes/50_ma_yuan.js +131 -0
  257. package/engine/scenes/51_persian_miniature.js +149 -0
  258. package/engine/scenes/52_south_park.js +105 -0
  259. package/engine/scenes/53_pixar.js +60 -0
  260. package/engine/scenes/54_ghibli_lab.js +68 -0
  261. package/engine/scenes/55_dunhuang.js +161 -0
  262. package/engine/scenes/index.js +28 -0
  263. package/engine/spec_assets.py +76 -0
  264. package/engine/transitions.js +929 -0
  265. package/engine//346/227/266/344/273/243/344/275/234/350/200/205/350/247/204/350/214/203.md +49 -0
  266. package/lib/host.mjs +754 -0
  267. package/lib/render-bridge.mjs +543 -0
  268. package/lib/render-cli.mjs +98 -0
  269. package/lib/storyboard-lint.mjs +54 -0
  270. package/manifest.json +52 -0
  271. package/package.json +8 -4
  272. package/runtime/package.json +8 -0
  273. package/skills/biuart/SKILL.md +154 -0
  274. package/skills/biuart/references/01-/346/213/206/350/247/243.md +55 -0
  275. package/skills/biuart/references/02-/346/234/272/345/210/266.md +41 -0
  276. package/skills/biuart/references/03-/344/270/200/345/270/247/345/205/210/350/241/214/345/233/233/346/235/241/350/267/257/347/272/277.md +39 -0
  277. package/skills/biuart/references/04-/347/272/257/344/273/243/347/240/201/347/273/230/345/210/266.md +92 -0
  278. package/skills/biuart/references/05-/350/212/202/345/245/217/344/270/216/351/205/215/344/271/220.md +19 -0
  279. package/skills/biuart/references/06-/345/217/243/346/222/255/351/251/261/345/212/250/347/232/204/350/211/272/346/234/257/347/237/255/347/211/207.md +31 -0
  280. package/skills/biuart/references/07-/346/255/243/351/235/242/347/273/217/351/252/214.md +196 -0
  281. package/skills/biuart/references/08-/351/243/216/346/240/274/344/275/234/350/200/205/350/247/204/350/214/203.md +61 -0
  282. package/skills/biuart/references/09-/350/247/206/351/242/221/345/212/250/347/224/273/350/257/255/346/263/225.md +382 -0
  283. package/skills/biuart/references/10-/350/247/222/350/211/262.md +34 -0
  284. package/skills/biuart/references/11-/351/225/277/345/215/267/347/251/277/350/266/212/347/211/207.md +43 -0
  285. package/skills/biuart/references/12-/345/217/243/346/222/255/346/225/264/347/211/207/344/270/216/347/273/217/351/252/214/345/233/236/346/265/201.md +25 -0
  286. package/skills/biuart/references/13-/345/217/243/346/222/255/344/270/216/350/257/255/351/237/263/345/244/215/345/210/273.md +7 -0
  287. package/skills/biuart/references/15-/350/267/250/345/234/272/346/231/257/351/243/216/346/240/274/346/217/220/347/202/274.md +48 -0
  288. package/skills/biuart/references/16-/351/243/216/346/240/274/346/274/224/347/244/27295/345/210/206/345/215/217/350/256/256.md +103 -0
  289. package/skills/biuart/references/about-author.md +99 -0
  290. package/skills/biuart/references/capabilities.md +91 -0
  291. package/skills/biuart/references/compatibility.md +34 -0
  292. package/skills/biuart/references/images.md +97 -0
  293. package/skills/biuart/references/voice-model-review.md +18 -0
  294. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/t1_3b1b.md +122 -0
  295. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/t2_keynote_ui.md +117 -0
  296. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/t3_finance_chart.md +116 -0
  297. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y1_kurzgesagt.md +193 -0
  298. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y2_vox.md +195 -0
  299. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y3_whiteboard.md +190 -0
  300. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y4_storytime.md +166 -0
  301. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y5_kinetic_type.md +158 -0
  302. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y6_presenter_explainer.md +24 -0
  303. package/skills/biuart/references//345/217/243/346/222/255API.md +125 -0
  304. package/skills/biuart/references//350/211/262/346/235/277.md +38 -0
  305. package/skills/biuart/references//350/247/222/350/211/262/347/262/276/347/273/206/345/272/246.md +61 -0
  306. package/skills/biuart/references//351/225/234/345/244/264/350/241/250/346/250/241/346/235/277.md +80 -0
  307. package/skills/biuart/references//351/225/234/345/244/264/350/257/255/350/250/200.md +73 -0
  308. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/01_cave.md +46 -0
  309. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/02_egypt.md +64 -0
  310. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/03_greek.md +50 -0
  311. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/04_roman.md +99 -0
  312. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/05_gothic.md +32 -0
  313. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/06_renaissance.md +41 -0
  314. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/08_impressionism.md +34 -0
  315. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/09_postimp.md +17 -0
  316. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/10_nouveau.md +31 -0
  317. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/11_cubism.md +30 -0
  318. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/12_bauhaus.md +30 -0
  319. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/13_pop.md +29 -0
  320. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/14_8bit.md +27 -0
  321. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/15_raytrace.md +32 -0
  322. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/16_2026.md +55 -0
  323. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/17_ink.md +50 -0
  324. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/18_klimt.md +37 -0
  325. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/19_munch.md +42 -0
  326. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/20_dunhuang.md +49 -0
  327. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/21_kusama.md +32 -0
  328. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/22_constructivism.md +35 -0
  329. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/23_dali.md +29 -0
  330. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/24_hopper.md +30 -0
  331. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/25_ghibli.md +55 -0
  332. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/26_vaporwave.md +27 -0
  333. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/27_kirby.md +30 -0
  334. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/28_monet.md +39 -0
  335. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/29_seurat.md +31 -0
  336. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/30_matisse.md +26 -0
  337. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/31_haring.md +22 -0
  338. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/32_rembrandt.md +29 -0
  339. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/33_rubberhose.md +31 -0
  340. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/34_shadowpuppet.md +40 -0
  341. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/35_shinkai.md +34 -0
  342. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/36_picasso_blue.md +25 -0
  343. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/37_rick_morty.md +48 -0
  344. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/38_giotto.md +67 -0
  345. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/39_piero.md +59 -0
  346. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/40_raphael.md +65 -0
  347. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/41_michelangelo.md +65 -0
  348. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/42_guardi.md +65 -0
  349. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/43_lorenzetti.md +69 -0
  350. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/44_cortona.md +66 -0
  351. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/45_renoir.md +66 -0
  352. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/46_pissarro.md +66 -0
  353. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/47_sisley.md +67 -0
  354. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/48_gauguin.md +66 -0
  355. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/49_chagall.md +59 -0
  356. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/50_ma_yuan.md +68 -0
  357. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/51_persian_miniature.md +66 -0
  358. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/52_south_park.md +65 -0
  359. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/53_pixar.md +61 -0
  360. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/55_dunhuang.md +41 -0
  361. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/INDEX.md +89 -0
  362. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/_/350/275/254/345/234/272_/350/277/201/347/247/273/346/265/213/350/257/225.md +53 -0
  363. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/_/351/207/215/345/201/232/350/277/233/345/272/246.md +37 -0
  364. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/_/351/237/263/350/275/250_/350/211/272/346/234/257/345/217/262/351/200/237/351/200/232.md +135 -0
  365. package/studio/app.js +380 -0
  366. package/studio/assert-panel-permit.mjs +67 -0
  367. package/studio/composer.css +465 -0
  368. package/studio/composer.js +480 -0
  369. package/studio/index.html +97 -0
  370. package/studio/optimize-prompt.mjs +84 -0
  371. package/studio/optimize-prompt.test.mjs +47 -0
  372. package/studio/recipes.mjs +87 -0
  373. package/studio/select-menu.js +450 -0
  374. package/studio/styles.css +71 -0
  375. package/studio/to-english-prompt.mjs +149 -0
  376. package/studio/to-english-prompt.test.mjs +72 -0
  377. package/README.md +0 -3
@@ -0,0 +1,117 @@
1
+ # t2_keynote_ui · 发布会式界面与渐变动效
2
+
3
+ > 一句话语法:**一屏一件事,产品本身(截图、录屏、实物)当主角,名词和数字在口播说到时落定;字收紧,弹簧无回弹或轻回弹。** 光斑渐变底、毛玻璃卡、渐变字、居中模糊浮现、装饰漂浮都是可选包装,慎用(见「起手必查」)。
4
+ >
5
+ > 示范片:`scripts/engine/demos/t2_keynote_ui/`(渲染 `render.py --film demos/t2_keynote_ui`)(8s,3 镜头)· 总览 `assets/动画语法/t2_keynote_ui_总览.jpg` · 代码 `scripts/engine/demos/t2_keynote_ui/`
6
+
7
+ ## 起手必查
8
+
9
+ 1. **这一套最容易读成 AI 模板。** 光斑渐变底+毛玻璃卡+渐变字+居中从模糊里浮出+卡片漂浮,五样一起上,观众一眼认出是模板。开工前先问:有没有真实的产品截图、录屏、实物照片?有,就让它满幅当主画面并推近到要讲的那一块,光斑和玻璃卡不用;五样包装一支片子最多挑两样。
10
+ 2. **截图要大。** 有截图的镜头,截图宽度 ≥ 画宽 80%(竖屏 ≥ 90%),口播讲到截图里看不清的那一块时再推近过去(默认缓推约 0.9 秒;那一块是揭晓、对比结果时才快推 0.28 秒)。一张截图最多推一两次,推进去之后拉回整张或横移到下一块。一张小卡漂在大片光斑上,就是第四种做坏方式「死背景」。参数化片段 t2 默认就是这样:截图满幅铺开(等比不裁,四周垫同图的压暗模糊版),highlight 那一刻推过去(默认缓推,spec 顶层的 `data` 里写 `"camera": "snap"` 才快推),连着两张截图之间同倍率横移;旧的玻璃卡要显式写 `data.frame: "glass"`。自己写镜头用 `CAM.track`(镜头动作表)和 `MD.cover`(满幅+焦点+推近),动作怎么选见 `../镜头语言.md`。
11
+ 3. **数版式。** 把分镜里每一屏的版式写出来(标题屏、三卡并排、大数字、截图卡),同一种连续出现 ≥2 屏就换一种:截图推近、数字砸入、前后对比。「标题 → 三张功能卡 → 大数字」整片循环,就是翻页 PPT。
12
+ 4. **落定后停住。** 不加卡片漂浮、不用匀速慢推填停顿;下一个动作放在口播说到名词或数字的那一刻。数字讲的是刚才那张截图里的事(两次计时之比、这一页的结论),number 写 `data.over: true`:镜头拉回整张截图、截图压暗、数字砸在上面,不切到光斑底单独一屏。
13
+ 5. **配色跟产品走。** 底色和强调色取产品自己的品牌色,不默认紫蓝青光斑;讲坏消息、严肃事件、非发布题材时不用这套深色发布会底。
14
+
15
+ ## ① 适用场景
16
+
17
+ - **用**:产品/功能发布、版本更新、「三个新功能」、价格与参数公布、开场品牌片、视频里的「这个产品是什么」段落。口播是**名词+数字**(「Plover 2」「延迟 320 毫秒」「100 万 tokens」)时最合适:一句一屏,名词出现时字浮出,数字说到时落定。
18
+ - **用**:需要把界面截图讲清楚——截图满幅,推近到要讲的那一块;放进玻璃卡、在 3D 里转正是可选包装,慎用。
19
+ - **别用**:讲机制原理(玻璃和光斑不承载逻辑,用 t1);讲数据走势(用 t3);严肃事故/财报坏消息(这套语言自带「好消息」的情绪);内容本身没有一个能放大的「主角」时(只剩空镜光斑);科普、故事、新闻这类非发布题材,别拿这套底当通用模板。
20
+
21
+ ## ② 画面构成
22
+
23
+ | 项 | 取值 | 依据 |
24
+ |---|---|---|
25
+ | 底色 | 近黑:本片 `#050508`;Apple `#000/#161617/#1d1d1f`;Linear `#08090a`(上一级 `#0f1011/#141516`,正文 `#f7f8f8`,描边 `#ffffff14`) | 两家官网 CSS 实测 |
26
+ | 光斑(可选,慎用) | 4 团径向渐变 screen 叠加 → 1/4 尺寸上模糊 90px → 放大铺满 → 叠 3.5% 静态颗粒防色带。色相走 Stripe 一系:紫 `(150,90,238)`、蓝 `(56,104,255)`、青 `(120,214,255)`、一点暖红 `(255,96,84)`;中心再压一层 38% 黑径向渐变给白字让对比 | Stripe 2021 渐变 `#a960ee #ff333d #90e0ff #ffcb57` |
27
+ | 光斑运动(可选) | 每团漂移振幅 90–260px、周期 9.5–13s,**避开 5s 周期**(HIG:避免 ~0.2Hz 持续摆动) | Apple HIG Motion |
28
+ | 玻璃卡(可选,慎用) | 背景取样模糊 40px(Apple 导航 `saturate(180%) blur(20px)`,NN/g 说越大越好)+白 7.5% 填充+顶部 14% 白渐变受光带+1.5px 渐变描边(左上亮、右下暗)+大阴影(blur 70–80,y+30–40,α0.5) | apple.com globalheader.css;NN/g Glassmorphism |
29
+ | 圆角 | 卡片 36px;**同心圆角**:内部图标底圆角 = 36 − 内边距 14 = 22 | WWDC25「子圆角 = 父圆角 − padding」 |
30
+ | 字体 | Inter(SF Pro 最接近的开源字,Linear 用 Inter);中文思源黑。标题 600 字重、**大字号字距收紧 −0.02 ~ −0.03em**(`T2.track`) | Apple 96px −0.015em、Linear 64px −0.022em、OpenAI 64px −0.03em |
31
+ | 文字层级 | 白 `#f5f5f7` 主、`rgba(235,235,245,.6)` 次、`#a7a7b4` 眉题(字距 +6px);产品名可用白→淡紫→淡青横向渐变(可选,慎用:渐变字和光斑一起上就是模板) | Apple 官网层级惯例 |
32
+ | 构图 | 一屏一个焦点;有截图时截图满幅(宽 ≥80%)并推近到要讲的那块;居中对称的三卡并排(等宽 480、间距 52)只用于没有截图的功能清单;大数字占画面宽 55% 以上 | — |
33
+ | 形状语言 | 圆角矩形、胶囊、细线图标(圆头等线宽,SF Symbols 气质,`UI.icon`) | — |
34
+
35
+ ## ③ 运动轨迹
36
+
37
+ - **弹簧(主力)**:SwiftUI duration+bounce 参数化,`MO.spring(t,{duration,bounce})`:mass=1、stiffness=(2π/d)²、damping=4π(1−bounce)/d → 阻尼比 ζ=1−bounce。**默认 bounce 0**(最通用);0.15 利落几乎不弹(本片卡片入场 d=0.75、气泡 d=0.5);0.3 明显弹;>0.4 对 UI 夸张。`.smooth/.snappy/.bouncy` 都是 d=0.5。
38
+ - **曲线(非弹簧)**:apple.com 导航 `.32s cubic-bezier(.4,0,.6,1)`;本片字的浮现用 CSS `ease`=`(.25,.1,.25,1)`(`MO.appleOut`);Linear 主力 ease-out-quad `(.25,.46,.45,.94)` .16s;Stripe 建议 <500ms、`(.2,1,.2,1)`。`MO.bezier(x1,y1,x2,y2)` 通吃。
39
+ - **字的入场**(居中模糊浮现是可选做法,慎用;全片每屏都这样浮出就成了模板):模糊 18–26px → 0、上移 16–40px → 0、透明 → 1,0.7–1.0s(`TY.blurIn`)。眉题 → 产品名 → 副标题依次错开 0.2–0.4s。
40
+ - **卡片入场**:从下方 170px、绕 Y 轴 ±0.55rad(≈31°,两侧卡朝外)、缩放 0.9 → 弹簧落位;三张错开 0.1s。3D 用 `UI.persp`(竖条切片透视,persp 1800px;Stripe 用 600、Linear 用 1000)。
41
+ - **镜头与停顿**:落定后停住,不加装饰漂浮,不用匀速慢推填停顿。镜头只在口播讲到截图上看不清的那块时动:默认缓推约 0.9 秒推到那块、0.7 秒移到下一块;揭晓结果、两个数对比时才快推 0.28 秒;数字或大字砸入 0.17 秒(1.55→0.94→1.0);停多久按口播。推进去之后拉回整张截图或移到下一块,不一镜接一镜只往里推。示范片里的卡片漂浮 7px(`MO.float`)和相机匀速推 1→1.045 是旧做法,新片不照抄。
42
+ - **计数**:卡片落定后 0.25s 起 0.9s(同一个数只数一次——展开成全屏后沿用「100万」,不再从 0 重数);`easeOutExpo`(CountUp.js 默认缓动)——最后一位慢慢落定;数字**等宽排布**(`TY.tabular`,Canvas 不能开 tnum,不排会抖)。
43
+ - **光扫过**:斜 −20°、宽 110–140px 的亮带 0.8–0.9s 扫过;在文字离屏上用 `source-atop`(只亮在字上),在卡片上用 `lighter`;三张卡按各自屏幕位置算进度 = 同一道光。
44
+
45
+ ## ④ 转场(常用 5 种)
46
+
47
+ 1. **模糊推进(blurPush)**:旧画面缩到 0.92+模糊 24px+淡出,新画面从 1.06 带模糊落到 1.0 清晰,0.55s,`ease`。**底下先垫一层放大 1.08 的重模糊旧画面**,缩小的画面四周才不露黑边。本片镜头 1→2。
48
+ 2. **共享元素展开(expandRect)**:(新画面第一帧就**不透明**装进卡片——卡片是半透明的,任何溶接都会看到新旧两层字叠在一起)被选中的卡片(先放大到 1.06、两侧卡后退变暗到 45%)从自己的屏幕矩形展开成全屏,圆角 38→0,弹簧 d=0.55 bounce 0;新画面一开始就按卡片大小缩放装在卡里。**选中卡在展开前停止漂浮**,转场才从一个稳定矩形起跳。本片镜头 2→3。
49
+ 3. **匹配剪辑**:前后两镜同一物体同一位置(产品名 → 卡片标题位置)。
50
+ 4. **遮罩擦除/光扫切**:一道光扫过时在光带后面换画面。
51
+ 5. **折射代替淡入淡出**(Liquid Glass):元素出场时逐渐改变折射/模糊强度,而不是直接降透明度(本片字的模糊浮现即此思路)。
52
+
53
+ ## ⑤ 节奏与文字
54
+
55
+ - **镜头时长**:发布会演讲一屏常 5–8s(Jobs 2007 iPhone 70 秒 9 屏≈7.8s/屏);产品片快剪 1.5–3s。本片 2.6/3.0/2.4s。
56
+ - **一屏一件事**:一个名词、一个数字、一张卡。密集段落后放一屏空的给观众喘气(Presentation Zen 说的 counterweight)。
57
+ - **与口播对位**:名词说出前 0.2–0.3s 字开始浮现(浮现本身要 0.7s,说到时正好清晰);数字在口播说出数值时**落定**——计数起点 = 说数字时刻 − 计数时长;三卡依次入场对应「第一、第二、第三」。
58
+ - **文字**:标题 ≤6 个字或一个产品名;副标题一句话 ≤16 字;卡片:标题 4 字+一行说明+一个大数字+单位(小一号、灰一级)。
59
+
60
+ ## ⑥ 代码实现要点
61
+
62
+ > 收进 skill 后(2026-10-04 v0.4):本卡「新写」里的通用函数已统一进 `scripts/engine/lib/`(名字已换成统一后的 MO / CAM / DG / TY / CH / UI / CL / TOON),示范片自己的代码在 `scripts/engine/demos/t2_keynote_ui/`。库速查和「怎么为一段口播选语法」见 `references/09-视频动画语法.md`。
63
+
64
+ - 复用 skill:`engine.js`、`render.py`、`PAINT.cached/hex`、`U.rng`。
65
+ - 新写、现已统一进库 `lib/ui.js`(`window.UI`):`mesh`(光斑底)、`grainTex`、`backdrop`(模糊副本,毛玻璃取样)、`shadow`(只画影子)、`glass`(毛玻璃卡)、`sheen`(光扫过,`comp` 可选)、`persp`(绕 Y/X 轴伪 3D)、`icon`、`rr/rrPath`、`scratch`。
66
+ - `lib/motion.js`:`spring/smoothSpring/snappy/bouncy`、`bezier/appleOut/emphasized`、`float`;数字与文字在 `lib/typo.js`:`TY.count/tabular`、`TY.blurIn`(实验时叫 MO.textIn)。
67
+ - 转场(实验时在 `transitions_info.js`,现已进 `transitions.js`):`blurPush`、`expandRect`。
68
+ - 性能:每帧画一次光斑(1/4 尺寸)+一次背景模糊副本,均 40–60ms/帧(qa 带 GPU flush);8 秒 60fps 渲完约 1 分钟。
69
+ - 坑(已修进库里):①**blur 会从画布外拉进透明像素**,画进不清空的离屏会逐帧累积,qa 报确定性 ✗——先垫一层不模糊原图;②透视切片相邻重叠 0.75px 在半透明纹理上出一条条纹——切片边界取整像素首尾相接,并先画进离屏再整体按 alpha 贴回;③`UI.sheen` 内部设了合成模式,会盖掉外面设的 `source-atop`,所以做成参数。
70
+
71
+ ## ⑦ 代表作品与一手参考
72
+
73
+ - 代表作:Apple iPhone/Apple Intelligence 发布片与 apple.com 产品页;OpenAI GPT-4o / o 系列发布视频;Linear 官网与 Linear Release 视频;Stripe 2020–21 官网渐变。
74
+ - https://developer.apple.com/videos/play/wwdc2023/10158/ (Animate with springs:duration/bounce)
75
+ - https://developer.apple.com/videos/play/wwdc2018/803/ (Designing Fluid Interfaces:从 100% 阻尼起步)
76
+ - https://developer.apple.com/videos/play/wwdc2025/219/ (Meet Liquid Glass)
77
+ - https://developer.apple.com/design/human-interface-guidelines/materials 、/motion 、/typography
78
+ - https://www.nngroup.com/articles/glassmorphism/
79
+ - https://web.archive.org/web/20211015000000/https://stripe.com/ (渐变色值)
80
+ - https://stripe.com/blog/connect-front-end-experience (<500ms、曲线)
81
+ - https://linear.app/now/how-we-redesigned-the-linear-ui (LCH 色彩、Inter)
82
+
83
+ ## ⑧ 最容易做错的 3 件事
84
+
85
+ 1. **玻璃后面没东西。** 毛玻璃只模糊它后面的内容;深色纯底上的「玻璃」就是一块灰矩形。先画有色彩、有起伏的光斑,再按卡片屏幕位置取样模糊。
86
+ 2. **弹簧太弹、动作太多。** bounce 默认 0,入场最多 0.15–0.3;>0.4 立刻廉价。一次只动一组东西。
87
+ 3. **大字没收紧字距、光斑颜色发脏。** 64px 以上 −0.015~−0.03em;光斑每团颜色各占一块(screen 叠加+大模糊),别把多色线性平均成灰紫泥。
88
+
89
+ ## qa 数字(skill `scripts/qa.py`,2026-10-04,审片前)
90
+
91
+ | 镜头 | 运动% | 静止帧对% | 跳变 | 均/峰 ms | 确定性 |
92
+ |---|---|---|---|---|---|
93
+ | t2_s1 | 0.58 | 35.4 | 0 | 39.8/51.4 | ✓ |
94
+ | t2_s2 | 2.62 | 8.5 | 0 | 60.2/65.0 | ✓ |
95
+ | t2_s3 | 1.84 | 9.6 | 0 | 44.3/51.0 | ✓ |
96
+
97
+ 说明:t2_s1 的「静止帧对 35%」来自示范片的光斑漂移和 4.5% 匀速推(旧做法),每帧变化低于 qa 的像素阈值(>12 级),隔 1 秒取两帧(成片 1.6s vs 2.6s)有 26.8% 的像素变化超过 12 级、78% 超过 4 级。静止帧对高低都不说明好坏:解说片大段停住是对的,匀速慢漂的片子静止帧对很低照样像翻 PPT。
98
+
99
+ ## 修订(独立审片 → 改一轮,2026-10-04)
100
+
101
+ | 审片意见 | 改法 |
102
+ |---|---|
103
+ | 🔴 2.55–2.75s、5.6–5.85s 转场四周露黑边 | blurPush / expandRect 底下垫一层放大 1.08、模糊 30px 的旧画面 |
104
+ | 🔴 卡片展开时「长期记忆」「100万」两层叠影;展开后又从 0 重数 | 新画面第一帧不透明装进卡片;全屏页沿用「100万 tokens」同一口径,不重数 |
105
+ | 🔴 6.95s 计数一帧从 999,023 跳到 1,000,000,「tokens」被挤 | 随上条删掉重复计数;单位按三段实测宽度排版,不再贴字 |
106
+ | 🟡 落版只出现 0.4s、y≈1020 出安全区 | 落版 1.2–1.8s 浮现、停 0.6s,y=972;对话面板整体上移 65px |
107
+ | ⚪ 卡片「100万」与全屏「1,000,000」口径不一 | 统一为「100万」 |
108
+
109
+ 修订后 qa:
110
+
111
+ | 镜头 | 运动% | 静止帧对% | 跳变 | 均/峰 ms | 确定性 |
112
+ |---|---|---|---|---|---|
113
+ | t2_s1 | 0.58 | 35.4 | 0 | 39.5/51.6 | ✓ |
114
+ | t2_s2 | 2.62 | 8.5 | 0 | 57.2/59.9 | ✓ |
115
+ | t2_s3 | 0.97 | 15.4 | 0 | 43.0/48.7 | ✓ |
116
+
117
+ (转场冒烟:blurPush 最慢约 137ms/帧,含两次全屏模糊。)
@@ -0,0 +1,116 @@
1
+ # t3_finance_chart · 财经数据图表动画
2
+
3
+ > 一句话语法:**先搭坐标系、再让数据「长」出来、最后只标一件事;一个颜色讲主角、其余变灰;数值永远诚实(柱从 0 起、单位和来源写在图上),动画只决定「怎么出现」,不改变「是多少」。**
4
+ >
5
+ > 示范片:`scripts/engine/demos/t3_finance_chart/`(渲染 `render.py --film demos/t3_finance_chart`)(8s,3 镜头,数据全部虚构,每镜右下角「示意数据」)· 总览 `assets/动画语法/t3_finance_chart_总览.jpg` · 代码 `scripts/engine/demos/t3_finance_chart/`
6
+
7
+ ## 起手必查
8
+
9
+ 1. **每张图先写出它的那「一件事」。** 标题就是这句结论,标注只标它;写不出这一句的图不做,改用一个大数字或换语法。
10
+ 2. **数字口径能互推。** 标题里的倍数要能从图上的数算出来(a ÷ b 写在标注里);两镜之间的同一个数必须对得上;「涨到」和「涨了」分清。
11
+ 3. **数据长出的时刻对口播里那个词。** 柱状图写多个 bar cue,各带 `data.index`,让每根柱子在说到它时才长;不要第 0 秒先出标题、再一口气全长完。
12
+ 4. **落定后停住。** 数字落定后至少停 0.5 秒,不加匀速慢推;要看局部就在口播点到那里时缓推过去(约 1 秒,Heer & Robertson:一步约 1s、缓入缓出),最关键的那个数才快推 0.28 秒;或用 `zoomThrough` 推进到那个点。
13
+ 5. **同一版式不连用 3 张以上。** 细红线+标题+图连续 3 张就是翻报表;中间插一次推进到局部、一个砸入的大数字,或切回真实素材。
14
+ 6. **图表留在片子的世界里。** 图表镜头的底和前后镜头同色系:深色片写 `theme: "dark"`,或者把片子的底色写进 `safe.fill`(图表底自动跟它,深色换浅字);白底报表只用在本来就是白纸、网页的片子里。更好的是把图表画在片子世界里的物上:`--alpha` 出透明片段,贴到画里的屏幕、黑板、一张纸上。夜景片里突然切一张白底折线图、顶上一行固定标题,审片会说「和全片断开」。
15
+
16
+ ## ① 适用场景
17
+
18
+ - **用**:营收/利润/用户数的增长、股价走势、市场份额排名变化(bar chart race)、地区对比(地图着色)、某个事件前后的拐点。口播里出现**具体数字、时间、比较**(「五年涨了 8.7 倍」「2023 年 3 月之后」)时。
19
+ - **用**:需要「可信」的段落——观众会截图转发、会较真。
20
+ - **别用**:只有一个数(直接大字报,用 t2 的计数);数据本身不可靠或你不愿标来源时(宁可不做图);讲原理(用 t1)。
21
+
22
+ ## ② 画面构成
23
+
24
+ | 项 | 取值 | 依据 |
25
+ |---|---|---|
26
+ | 底 | 白 `#FFFFFF`(经济学人网页图);或 FT 三文鱼粉 `#FFF1E5`;深色片用 `theme: "dark"`(`#0E1116` 底、浅字、青色主柱) | Economist 2017 图表风格指南;FT o-colors 源码 |
27
+ | 版式 | **顶部细红线(8px)+左上红色小旗(96×22)+粗体标题(一句结论)+副标题(指标、单位)+左下来源** | Economist 风格指南版面示例 |
28
+ | 主色板 | ECON RED `#E3120B`、蓝 `#006BA2`、青 `#3EBCD2`、绿 `#379A8B`、黄 `#EBB434`、灰 `#758D99`、黑 `#0C0C0C` | Economist 图表色板 |
29
+ | 强调法 | **一个颜色讲主角,其余变浅灰**(本片:最后一根柱保持蓝,其余过渡到 `#C6D2D8`) | Datawrapper「用灰压住次要数据」 |
30
+ | 网格 | 只有水平网格,细灰(本片 α0.13、1.5px);**只有零基线是黑实线**(3px);y 轴刻度值放右侧网格线上方 | Economist 风格指南 |
31
+ | 字体 | 经济学人用 Econ Sans(Cnd);本片用 Roboto Condensed(数字)+思源黑(中文)。标题 700、副标题/轴 400;轴字最小、来源最小最浅(75% 黑) | 同上 |
32
+ | 涨跌色 | **中国大陆 A 股:红涨绿跌**(本片);香港与欧美:绿涨红跌。面向中文观众必须在图上写明「红涨绿跌」;色盲友好替代:蓝/橙+▲▼符号 | Jiang 等 2014(JBDM);Bloomberg 终端色盲模式 |
33
+ | 线宽 | 主数据线 5px(本片)、均线 4px;标注引线 2px | — |
34
+ | 形状语言 | 矩形柱、折线+末端圆点、K 线实体+影线、小圆点+引线标注 | — |
35
+
36
+ ## ③ 运动轨迹
37
+
38
+ - **顺序(staging)**:版式 0–0.5s → 网格从左往右逐条画出(lag 0.12,easeOutQuint)→ x 轴标签依次淡入上移 → 数据 → 强调色变化 → 标注。每阶段约 0.5–1.3s。Heer & Robertson 2007:复杂变化要分阶段、一律缓入缓出、单步「需要多长就多长」约 1s;先坐标轴后数据是行业惯例(无实证研究,但它让观众先知道「尺子」再看「量」)。
39
+ - **柱**:从 0 基线长出,easeOutQuint,依次错开(lag 0.22,共 1.3s);数值标签跟着柱顶走、同步计数(`CH.bars`)。
40
+ - **折线**:按 **x(时间)** 推进画出,不按弧长——时间匀速流过,陡峭段自然画得快,读得出「暴涨」;头部 9px 圆点+价格标签跟随(等宽数字);面积渐变 α0.14→0。本片 1.5s,smooth(最后一个价格「落」在点上)。D3 官方示例是 5000ms linear,适合独立图表,视频里压到 1.5–2s。
41
+ - **标注**:在线头**经过**事件点的那一刻触发(`tHit` 由缓动反函数算出)——圆点弹出(spring d0.45 bounce0.25)+一圈脉冲 → 0.12s 后引线画出 → 0.3s 后文字淡入。**一镜只标一件事**。
42
+ - **K 线**:逐根出现(lag 0.06,0.2–1.3s),实体从开盘价长到收盘价、影线随后展开;成交量柱同步;右上价格跟着「最新出现的那根」滚动,颜色按相对区间起点的涨跌。
43
+ - **数字**:count-up 用 easeOutExpo(CountUp.js 默认 2s;视频里 0.9–1.3s);所有滚动数字等宽排布防抖。
44
+ - **相机**:图表落定后相机停住,不加匀速慢推;镜头动作放在口播点到某个数据的那一刻:缓推约 1 秒推近,或 0.7 秒移到下一组数据;全片最关键的那一两个数才快推 0.28 秒;推近转场期间相机继续矢量推近(不放大位图)。示范片每镜匀速推 1→1.03 是旧做法,新片不照抄。
45
+ - **排名赛跑(本片未用)**:D3 官方 bar chart race 每关键帧 250ms、帧间线性插 10 帧、显示 12 根;换位约 0.5s;名次变化要错开,避免所有柱同时上下乱跳。
46
+
47
+ ## ④ 转场(常用 5 种)
48
+
49
+ 1. **面板横推(slidePush)**:新面板从右推入、旧面板向左推出,中间一道品牌红竖条领路,0.5s,`cubic-bezier(.7,0,.2,1)`。本片镜头 1→2。新面板在推入过程中就开始搭版式(红线生长、标题浮现)。
50
+ 2. **推进到局部(zoomThrough,live+bScale0)**:相机绕最新数据点推近 6 倍(旧镜头自己矢量重画),新画面(最近 20 日 K 线)从 0.6 倍溶进来,主体(最新一根 K 线)对准推进点。本片镜头 2→3。没有圆形开口时一定要设 `bScale0`,否则新画面会像一张浮在中间的小卡片。
51
+ 3. **图表间形变(morph)**:同一数据换图形(柱→点→线),先移动到位、再变形(Heer & Robertson:散点→柱先横移再变形;堆叠→分组先改宽再落下)。**不同指标之间不要 morph**(营收柱变成股价线会暗示二者同量纲)。
52
+ 4. **坐标轴重标**:数据范围变了先变刻度(旧刻度淡出、新刻度淡入),再动数据。
53
+ 5. **硬切+版式不动**:同一版式换一张图,红线/标题位置不变,只换内容——经济学人视频最常用。
54
+
55
+ ## ⑤ 节奏与文字
56
+
57
+ - **镜头时长**:一张图 2.5–6s;本片 2.8/2.7/2.5s 是压缩版(真用时一张图配一到两句口播)。叙事结构:铺垫(Establisher)→ 引发 → 高潮(Peak)→ 收束(Amini 等 2015,50 支专业数据视频)。
58
+ - **与口播对位**:数字**说出时正好落定**——柱长完、标签停在 107.9 的那一刻对上「一百零七点九亿」;标注在线头经过事件时弹出,对上「2023 年 3 月发布大模型之后」。所以先定口播时间点,再倒推动画起点。
59
+ - **文字**:标题写结论(「营收五年涨到原来的近 9 倍」——**「涨到」不是「涨了」**:8.7 倍是涨到原来的 8.7 倍=涨了 7.7 倍,审片抓到过),副标题写指标与单位(「年营收,亿元」);倍数要能从图上数字算出来(107.9÷12.4=8.70);轴不从 0 时写在副标题(「纵轴未从 0 开始」);来源一行左下;虚构数据右下「示意数据」角标每镜都在。
60
+
61
+ ## ⑥ 代码实现要点
62
+
63
+ > 收进 skill 后(2026-10-04 v0.4):本卡「新写」里的通用函数已统一进 `scripts/engine/lib/`(名字已换成统一后的 MO / CAM / DG / TY / CH / UI / CL / TOON),示范片自己的代码在 `scripts/engine/demos/t3_finance_chart/`。库速查和「怎么为一段口播选语法」见 `references/09-视频动画语法.md`。
64
+
65
+ - 复用 skill:`engine.js`、`render.py`、`U.rng`(虚构数据全部种子生成,可复现)、`PAINT.hex`。
66
+ - 新写 `lib/chart.js`(`window.CH`):`lin`(比例尺,带 `inv`)、`ticks`(1/2/2.5/5×10ᵏ 刻度)、`grid`(网格逐条画出、零线加粗、刻度值右置)、`xLabels`、`bars`(从 0 长出+同步计数+高亮/变灰)、`line`(按 x 推进、头部点、面积)、`yAt`、`candles`(逐根 K 线,涨跌色可配)、`callout`(点→引线→文字)、`tag`(红色小旗)、`demoBadge`(示意数据角标)、`mixHex`。
67
+ - `lib/motion.js`:`lagged`、`quintOut/expoOut`(实验时叫 easeOutQuint/easeOutExpo)、`spring`(标注圆点);`TY.count/tabular/fmt`。
68
+ - 转场(已进 `transitions.js`):`slidePush`、`zoomThrough`(live、bScale0、focus)。
69
+ - 事件触发时刻:`tHit = 起点 + 时长 × smooth⁻¹(事件x占比)`(二分求反函数),标注永远和线头同步,改了线的时长不用手调。
70
+
71
+ ## ⑦ 代表作品与一手参考
72
+
73
+ - 代表作:The Economist 网页图表与视频;FT 图表;Bloomberg Originals / Quicktake 的数据段;Flourish 的 bar chart race。
74
+ - Economist 图表风格指南 2017(镜像):https://sa.ipaa.org.au/wp-content/uploads/2026/02/Economist-CHARTstyleguide_20170505.pdf
75
+ - FT 色板源码:https://unpkg.com/@financial-times/o-colors/src/scss/_palette.scss
76
+ - Heer & Robertson 2007, Animated Transitions in Statistical Data Graphics:https://idl.cs.washington.edu/files/2007-AnimatedTransitions-InfoVis.pdf
77
+ - D3 bar chart race:https://observablehq.com/@d3/bar-chart-race-explained
78
+ - Correll 等 2020(截断坐标轴的夸大效应,断轴标记也救不回来):https://arxiv.org/abs/1907.02035
79
+ - Datawrapper:柱从零 https://www.datawrapper.de/academy/why-our-column-and-bar-charts-start-at-zero ;双轴 https://www.datawrapper.de/blog/dualaxis ;色盲 https://www.datawrapper.de/blog/colorblindness-part2
80
+ - 红涨绿跌的文化差异:https://onlinelibrary.wiley.com/doi/10.1002/bdm.1800
81
+ - CountUp.js(easeOutExpo、2s):https://github.com/inorganik/countUp.js
82
+
83
+ ## ⑧ 最容易做错的 3 件事
84
+
85
+ 1. **截断坐标轴。** 柱状图一律从 0;折线和 K 线可以不从 0,但要在图上写明。Tufte 的 Lie Factor(图上效应÷数据效应)超出 0.95–1.05 就算失真。
86
+ 2. **颜色太多、全部都是主角。** 一个颜色讲故事,其余变灰;红绿含义面向谁要写清(A 股红涨,欧美红跌)。
87
+ 3. **动画太花读不出数。** 不要弹跳柱、3D 柱、旋转饼图;分阶段、缓入缓出、一步约 1s;数字落定后至少停 0.5s 让人读。
88
+
89
+ ## qa 数字(skill `scripts/qa.py`,2026-10-04,审片前)
90
+
91
+ | 镜头 | 运动% | 静止帧对% | 跳变 | 均/峰 ms | 确定性 |
92
+ |---|---|---|---|---|---|
93
+ | t3_s1 | 1.39 | 0.0 | 3 | 1.3/1.9 | ✓ |
94
+ | t3_s2 | 2.37 | 4.7 | 0 | 1.9/2.8 | ✓ |
95
+ | t3_s3 | 0.96 | 0.0 | 0 | 1.6/2.3 | ✓ |
96
+
97
+ 说明:t3_s1 的 3 个「跳变」在 lt 2.10/2.20/2.27s,正是四根柱同时由蓝变灰(高亮主角)和标注弹出的那几帧——有意的大面积变化,不是穿帮。
98
+
99
+ ## 修订(独立审片 → 改一轮,2026-10-04)
100
+
101
+ | 审片意见 | 改法 |
102
+ |---|---|
103
+ | 🔴 标题「涨了近 9 倍」与标注 8.7 倍口径错(应为「涨到」) | 改为「营收五年涨到原来的近 9 倍」;股价页同口径「涨到原来的 7.5 倍」 |
104
+ | 🔴 月线终点 ¥268 与日 K 286.40 对不上(推镜推的就是这个点) | 月线末点 = 最新价 286.4,倒数第二个月收盘 = 日 K 起点 242;**两镜之间的数字必须能互相推出来** |
105
+ | 🟡 5.6s「¥268」和计数中的价格两个大红数叠影 | 股价头部标签在推进转场开始 0.2s 内收掉 |
106
+ | 🟡 「成交量」压 K 线、量柱顶到 240 网格线 | 标签移到右下空处;量柱按最大量归一,留 6px 间隙 |
107
+ | 🟡 日 K 页 2 秒读不完 | 删 5 日均线;K 线 1.3s 出完、括注 1.75s 落定、停 0.75s |
108
+ | ⚪ 红涨绿跌与品牌红撞色 | 保留(面向 A 股观众),副标题写「红涨绿跌(A 股惯例)」;做海外版换绿涨或蓝/橙 |
109
+
110
+ 修订后 qa:
111
+
112
+ | 镜头 | 运动% | 静止帧对% | 跳变 | 均/峰 ms | 确定性 |
113
+ |---|---|---|---|---|---|
114
+ | t3_s1 | 1.44 | 0.0 | 3 | 1.3/1.7 | ✓ |
115
+ | t3_s2 | 2.45 | 4.7 | 0 | 1.9/2.6 | ✓ |
116
+ | t3_s3 | 0.91 | 0.0 | 0 | 1.7/2.9 | ✓ |
@@ -0,0 +1,193 @@
1
+ # Y1 · Kurzgesagt 扁平科普:视频动画语法卡
2
+
3
+ 一句话:把一个抽象概念画成一个具体的物,放进能无限缩放的发光世界里,相机在尺度之间穿行;环境层(星、粒子)可以一直轻轻动,主体和信息在口播节点上发生变化,落定后停住。
4
+
5
+ 示范片:`scripts/engine/demos/y1_kurzgesagt/`(渲染 `render.py --film demos/y1_kurzgesagt`)(8s,3 镜 2 转场),总览:`assets/动画语法/y1_kurzgesagt_总览.jpg`
6
+ 依据:本风格的调研(调研原文与逐帧数据留在实验归档、没收进 skill,用到的数字已摘进本卡)(2025 两支正片+2014《免疫系统》实测,官方 Skillshare 课逐字稿)。标【实测】【一手】的数字出自那里,标【本片】的是示范片里实际用的参数。
7
+
8
+ ## 起手必查
9
+
10
+ 1. **先写这一段的视觉隐喻:抽象概念画成什么物**(细胞、齿轮、管道、城市、一滴水……)。写不出物的那一句,不要只放一颗发光的球加几个标签胶囊。
11
+ 2. **示范片和样例里的橙色中心星球是一种画法,不是这个语法的签名。** 中心物按题材换形状和颜色。参数化片段 y1 的中心物由 spec 定:`data.center_style`(颜色、形状、要不要轨道环)或 `data.image`(把一张真实图片裁进中心物),不写就按名字生成一个中性样式,不再是那颗橙色星球。它只会画「中心物+卫星节点」,适合「里面有什么」的分层讲法;题材不是这个结构,就自己写镜头(`demos/y1_kurzgesagt/` 和 `lib/` 的 `CAM`、`TOON`),或换语法。
12
+ 3. **每句旁白里至少一次状态变化**(弹出、形变、钻入、拉远)。逐句数一遍:连续两句画面没变,就补一个事件,不靠浮动和慢推凑。
13
+ 4. **主体落定后停住。** 环境层(星闪、粒子漂、远景云)可以一直轻轻动;主体和标签不加浮动、呼吸,不用匀速慢推填停顿。
14
+ 5. **钻进去之前先停一下。** 尺度转场前让要钻的那个物停 0.3 秒以上、亮起来,观众知道下一步进的是哪一个;缩放用对数插值(`CAM.zlerp`)。
15
+
16
+ ---
17
+
18
+ ## ① 适用场景
19
+
20
+ **用它:**
21
+ - 讲尺度、讲「里面是什么」的内容:从细胞到星系、从一个像素到一个模型,或者「放大看会发现……」。尺度转场是这个风格的标配。
22
+ - 讲机制、讲系统:神经网络、免疫系统、能量流。最适合把看不见的过程画成发光的粒子和连线。
23
+ - 口播是平稳、娓娓道来的科普腔。Kurzgesagt 约 168 词/分,一个硬切镜头大约配 2 句话【实测】。
24
+ - 需要「严肃但可爱」的语气,可以用一个吉祥物或鸟群出来讲笑点。
25
+
26
+ **别用它:**
27
+ - 讲真实人物、真实事件、档案证据:扁平卡通会把可信度冲淡,这种内容用 Y2 拼贴。
28
+ - 讲步骤、讲推理链:一步一步写出来更好懂,用 Y3 白板。
29
+ - 制作预算很小的时候。这个风格的质量全靠「每一帧都有东西在动」,官方单片要 1200 小时以上【一手】。偷工减料的 Kurzgesagt 看起来就是廉价 PPT。
30
+
31
+ ## ② 画面构成
32
+
33
+ - **先选年代**。2025 年是深色系:暗像素占 61–68%,饱和度中位 0.84–0.89。2014 年是浅灰白底、低饱和。两者不能混【实测】。示范片前两镜用 2025 深色系,第三镜白天用明亮系,模仿他们「换段落就换一整套色温」的做法。
34
+ - **色板**(2025 深色系,实测取色):
35
+ - 底:`#05020F` / `#0E0631` / `#25155E`
36
+ - 次底:`#191670`、`#3826A3`、`#5F58DB`
37
+ - 强调青:`#32BAEE`、`#7DD3DC`
38
+ - 强调橙黄(发光体):`#F48301`、`#E07919`、`#FACC12`,辉光芯 `#F9EF93`
39
+ - 品红:`#BE3A95`、`#C83C7F`
40
+ - 高光与白字:`#E7DFE1`、`#F9FCFB`
41
+ - 规律:一个深底配 2–3 个高饱和强调色,强调色互为对比(橙黄对靛紫、青对品红)【实测+归纳】
42
+ - **上面这套深紫底只是拆解记录,成片不要照抄。** 作者看过多支 AI 做的片子,原话是「我们需要规避下蓝、紫渐变的垃圾配色,这种非常ai slop」;深紫星空底正是这类片子最常见的一眼 AI 味,`deliver.py` 会量蓝紫底并红灯。要深色系就用 `references/色板.md` 的 `ink`(深墨)或 `navy`(海军蓝平涂),保留「一个深底配 2–3 个高饱和强调色」的规律;参数化片段 y1 写 `"theme"` 即可,不写时默认是深墨平涂。
43
+ - **形状语言**:
44
+ - 不描边。阴影用同色相深一档的色块,高光是白色椭圆或一条弧线【归纳】。
45
+ - 圆角无处不在。生物是团状有机形,角色头是圆的,四肢是圆头管。
46
+ - 发光体必带径向辉光。暗底存在的意义就是让辉光成立。
47
+ - **【本片】双色分面**:`flat(c, path, 本色, 阴影色, 高光色, v, w)`。在形状内部做两次平移:右下留一条阴影带,左上留一条细高光边。v≈(10,12)px,w≈(4,5)px。花叔的每个部件也走这一道,所以他和场景是同一种画法,不像贴上去的。
48
+ - **构图**:主体放在画面中部偏下的三分线上,上方留天空给星星和标注。场景分 5–6 层视差:星空 d=0.05、月亮 0.12、远山 0.3、近坡 0.65、主体 1.0、前景叶片 1.5(近景虚、暗)。官方没公开层数,实测是 2–5 层【归纳】。
49
+ - **角色**:
50
+ - Kurzgesagt 鸟:蛋形身体,大白眼,小黑瞳偏前,橙色三角喙。翅膀是比身体深一档的叶形,每只鸟换一个颜色【一手+归纳】。
51
+ - 【本片】猫是水滴身体加圆头,三角耳带品红内耳,大白眼;机器人是圆角壳加深色屏幕脸,一只发光镜头眼;花叔用 `HUASHU.build` 的 point 姿势,每个部件都过双色分面。
52
+
53
+ ## ③ 运动轨迹
54
+
55
+ - **官方缓动**【一手,Skillshare】:
56
+ - 常规动作 50 帧(60fps 下 0.83s)。想利落用 30/20/10 帧,弹出用 5–10 帧。
57
+ - 循环动作用 Easy Ease 33.3%,约等于 `cubic-bezier(.333,0,.667,1)`。
58
+ - 其他动作用 75% influence,约等于 `cubic-bezier(.75,0,.25,1)`:起步很软,中段快,收尾很软。
59
+ - **弹出**【实测】:卡片在 0.25s 内长到 90%,第 20 帧过冲到 108%(探测器卡是 114%),约 0.5s 回到 100%。
60
+ - 【本片】识别标签用 `backOut(q, 1.1)`,时长 0.5s。
61
+ - **错开**:同类元素错开 10–20 帧,肢体之间错开 3–4 帧,动作之间停 20 帧【一手】。
62
+ - 【本片】标题逐字错开 45ms、单字 0.5s cubicOut。像素猫 144 块按到中心的距离错开 35ms/格,每块 0.5s backOut(1.4) 从四周飞入。神经网络逐层点亮,间隔 0.32s,节点弹一下 0.35s。
63
+ - **环境微动与主体停顿**:2025 片里 0.5s 内完全不动的时段只占 0.3%【实测】,动的主要是环境层(星闪、粒子漂、辉光)和正在讲的那件事。
64
+ - 解说类镜头:主体和信息元素落定后静止,动作放在口播节点上(弹出、形变、推进、钻入)。
65
+ - 纯氛围镜头(片头、换段的喘气处)可以保留轻微环境动:星星闪、粒子漂、远景慢慢移。
66
+ - 眨眼 5 帧闭、10 帧开,间隔不规则,**眼睛不缩到 0**【一手】。
67
+ - 【本片】星星 170 颗,各自相位闪烁 1–3.5 rad/s。前景叶片 `blur(7px)` 虚焦,做景深。机器人上下浮 ±12px,喷射光用 23/37Hz 双正弦抖。猫尾两段贝塞尔摆。草叶 2.1 rad/s 摆。萤火粒子在 0.8–1.3 层漂。信号脉冲沿连线持续循环。
68
+ - **相机**【实测】:
69
+ - 2025 片里约 1/3 的时间在缩放,平移约 10%,旋转约 5%,拉远多于推进。缩放大多是尺度穿行和揭示,不是填停顿。
70
+ - 新片的点名镜头:停住 → 缓推约 0.9 秒推近 → 停住;换节点 0.7 秒移过去;揭晓那一下才快推 0.28 秒或砸入 0.17 秒;停多久按口播;推进去之后用拉远(④ 快速拉远揭示)还回来。尺度穿行另按 ④ 的时长。
71
+ - 【本片】镜 1 用了 2.6s 匀速推 1.00→1.10,是旧做法,新片不照抄。
72
+
73
+ ## ④ 转场(常用 6 种)
74
+
75
+ 1. **推进穿越 → 物体颜色铺满 → 新场景**(尺度转场的标准写法)。
76
+ - 实测:免疫 1:48,约 1.4s,先加速后减速,峰值在中段。
77
+ - 【本片】转场 B:
78
+ - 相机对数插值推进点亮的输出节点(0.45s,cubicIn),直到满屏黄。
79
+ - 在中点 ±3 帧溶到机器人发黄光的眼睛。两边的高光点都在左上,剪点看不出来。
80
+ - 再用 cubicInOut 1.45s 拉远(42→1),落进白天的新色板。
81
+ - 不要用 expoOut:它起步斜率太大,第一帧就跳掉一大半尺度。
82
+ 2. **钻进物体,物体里是下一个世界**(穿越的变体)。
83
+ - 【本片】转场 A,1.0s:相机按 `bezier(.75,0,.25,1)` 对数推进机器人镜头(1.1→60)。下一镜只露在「镜头圆」里,圆随推进长大到盖满屏幕,圆边有一圈青色光环。下一镜同时从 0.42 倍 expoOut 浮出。
84
+ 3. **快速拉远揭示**:0.2–2s,起步快、长尾收(实测每 0.2s 缩放 1.074→1.040→…→1.0006)。用来连接微观和宏观。
85
+ 4. **光或闪光铺满画面**:用画面里的光源做白场,约 0.5s。
86
+ 5. **扫掠擦除**:物体或光带斜扫过画面,带速度线,约 0.4s。
87
+ 6. **复制增殖到铺满**:用于「数量多到……」,3–6s。
88
+
89
+ 另外两点【实测】:
90
+ - 硬切比例很低,每分钟约 5 个,跟着旁白句首走,比句首早 0–0.2s。
91
+ - 其余换画面多数是 0.3–0.6s 的设计转场,每 4.6–6.7s 一次。
92
+
93
+ ## ⑤ 节奏与文字
94
+
95
+ - **镜头时长**【实测】:
96
+ - 硬切镜头中位 7–9s,均值约 11.5s。
97
+ - 但「视觉单元」每 4.6–6.7s 就换一次,靠设计转场换。
98
+ - 每句旁白里至少有一次状态变化:弹标签、换标注、形变或转场。
99
+ - **和口播对齐**:以旁白句子的时间戳为骨架,硬切放在新句首前 0–0.2s【实测】。配乐是成片后再作曲的(Epic Mountain)【一手】。
100
+ - **文字**:
101
+ - 标注是先画一条细白引线,再逐字打出文字,约 40 字符/秒;一句旁白对一个标注,停约 3s 后逐字擦掉【实测】。
102
+ - 章节标题卡每 2–3 分钟一张,全屏,逐词出现,背景虚化。
103
+ - 标签胶囊是大圆角,填饱和纯色,里面是粗体无衬线字。
104
+ - **【本片】**:
105
+ - 8s 里放 3 镜,是正常节奏的约 3 倍密度,只为在演示里看全语法。真片请按 7–9s 一镜。
106
+ - 标题用 PuHui-Heavy 76px,逐字上浮。
107
+ - 层标签用 PuHui-Medium 40px,配下划线伸出。
108
+
109
+ ## ⑥ 代码实现要点
110
+
111
+ > 收进 skill 后(2026-10-04 v0.4):本卡「新写」里的通用函数已统一进 `scripts/engine/lib/`(名字已换成统一后的 MO / CAM / DG / TY / CH / UI / CL / TOON),示范片自己的代码在 `scripts/engine/demos/y1_kurzgesagt/`。库速查和「怎么为一段口播选语法」见 `references/09-视频动画语法.md`。
112
+
113
+ - 复用 skill:
114
+ - `PAINT.cached`、`U.rng`:确定性
115
+ - `RIG.smooth`:把点列平滑成 Path2D,画猫、山、叶片
116
+ - `HUASHU.build/pose/details`:花叔
117
+ - `PAINT.noise`
118
+ - 引擎的段落表、转场接口、离屏 A/B 缓冲
119
+ - 新写、现已统一进库(`lib/camera.js` / `motion.js` / `typo.js`):
120
+ - `CAM.at(keys, t)`:关键帧相机,缩放用对数插值。`CAM.zlerp` 让每帧放大同样的倍数,尺度转场才是匀速穿越。新片的停顿和点名用 `CAM.track`(默认缓推 push、换节点 glide、拉远 pull,重音才 punch/slam,其余时间停住),参数化片段 y1 的 highlight 默认缓推,spec 顶层的 `data` 里写 `"camera": "snap"` 才快推。
121
+ - `CAM.anchor`:缩放时让目标点平滑移到画面中心。
122
+ - `MO.bezier(x1,y1,x2,y2)`:把 AE/CSS 的贝塞尔缓动搬进代码,牛顿法求解。
123
+ - `MO.*`:sine、quint、expo、back、elastic 等。
124
+ - `TY.charsIn`:逐字入场。
125
+ - 示范片自己的(`demos/y1_kurzgesagt/kurzgesagt.js`;`flat` 已进库为 `TOON.flat`,`layer` 为 `CAM.layer`):
126
+ - `flat()`:双色分面。
127
+ - `layer(c, cam, d, fn)`:视差层。位移按 d 线性,缩放按 `z^d`,深推时远景几乎不动。
128
+ - `Y1.cat`、`Y1.bot`、`Y1.bird`:三个角色。
129
+ - `Y1.lensAt(t)`:给转场 A 用的镜头圆屏幕坐标。
130
+ - **关键架构**:
131
+ - 相机只由全片时间决定。转场窗口里,引擎照常把上一镜继续画进 A 缓冲,上一镜自己算「钻进去」的相机。
132
+ - 所以缩放转场永远是矢量重画,不会把 1920 的位图放大 60 倍糊掉。
133
+ - 转场函数(`transitions.js` 的 `lensReveal`、`matchCut`)只负责「A、B 怎么合」。
134
+ - 引擎改动(只改本实验的副本):
135
+ - `eras.js` 的任意段可以写 `dur`(秒)。
136
+ - 拍点镜头冲击改成默认关,`transition.punch:true` 才开。解说片不该有卡点顿挫。
137
+
138
+ ## ⑦ 代表作品与一手参考
139
+
140
+ - 样片:
141
+ - How Are Memories Stored Inside Your Brain?(2025)https://www.youtube.com/watch?v=PqtggjVAi8M
142
+ - Why Humanity Will Never Leave The Solar System(2025)https://www.youtube.com/watch?v=Cyl3X88KEgg
143
+ - The Immune System Explained I(2014)https://www.youtube.com/watch?v=zQGOcOUBi6s
144
+ - 官方课(缓动、循环、鸟、角色动法逐字稿):
145
+ - Skillshare《Motion Graphics with Kurzgesagt》Part 1 https://www.skillshare.com/en/classes/motion-graphics-with-kurzgesagt-part-1/631970755
146
+ - Part 3 https://www.skillshare.com/en/classes/motion-graphics-with-kurzgesagt-part-3/140140401
147
+ - 官方幕后:
148
+ - 1200 小时一支片:https://www.youtube.com/watch?v=uFk0mgljtns
149
+ - 官方自述:https://kurzgesagt.org/what-we-do?visit=videos
150
+ - 配乐:Epic Mountain https://www.epic-mountain.com
151
+
152
+ ## ⑧ 最容易做错的 3 件事
153
+
154
+ 1. **把「一直在动」做成全员呼吸**。实测 2025 片里不动的时段只占 0.3%,但动的是环境层和正在讲的那件事,不是每个元素都在浮。解说镜头:主体落定后静止,动作放在口播节点上;纯氛围镜头保留星闪、粒子漂这类轻微环境动。靠全员浮动、匀速慢推凑出来的运动,读起来还是 PPT。
155
+ 2. **缩放用线性插值,或者放大位图**。
156
+ - 线性插值的 z 前慢后猛,穿越感会断。要用对数插值。
157
+ - 把上一镜的截图放大 20 倍会糊成马赛克。必须让场景自己在更大的 z 下重画。
158
+ 3. **配色亮而杂,或者给东西加描边**。
159
+ - 2025 的 Kurzgesagt 是「深底+2–3 个发光强调色」,靠辉光撑画面。
160
+ - 加黑描边或者用中等亮度的底,就会滑向儿童绘本或企业扁平插画。
161
+ - 阴影用同色相深一档,不要用灰。
162
+
163
+ ---
164
+
165
+ ## 审片与修订(独立 agent 只看成片,7/10)
166
+
167
+ 审片意见和这一轮的处理:
168
+ - 「猫、草、山丘带描边,像儿童插画」:草叶从线条改成填色细三角;山丘顶部的亮边压到和本色只差一档。
169
+ - 「左下角黑块像脏东西」:前景叶片加 `blur(7px)` 做景深,颜色从近黑提到 `#0E0631`。
170
+ - 「标题一帧消失」:改成 0.55s sineInOut 淡出。
171
+ - 「镜 3 猫从橙变黑没交代」:橙猫留在花叔脚边当「认识的那只」;黑猫上方先出引线和小字「没见过的猫」,再弹识别标签。
172
+ - 「7.8s 鸟穿插机器人」:鸟的高度移到 175/225px。
173
+ - 「结尾 7.1–8.0 几乎静止」:示范片当时加了 4%/s 慢推。现在的做法:结尾放一个事件(快速拉远看到全貌,或钻进下一层),之后停住。
174
+ - 「3.03–3.10s 像素猫被镜头圆裁掉一半」:没改。这是「钻进镜头」揭开过程的正常状态。
175
+
176
+ ## QA(skill `scripts/qa.py`,2026-10-04,修订后终版)
177
+
178
+ | 镜 | 量的窗口(镜内秒) | 运动面积% 均/峰 | 静止帧对% | 跳变帧 | 每帧耗时 均/峰 ms | 确定性 |
179
+ |---|---|---|---|---|---|---|
180
+ | y1_s1 | 0.0–2.58 | 1.57 / 2.58 | 0.0 | 0 | 32.9 / 34.6 | ✓ 逐像素一致 |
181
+ | y1_s2 | 1–2.68 | 3.36 / 4.42 | 0.0 | 0 | 6.1 / 7.2 | ✓ 逐像素一致 |
182
+ | y1_s3 | 0.9–2.68 | 17.94 / 91.88 | 0.0 | 8(1.04–1.28s 连续) | 11.2 / 16.0 | ✓ 逐像素一致 |
183
+
184
+ 转场冒烟(每个转场渲一遍,最慢一帧):y1_s2(k_lens)48.3ms;y1_s3(k_fill)36ms
185
+
186
+ 读法:
187
+ - **镜 3 的 8 个跳变帧**落在 1.04–1.28s,是连续一段,正好是「从机器人眼睛里拉出」42 倍→1 倍的中段,整屏都在缩放,所以运动面积峰值 92%。这是设计内的尺度转场,不是单帧穿帮。
188
+ - 第一版用 expoOut,起步斜率太大,第一帧就从 42 倍跳到 15 倍,审片和 qa 都报了。
189
+ - 改成 cubicInOut,峰值落在中段,和实测 Kurzgesagt「穿越式推进」的形状一致。
190
+ - **镜 1 每帧 33ms**:前景叶片加了 `filter: blur(7px)` 做景深,比没虚化前的 9ms 慢,仍远低于 150ms 的上限。
191
+ - 运动面积 1.6–3.4% 看起来低,因为 Kurzgesagt 的微动是「很多小东西各自动」:星、粒子、尾巴、浮动、脉冲。实测 2025 片里完全不动的时段只占 0.3%,这里三镜的静止帧对都是 0%,对上了;但静止帧对 0% 只说明环境层在动,不说明讲得好,还要看抽帧是不是一页一页在翻。
192
+
193
+ 复跑:`uv run scripts/qa.py --project scripts/engine --film demos/y1_kurzgesagt --out <目录>`(上表是实验时的数字;收进 skill 后的复跑见 09 号的回归表)。