@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,27 @@
1
+ # 14_8bit · 1985 8-bit 像素游戏
2
+
3
+ ## 管线
4
+ 1. **整幅在 240×135 低分辨率画布上画**(1 低像素 = 8 屏幕像素,原片实测像素块就是 8px),最后 `imageSmoothingEnabled=false` 一次性 `drawImage` 放大 8 倍。
5
+ 2. **背景逐像素 `fillRect`**(缓存 `8b_bg`):十字点纹墙=6px 网格、隔行错 3px 的 3×3 十字;木地板条 y=106–113,每 24px 一道黑缝;砖块 16×6+1px 缝,隔行错 8,上沿和左沿一行米色高光(`#fbe2a6`)。窗里天空用 3 档蓝(`#0856ef / #47c4f8 / #aae9fb`),交界 ±0.05 的带子做 `(x+y)%2` 棋盘抖动——这是 NES 做渐变的唯一办法。
6
+ 3. **角色=RIG 路径缩到低分辨率填色 → spriteize**:每个部件单独一层(远侧手臂 / 身体腿 / 头发 / 脸 / 刘海 / 近侧手臂;猫身 / 猫头),每层:
7
+ - `getImageData` → alpha < 110 直接透明(去抗锯齿)→ 其余量化到 14 色角色调色板(最近色);
8
+ - 外轮廓描 1px 黑边(透明像素的 4 邻域里有不透明像素就涂黑)。
9
+ **分层描边是关键**:只描一次整体外轮廓时,头发/脸/手臂糊成一块;每个部件单独描边才有 NES 精灵那种内轮廓。
10
+ 4. **五官全部逐像素点**(眼 1×2 黑+眉,猫眼 2×2 黑+左上 1 白高光,粉鼻 1px,腮红 2×1),用 RIG 锚点 `/8` 取整定位。
11
+ 5. **马克杯不用 RIG.drawCup**:AA 路径缩到 6px 宽会糊,直接在低分辨率上画 6×5 白杯+两道红条+3px 把手,跟着 `G.cup` 走。
12
+ 6. **HUD 在全分辨率画**:`PressStart2P` 48px(字体 1 像素 = 6 屏幕像素,64px 太宽会让 WORLD 1-1 撞上苹果图标),8px 黑投影;猫头/心/苹果图标是字符串位图,每格 8×8。
13
+
14
+ ## 牛仔裤
15
+ RIG.girl 是长裙,8-bit 版用两段 `RIG.taper`(髋 `G.hipSeat`→膝 (1222,724)→踝 (1214,872),宽 92/76/56)画蓝裤,远侧腿深一档 `#0838a8` 错后 26px;白球鞋+一道红条。
16
+
17
+ ## 小循环(片中只停约 0.23s ≈ 11 可见帧,全部做成步进动画)
18
+ - 猫尾:15fps 四姿态循环 `[-0.55, 0, 0.55, 0]`(RIG.cat 的 tail 参数),像素动画的「几张图交替」。
19
+ - HUD 心闪:lt 0.16–0.23(≈ 630 帧)每 2 帧一换:满心变白、空心变满红。
20
+ - 盆栽抖:同一窗口里叶子整像素 `[0,1,0,-1]` 偏移。
21
+ - 问号块顶出金币:lt 0.06–0.22 半正弦上 9px 再落回。
22
+ - 窗外云 2 帧左移 1px;像素热气三列 1×2 点、30fps 每帧上移 1px、6px 循环。
23
+
24
+ ## 踩到的坑
25
+ - RIG 猫头顶到 y≈535,会压住窗台(窗到 y=590)。这是共用骨架的位置,没挪;8-bit 黑描边让重叠更显眼,但转场依赖标准构图,保留。
26
+ - `spriteize` 读的是非预乘 RGBA,别再除 alpha。
27
+ - 性能:热帧 2.5–6ms,冷启动 11ms。
@@ -0,0 +1,32 @@
1
+ # 15_raytrace · 1993 早期光线追踪 CGI
2
+
3
+ 不用 3D 引擎,靠 2D Canvas 的「着色约定」假装是渲染器出图。
4
+
5
+ ## 塑料着色(每个部件都过一遍)
6
+ `plastic(c, path, base, hx, hy, R)`:
7
+ 1. 底色填充;
8
+ 2. 以高光点 (hx,hy) 为心、半径 R 的径向渐变:0→白 .55,0.28→白 .06,0.62→透明,1→深紫 `rgba(10,0,30,.42)`(边缘压暗=体积);
9
+ 3. 环境反光:`lighter` 叠一圈 `rgba(70,150,150,.28)` 的描边,宽 0.18R,向左偏 0.04R——墙是青绿色,反光就是青绿色;
10
+ 4. 一颗硬边白色椭圆镜面高光(0.16R × 0.09R,透明度 .85)。这一笔最像 90 年代 Phong。
11
+
12
+ 肢体用 `cyl()`:渐变横跨肢体法线方向(暗 .25 → 白 .5 窄带在 22% 处 → 暗 .45),再沿 20%–75% 画一道白色细高光线。
13
+ 少女用 RIG.girl 的 Path2D(长发),裙子换成蓝色塑料圆柱腿+膝盖球关节,肩膀加球关节——就是「玩具人偶」的关节感。
14
+ RIG 的猫身是折线,塑料感会露出棱角:先 `RIG.smooth(K.bodyPts)` 再着色。虎斑用 `filter: blur(2px)` 画成「印在塑料下面」的软条纹。
15
+
16
+ ## 场景
17
+ - 墙:径向渐变 `#7dbcb9 → #64a6a6 → #3f8285`,光源在窗的位置;窗的投影 `blur(10px)` 偏右下。
18
+ - 窗外:粉紫渐变天(`#a24cc4 → #df62ae → #f5a08a → #f8c070`),两层山,山体上叠 28×26 的粉色线框网格(早期 CG 的 wireframe 地形),雪顶是锯齿三角。
19
+ - **地面**:逐像素透视棋盘,消失点 (960,480),`X=(x-960)/dy, Z=1/dy`,格子 TX=0.27、TZ=0.00029,2×2 超采样抗锯齿,近墙 140px 内加 35% 雾。缓存,冷启动整场 53ms。
20
+ - **反射**:物体层(椅/桌/少女/猫)画在离屏层,`translate(0, 2*906); scale(1,-1)` 镜像、`globalAlpha .34` 画进地面裁剪区;道具各按自己的接地线镜像(锥 780、紫环 846、铬球 800),并**先画到独立层再整体半透明**——否则紫环的 140 颗小球各自 .34 叠加会变成不透明。
21
+ - 玻璃桌:半透明绿椭圆+厚边+白描边,一条斜向反光每秒滑 260px。
22
+
23
+ ## 小循环(0.23s 内要看得见)
24
+ - 紫环:140 颗球沿圆环排布,绕竖轴以 7 rad/s 自转、倾斜 0.35,按深度排序画(先一层暗紫底让球连成管,再逐颗径向高光)。0.23s 转 1.6 rad,从正面转到侧面,非常明显。
25
+ - 铬球:每帧逐像素环境映射(反射向量向下→棋盘,向上→粉紫天+一条窗光),棋盘 u 坐标随 `t*4.5` 平移=在转;菲涅尔边缘提亮。直径 104px,每帧 <2ms。
26
+ - 镜头光晕(`lighter`):日芯辉光 170px 以 23 rad/s 脉动 ±8%;12 道星芒以 1.6 rad/s 旋转;水平长条光 960px;5 个鬼影(圆+六边形)沿「太阳→画面中心」直线排布、随 `sin(t*5)*0.03` 滑动。
27
+ - 猫眼绿光:`lighter` 径向渐变半径 46px,以 18 rad/s 脉动 ±25%。
28
+ - 端杯(choreo.cup)、甩尾、眨眼、热气照常。
29
+
30
+ ## 坑
31
+ - 转场 wireframe 用新画面第一次出现时的帧算边缘并缓存(`once('edges')`),所以 lt≈0 那一帧要完整——别在 lt=0 留空白或淡入。
32
+ - 性能:热帧 23ms,冷启动 53ms。
@@ -0,0 +1,55 @@
1
+ # 16_2026 · 2026 扁平矢量插画 + 全片笑点收尾
2
+
3
+ 所有表演用**全片帧号 `F = t*60`** 写,关键数字逐条照抄 `../拆解/分镜表.md` §4,方便和原片逐帧对表。
4
+ 对照接触表(左原片|右复刻):`../渲染/16_2026/cmp_E1…E4_*.jpg`,片段 `clip_2026.mp4`(10.8–15.06s)。
5
+
6
+ ## 画风(Dribbble 扁平+颗粒)
7
+ - 纯色块、无描边;体块只靠「同色系深一档的色块」分(毛衣亮面斜块 `#f08b7d`、猫大腿 `#f3ad4c`+一道深色弧边)。
8
+ - **颗粒点彩 `stipple()`**:在形状里撒 2px 方点,密度是位置函数——粉圆 `0.12 + 0.75·clamp((y-cy+120)/420)`(越往下越密),淡紫块往右下密,太阳往右下密。静态部分全进缓存 `fl_bg`。
9
+ - 角色层画完后用一张静态颗粒纹理 `source-atop` 叠上(5% 暗点 α70、3.5% 亮点 α90),颗粒只落在角色身上。
10
+ - 光锥:26000 个点、宽度随 y 线性 56→150、透明度随 y 衰减、靠中心更密,缓存成 340×420 贴图,跟吊灯一起绕 (1010,0) 摆。
11
+
12
+ ## 少女(RIG 基础上自写姿势)
13
+ - 躯干/颈锚点:`RIG.girl({s:1.12})`;头部再调一次 `RIG.girl({s:1.344, dy:43.7})`——相当于头部围绕颈点放大 1.2 倍,扁平插画的大头比例。脸、刘海、后发、丸子、眼/唇/耳锚点都取自它。
14
+ - 手臂:`RIG.ik2(肩, 目标, 150, 140, -1)`,三套目标点按进度混合:打字(两手在键盘上以 22 rad/s 交替起落 7px)→ 摸猫(688–704,近手在猫背上画小圆)→ 惊呼(791–798,`ease.outBack` 举到下巴前,手指张开)。
15
+ - 表情:闭眼弧+上扬嘴(<686)→ 圆点眼+高光、小 o 嘴(686 起,o 用 outBack 弹出)→ 大眼+大张嘴+舌头(791 起)→ 838 帧后改成挤眼「<」(原片终帧也是闭眼)。
16
+ - 紧张线:3 道,从头顶前上方放射,长度 outBack 弹出;颜色 793 淡粉 → 796 全红(RGB 插值);830–888 每 2 帧随机抖 ±2.5px,头部同步抖 ±2px。
17
+ - 裤腿/袜/鞋自画(RIG 是长裙)。
18
+
19
+ ## 猫(姿势库 + 插值)
20
+ 每个姿势是一组局部关键点(朝右、原点=质心):身体 10 点、白胸 6 点、大腿椭圆、背纹 3 段、头、两前腿、后腿、尾巴 4 个贝塞尔点、gy(脚底到质心)。
21
+ 姿势:`SIT_F`(地上坐,从原片 10.95s 量)、`SIT_T`(桌上坐,原片朝左实测后镜像成朝右存)、`LEAP`(水平拉长)、`LAND`(前爪向下)。`mixPose` 逐数值 lerp。
22
+ 变换:`translate(质心) → [绕脚底 或 绕质心] rotate → scale(dir·sx, sy)`,挤压拉伸都绕脚底,所以蹲下时脚不离地。
23
+
24
+ | 帧 | 表演 | 做法 |
25
+ |---|---|---|
26
+ | 657–661 | 预备下蹲 | sy 1→0.86、sx 1→1.07,头低 8px |
27
+ | 661–664 | 蹬地 | 切到「绕质心」、rot→-0.75、sy→1.12(拉长),姿势混 45% LEAP |
28
+ | 662–684 | 弧线 | 质心用分镜表 12 个实测点 Catmull-Rom;rot = 切线角×0.8,679 起逐渐放平;670–676 sx→1.12 / sy→0.9 |
29
+ | 664–672 | 起跳烟尘 | 4 团米色圆往外扩、变淡 |
30
+ | 684–690 | 落桌挤压 | 混 LAND,sy 0.86→0.70,sx→1.18,脚底钉在 y=628(笔记本面) |
31
+ | 690 | 翻面 | 压到最扁的那一帧 dir 从 +1 跳 -1(限帧动画的 snap,比 2–3 帧的「纸片翻转」干净) |
32
+ | 690–698 | 坐起 | 混到 SIT_T;sy 0.96→1.07(694 过冲)→1.0 |
33
+ | 685–689 | 笔记本盖被压上 | 屏幕绕铰链转 -1.91→0.02 rad;「•••」输入气泡缩没 |
34
+ | 724–812 | 盯杯子 | 身体绕脚底前倾 0.08 rad,瞳孔左移 4px |
35
+ | 744/766/786 | 三次拍杯 | 每次:预备 7 帧(爪抬到胸前)→ 击出 4 帧 → 停 4 帧 → 收 8 帧;前倾量 = 0.1+0.28·clamp(肩到杯沿距离),越远越趴 |
36
+ | 835– | 得意 | 闭眼弧+大腮红;856–875、886–892 换 ∩∩ 开心眼 |
37
+
38
+ **拍杯对准的关键**:先按世界距离算前倾、施加前倾变换,再用 `c.getTransform().invertSelf().transformPoint(杯沿)` 把杯子右沿换回局部坐标当爪子目标。直接按未前倾的坐标算,前倾 0.38 rad 后爪子会往下偏 60px 戳进桌面。
39
+
40
+ ## 杯子与碎裂
41
+ - 杯子 x:分镜表 16 个实测点线性插值(744:981 … 796:801);790–796 开始外倾 -0.12。
42
+ - 坠落 796–815:9 个实测中心点 Catmull-Rom(实测重力≈1.75px/帧²),旋转 `-0.12 - 2.3·q^1.3`;身后 6 颗咖啡滴取杯子过去 1.3 帧间隔的位置、越早越小。
43
+ - 815 落地:7 道冲击放射线 8 帧淡出;两块大碎片用分镜表三点(818/824/834)拉格朗日抛物线,834 落地后停住;9 颗小碎屑抛物线、各自落地高度 893–911 停住;咖啡渍宽 818:140 → 822:220 → 826:235(ease.out);两圈灰涟漪扩到 560/460 宽、838 前淡出;把手半圆+茶包标签留在地上。
44
+ - 拍杯动线:杯子右侧 3 道短线,击中后 12 帧外扩淡出。
45
+
46
+ ## 环境二次动作
47
+ - 吊灯:`damped(F, 686, 0.055rad, 周期26帧, 衰减22帧) + damped(F, 830, 0.045, 22, 20)`,光锥一起摆。
48
+ - 植物:`damped(F, 697, 0.035, 22, 18)`(晃)+ `damped(F, 821, 0.05, 9, 26)`(抖,周期短);龟背竹每片叶再加一点相位不同的自摆。
49
+ - 云 15px/s 左移(0.25px/帧);小飞机 177px/s 拖虚线尾迹(12.0s 在 x≈440、13.75s 在 x≈750,对上原片);太阳光芒 0.35 rad/s 转;17 个装饰符号 4fps 沸腾(±1.5px、±0.09rad)。
50
+
51
+ ## 签名
52
+ `window.SIGNATURE || 'Opus 5.5'`,Caveat-600 64px 缩放到宽 236px,起点 (1614,1032) 微倾 -0.03;书写前沿 x 用分镜表 842:1606 → 870:1868 逐帧插值,`clip` 揭示;下划线 24 段、线宽 3.4→1.4 渐细,同一个前沿一起画出。
53
+
54
+ ## 性能
55
+ 热帧 5–12ms,转场首帧(含缓存构建)31–64ms。
@@ -0,0 +1,50 @@
1
+ # 17_ink · 中国水墨写意(八大山人/齐白石)
2
+
3
+ > 来源:迁移测试 A(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/17_ink.js`。
4
+
5
+ 实验时的文件名 `scenes/01_ink.js`(313 行)。帧差 0.45↔0.9s 为 3.3%(阈值 24),相邻帧中位 0.62%,没有静止帧对。
6
+
7
+ **管线**(和 09 标杆相反:纸是底,墨只加不铺)。开场 `lt += 0.12`,第 0 帧已经落下前几笔,不是一张白纸(审片指出白纸首帧不能当封面)。
8
+ 宣纸(缓存)→ 晕染层:淡墨远山、朱日 → 雾带(纸色模糊椭圆横移)→ 掠过的小鸟 → 静态笔触:窗、案、地线,写完缓存 → 竹枝(个字叶)→ 挂轴里的齐白石虾 → 猫:赭石晕染+焦墨 → 少女:花青晕染+白描+衣纹 → 热气游丝 → 钤印。
9
+
10
+ **宣纸**
11
+ `P.texture('#efe6d0', scale .0025, amt 9, grain 7)`。上面叠 2600 根纸纤维短弧:一半褐色 α.05–.13,一半亮色 α.12–.27。再加径向暗角,到边缘 α.22。
12
+
13
+ **毛笔 `brush(c, pts, {w, tone, dry, reveal, bristles, head, tail})`**
14
+ - 点列先 Catmull-Rom 加密,再按 4px 等弧长重采样(`KIT.resample`)。不重采样的话,飞白噪声的频率会随笔画长短变化。
15
+ - 笔压:`prof(q) = smoothstep(0,head,q) · (1−0.7·smoothstep(1−tail,1,q)) · (0.85+0.15·noise)`。
16
+ - 湿笔芯:整笔都用 ribbon 填,宽度 `w·prof·(1−0.85·dry·q^0.8)`,α 为 tone×0.72。越往后越细,表示墨在用完。
17
+ - 笔毛:每根一条**连续**折线,横向偏移 ±0.475w·prof。噪声 `noise(k·1.9, i·0.09)` 低于 `dry·q^1.2·0.95+0.05` 时断开,露出的纸就是飞白。
18
+ - 坑:第一版按「每一小段单独 stroke+round cap」画笔毛,接头处叠出一节节深点,看起来像竹节或麻绳。必须改成每根笔毛一条连续 path、butt cap。
19
+ - 参数:窗框 w14–18、dry .45–.6;案面 w22;衣纹 w4–6、dry .3–.4、tone .78;地线 w5、dry .85、tone .35。
20
+
21
+ **晕染层 `washLayer`**
22
+ - 形状先画在 scratch 上,再用 multiply 合到纸上,分两遍。
23
+ - 外晕:`blur(halo·(0.4+grow))`,α 为 haloA·grow。
24
+ - 本体:`blur(blur·(1.6−0.6grow))`。
25
+ - grow 按 lt 从 0 走到 1:开场是从无到有洇开,之后外晕继续慢慢变宽,这就是「墨在纸上晕开」。
26
+ - 少女 halo 12、α.6;猫 halo 9、α.78;远山 halo 14。
27
+
28
+ **留白**
29
+ - 猫的白色部分(口鼻、胸、爪)用 `destination-out` 从赭石层里挖掉,露出纸色。这比画白色更有水墨味。
30
+ - 少女的交领内衫也这样挖掉。
31
+ - 面部用纸色填,再用 1.8px 焦墨白描勾。
32
+
33
+ **色**
34
+ - 墨 `[16,14,12]`,用 tone 分出五色(焦 .9/浓 .8/重 .6/淡 .35/清 .15)。
35
+ - 赭石(猫)`#c47a3c`;花青(衣)`#6f8aa0`、广袖 `#7d97ab`;藤黄(金发)`rgba(226,170,52,.75)` multiply。
36
+ - 胭脂红只点三处:腰带、发簪珠、点唇,用 `[190,40,40]`。另有朱日 `#d8553f`、钤印 `#c4281e`。
37
+
38
+ **母题动画**
39
+ - **开场写出**:lt 0→0.45,每笔 `reveal = ss(d, d+l, lt/0.45)`,按窗、案、竹、猫、人的顺序依次写出。
40
+ - 竹:分节淡墨主枝,绕 (835,70) 摆 `sin(2.9t)·0.11`,越往枝梢越大。5 组个字叶各 3 片(L110、w15),翻动 `sin(7t+g)·0.2`。
41
+ - 雾带:4 条纸色椭圆,blur 14、α.72,以 150–270px/s 横移,远山时隐时现。
42
+ - 八大式小鸟:从窗右侧以 420px/s 掠过,翅膀两笔,每秒约扇 8 次(`sin(52·lt)`)。
43
+ - 齐白石虾(挂轴里两只,1.45 倍):6 节淡墨节+头胸甲中间一笔焦墨,两长两短须做行波,三节长钳,身体弯曲 `sin(7t)·0.12`,沿曲线游动。
44
+ - 八大白眼:猫的瞳点顶到眼眶上方,「白眼向天」。
45
+ - 钤印:lt 0.3–0.4 从 1.5 倍压到 1 倍,multiply 盖上;白文「白石」。
46
+
47
+ **坑**
48
+ - 静态笔触在写出期间实时画,写完一次性缓存成 `ink_static`,否则每帧要画几千根笔毛。
49
+ - 小鸟第一版的路径穿过竹叶丛,看不见,改到雾带上方 y≈470 才读得出来。
50
+ - 晕染用的是 multiply,透明,所以窗台墨线会透过猫的耳朵,桌腿会透过裙子,审片读成「层级错了」。修法是在猫和衣裙的剪影里先补一层纸色(clip 后 drawImage 纸),再上晕染。这等于在纸上「先留出这块地方」。
@@ -0,0 +1,37 @@
1
+ # 18_klimt · 克里姆特金色时期(1907)
2
+
3
+ > 来源:迁移测试 A(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/18_klimt.js`。
4
+
5
+ 实验时的文件名 `scenes/02_klimt.js`(223 行)。0.45↔0.9s 为 32.9%(主要来自流光),相邻帧中位 0.40%,但 48 对里有 14 对几乎静止(见 ②-2)。
6
+
7
+ **管线**
8
+ 金箔墙(缓存)→ 金粉四角星闪烁(lighter)→ 窗《白桦林》点彩 → 黑白方格金框 → 花毯地 → 霍夫曼黑白方格桌 → 斜向流光(在角色之前画,角色自然挡住)→ 猫 → 少女金袍(纹样层按剪影 source-in)→ 写实的脸与手 → 花冠 → 金袖、金杯 → 金色热气。
9
+
10
+ **金箔**
11
+ - 逐像素:`f = 0.5 + fbm(x·.004)·0.55 + noise(x·.003, y·.08)·0.5 ± 0.05`,在 `[120,78,18]→[196,148,52]→[246,216,128]` 之间插值。
12
+ - 每 96px 画一条极淡的方块接缝,表示一片片贴上去的金箔。
13
+ - 墙:金箔 × 480×270 小 fbm 图放大后 multiply(褐金斑驳,像《吻》的底),再撒 9000 颗金粉、暗粉。
14
+
15
+ **纹样(金袍)**
16
+ - 150 个随机点,分四类:
17
+ - 同心圆三色(30%):红白蓝、蓝金红、紫白金;
18
+ - 深褐底金螺旋(32%),每个按 ±3rad/s 转;
19
+ - 荷鲁斯式眼形纹(22%),轮流眨:`sin(2.2t+φ)>0.86` 时闭上;
20
+ - 白点簇+红心(16%)。
21
+ - 下摆另有 60 块黑白竖长方块,金描边,这是《吻》里男子长袍的语言。
22
+ - **平面装饰对写实脸**:脸、手用径向渐变表现体积(高光 `#fbe8da` → `#f0cfb8` → `#d8a88c` → 边缘 `#b88068`),模糊的腮红和眼窝阴影,只有 1.2px 淡轮廓。金袍有 3px 深色描边。这个对比就是克里姆特。
23
+
24
+ **其它**
25
+ - 窗《白桦林》:2600 个秋叶色椭圆点,6 根白桦树干带黑斑;落叶 14 片翻面下落。
26
+ - 花毯:260 朵同心圆花,越近越大(6→20px),点头 `sin(4.2t+φ)·0.18r`。
27
+ - 流光:520px 宽、α.24 的亮带,`transform(1,0,−0.45,1)` 斜切,lighter,在 1.15 秒内**匀速**从 −200 扫到 2300。
28
+ - 金粉:420 颗,`sin(t·sp+φ)>0.55` 时出四角星。第一版星太大,像圣诞装饰,后来半径从 `s·(1+2.2a)` 改为 `s·(0.6+1.1a)`。
29
+
30
+ **坑**
31
+ - 逐个纹样 `source-in` 会把彼此清掉,见 ②-7。
32
+ - 流光 α 到 .38 时像镜头眩光,压到 .24。
33
+ - 第一版相邻帧有静止段:眨眼是间歇的,流光是软渐变。加了三样之后,静止帧对从 20/36 降到 0/36:
34
+ - 34 片金箔碎片翻面飘落(150px/s,方片和圆片,金色渐变);
35
+ - 金粉以 26px/s 上浮;
36
+ - 花点头幅度从 0.18 加到 0.35。
37
+ - 猫身上的金螺旋第一版连脸上也有,审片说「像起了疹子」,改成只在身体上、数量减到 46 个。
@@ -0,0 +1,42 @@
1
+ # 19_munch · 蒙克《呐喊》式表现主义(1893)
2
+
3
+ > 来源:迁移测试 A(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/19_munch.js`。
4
+
5
+ 实验时的文件名 `scenes/03_munch.js`(约 160 行)。终版相邻帧中位 2.27%,单帧 JS 侧大约 90–140ms。
6
+
7
+ **流线渲染器 `flowLines`(新)**
8
+ - 种子:24px 抖动网格,约 3600 个。每个种子判定区域(天、峡湾、山、墙、地板)。
9
+ - 沿「随时间扭动的方向场」积分,每区参数 [steps, step, width, α]:
10
+ - 终版:天 [32,7,10,.78]、峡湾 [26,6,9,.78]、墙 [42,7,13,.5]、地 [32,8,12,.55],每根另加 0–8 步随机。
11
+ - 一根笔走 200–300px。
12
+ - 历程:第二版是 [26,6,7,.85],独立审片仍判「第一眼是梵高」,只好再拉长、加宽、减透明度。
13
+ - 越出本区就停,所以区域边界是干净的。
14
+ - **不描边、半透明叠色**:蒙克是薄涂长笔。第一版照搬梵高的「深色描边」,墙面成了一节节毛毛虫短笔,一眼就是梵高。去掉描边、步数从 10 加到 26 以后才对。
15
+ - 底下先铺同色系平涂(墙从 `#a8401e` 渐变到 `#5a1a14`),笔缝里露出来的是同色,不是黑。
16
+
17
+ **方向场**
18
+ - 天:`0.55·sin(x·.011 + y·.018 − 2.4t)`;
19
+ - 峡湾:绕 (620,470) 的切线;
20
+ - 墙:竖向 ±0.5 正弦扭;
21
+ - 地:指向消失点 (1000,640)。
22
+
23
+ **血色天空**
24
+ - 种子按「波浪化的 y」决定色带:`yy = y + 22·sin(x·.014 − 2.2t)`,带宽 28px。
25
+ - 7 色循环:`#e2541c #f08a24 #f4c03a #c8301e #e8743a #f6a63a #b82a1e`。
26
+ - 色带本身也在扭,这就是「天空在流」。
27
+
28
+ **整个世界在流动**
29
+ 最后把整幅画按行位移 `9·sin(y·.012 + 4.2t) + 4·sin(y·.031 − 6t)`,再按列位移 `6·sin(x·.009 − 3.6t)`,带宽 4px,用 `KIT.warpRows / warpCols`。人、猫、桌都会一起晃,比单独画摇晃的线便宜得多。
30
+
31
+ **母题**
32
+ - 窗里:桥面斜纹、栏杆三条(随世界扭)、两个戴帽远人。
33
+ - 尖叫者:骷髅脸、双手捂颊、嘴张合 `7+2sin(9t)`,身体摆 `sin(3.2t)·0.12`。
34
+ - 桌、椅腿是抖动的波浪线。
35
+ - 少女:1890 年代挪威深色长裙+白领,黄绿脸影(blur 8 的 `rgba(120,150,70,.4)`),9 绺长金发做行波 `sin(9q − 7t)`。
36
+ - 猫嘴微张,像被画外的尖叫传染了。
37
+
38
+ **角标**:文字画进离屏,再按行正弦扭。字体不要用 Kalam 这类漫画手写体(审片说出戏),改用 IMFellEnglish。
39
+
40
+ **坑**
41
+ - 整幅行列位移以后,左右边缘会露出暗色缺口。`KIT.warpRows/warpCols` 加了 margin 参数:每行多拉伸 2×margin 像素,margin 要大于等于最大位移。
42
+ - 线稿模式下举杯的手臂会被躯干线穿过,用 `KIT.nearArm` 重盖(见 ②-16)。
@@ -0,0 +1,49 @@
1
+ # 20_dunhuang · 敦煌壁画(莫高窟·盛唐)
2
+
3
+ > 来源:迁移测试 A(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/20_dunhuang.js`。
4
+
5
+ 实验时的文件名 `scenes/04_dunhuang.js`(215 行)。0.45↔0.9s 为 6.6%,相邻帧中位 1.98%。
6
+
7
+ **管线**
8
+ 土红地仗(缓存):`P.texture #a5452f`、dark `#7a3020`,加稀疏褪色团花,顶部卷草边+三角垂幔(青绿白红交替+金珠)→ 窗=石青天:祥云、飞天 → 卷草纹窗框 → 莲花砖地(缓存)→ 壸门低案、油灯 → 猫 → 少女(唐代供养人)→ 热气卷云 → 天花 → 罩层。
9
+
10
+ **线与色**
11
+ - 铁线描:等宽 2.6px,色 `#5a2414`。脸用更红的 `#8a3a24`。
12
+ - 矿物色:土红 `#a5452f`、石绿 `#3f8f6e / #6ab08e`、石青 `#2f5f8f / #5a86b0`、白 `#ecdfc4`、金 `#d8b05a`。
13
+
14
+ **唐装**
15
+ - 间色裙:红底,斜梯形绿条,每 44px 一条,向下随 x 发散。
16
+ - 石青短襦、白交领、高腰红带。
17
+ - 高髻:在 headTop 上方叠两个椭圆,加金钗和三朵簪花。
18
+ - 面妆:花钿(额头四瓣红花)、斜红(太阳穴一道红弧)、点唇、蛾眉。
19
+ - 茶盏是越窑青瓷。
20
+
21
+ **披帛 `shawl(pts,w)`**
22
+ - 行波点列 → ribbon,加白色虚线描花和红点。
23
+ - 背后一段:`x = back + 230q + 64q·sin(4.2q − 5.5t)`,末端 30% 向上扬。
24
+ - 前段绕臂垂下。
25
+ - 坑:第一版横向摆幅只有 18–34px,又几乎竖直,看起来像椅子的竖杆。横向位移要到 200px 以上,加上末端上扬,才读得出是飘起来的帛。
26
+
27
+ **飞天**
28
+ - 横卧朝左,1.35 倍,以 300px/s 飞过窗。
29
+ - 三条飘带做行波,其中一条从肩起弧过头顶再甩到身后,这条大弧是飞天最有辨识度的形。
30
+ - 头光、发髻、托花盘。
31
+ - 祥云是圆团+渐细云尾,以 40–76px/s 漂。
32
+
33
+ **罩层(做旧)**
34
+ - 整体 `saturation` 混合 α.3 褪色,再 multiply 一层浅土纹理 α.5。
35
+ - 逐像素剥落:`fbm(x·.0032)+0.12·noise(x·.03) > 0.3` 处露出白灰地仗 `#d8c6a2`,0.28–0.3 是剥落边缘的暗线。
36
+ - 两张脸附近设为保护区,不剥落。
37
+ - 500 条龟裂随机游走,顶部 380px 烟熏渐变。
38
+ - 坑:
39
+ - 剥落噪声频率用 .006 时,出来的是满屏芝麻斑,像污渍。降到 .0032 并提高阈值后,才是一块块的剥落。
40
+ - 终版把猫 (380–720, 530–920) 和少女 (1070–1530, 240–950) 都设成保护区,只剥背景。
41
+ - 斜红 α 降到 .32,否则像伤疤。
42
+ - 飞天的头光第一版是实心绿圆,读成「游泳圈」,改成 α.28 半透明加细线。
43
+ - 猫用 `#c8843a` 时,叠上褪色就成了褐黄色,改成 `#e08a3a`;再加 `look: sin(2.6t)` 转头,呼吸加大 2.5 倍,不然整段只有尾巴在动。
44
+
45
+ **母题动画**
46
+ - 天花:30 片四瓣花,旋转并翻面下落。
47
+ - 油灯:火苗 `1+0.12sin(17t)+0.08sin(29t)` 跳动,加光晕。
48
+ - 颜料片:10 片从剥落边缘脱开,翻转、抛物线下落。
49
+ - 猫的项圈小铃摆动。
@@ -0,0 +1,32 @@
1
+ # 21_kusama · 草间弥生无限波点
2
+
3
+ > 来源:迁移测试 A(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/21_kusama.js`。
4
+
5
+ 实验时的文件名 `scenes/05_kusama.js`(124 行)。0.45↔0.9s 为 17.3%,相邻帧中位 2.98%,JS 侧 4–28ms。
6
+
7
+ **蠕动的点**
8
+ - 所有点的半径乘同一个「从猫出发的行波」:`wave = 0.82 + 0.28·sin(dist·0.012 − 6t)`。
9
+ - 整个房间的点从猫的位置一圈圈胀缩,像在呼吸。这一个函数就让全屏都活了。
10
+
11
+ **点的布置**
12
+ - 墙:大点(30px,间距 104)+小点(10px,错位)两套六角网格,各带 ±25–50% 抖动。每个点是轻微椭圆加随机转角,像手画的。
13
+ - 地板:9 行,越近越大(6→28px)、越疏,压成 0.42 的椭圆做透视。
14
+ - 红裙白点 13px、间距 52,按 46px/s **顺着裙子往下爬**(clip 到裙子剪影,y 偏移取模)。
15
+ - 猫:橘色区白点、白色区红点,各自往下爬。
16
+ - 脸颊上也画了一个红点(草间的身体彩绘),头上是红底白点蝴蝶结。
17
+
18
+ **无限镜屋(窗)**
19
+ - 3D 格子灯:13×7×3,6 色。z 以 0.3/s 循环飞向镜头,透视投影 F150。
20
+ - 每颗灯是实心小核加 3.2 倍光晕,lighter 叠加。
21
+ - 坑:第一版灯随机散布、光晕很大,糊成了散景。规则格子+小实心核才有镜面无限重复的感觉。
22
+
23
+ **黄南瓜**
24
+ - 5 瓣椭圆,绘制顺序是外 → 内。
25
+ - 每瓣按行排黑点:中列最大(9.5px),向两边、上下都缩小,点的大小也跟着行波变。
26
+ - 整体呼吸:缩放 `1 ± 0.025·sin(5t)`,以底部为轴。
27
+
28
+ **结尾「自我消融」**
29
+ - lt 1.0–1.26:红色覆盖层渐显,全屏 120px 六角点阵从猫的位置一圈圈胀到 0.47 倍间距。之后约 0.15s 只剩点阵在轻轻呼吸,给结尾一个落点(审片指出第一版没有停留帧)。
30
+ - 最后一帧停在红底白点的点阵上。
31
+ - 坑:第一版让点无限胀大,结果是白屏。半径必须封顶,最后停在点阵,不能停在纯色。
32
+ - 坑:裙子和墙都是红底白点,少女在画面里会溶解掉。终版把少女轮廓线加到 4.5px,猫白色区域的红点去掉,保住橘白分界。
@@ -0,0 +1,35 @@
1
+ # 22_constructivism · 1924 俄罗斯构成主义海报(罗德琴科 / 李西茨基)
2
+
3
+ > 来源:迁移测试 B(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/22_constructivism.js`。
4
+
5
+ 实验时的文件名:`scenes/c1_constructivism.js`(约 175 行)。每帧中位 5ms;帧差 3.6%。
6
+
7
+ **管线**
8
+ 1. 底版全缓存 `cs_bg`:米白旧纸(`P.texture` `#e9dfc4`,dark `#d9c9a4`)→ 左侧斜黑条(rotate −0.5)、红方块(rotate 0.26)、5 行「正文」黑条 → 右侧细斜线、红圆点、黑竖条里竖排几何字「ЧАЙ」→ 人物头后大黑圆(中心 (1330,395),r 215)→ 斜红地面 (0,905)→(1920,856),上沿一道 12px 黑线 → 窗 → 黑桌(红边、斜撑)→ 黑块凳。
9
+ 2. **窗=照片拼贴**:先在离屏画灰度「照片」(天空渐变 `#5e5e5e→#e8e8e8`、径向白云、暗色厂房剪影、烟囱),再用 `halftone()` 网点化(cell 7,gain 0.8);舒霍夫塔用清晰黑线画在网点上面(五节双曲面,每节两组各 18 条直母线,相位差 ±1.1rad,背面 sin<−0.2 的省掉),这正是「照片+手绘」拼贴。
10
+ 3. **皮肤=网点照片**:脸、颈、手先画灰度渐变(前亮后暗,`#fafafa→#9c9c9c`)到离屏,再网点化(cell 4.6、gain 0.74、45°)。网点下垫米白,外圈先描 7px `#fbf7ea`,这一圈就是照片剪下来的白边。五官用清晰黑笔补,嘴唇手工上红。衣服全是剪纸平涂+3px 黑线;阴影用 `shadeDots()`,在路径内按函数落网点。
11
+
12
+ **关键函数**
13
+ - `halftone(c, src, bx,by,bw,bh, cell, col, gain, ang=π/4)`:在旋转网格上采样 src 灰度,点径 = cell·gain·√(1−L),只落在 alpha>128 处。**所有点并成一条 path、只 fill 一次**。脸部约 3000 点,耗时 <2ms。
14
+ - 几何西里尔字:5×7 模块,每个字母是若干矩形或多边形(Й 的斜笔是四边形,短音符是上方一个小矩形)。**每个部件单独 fill**。
15
+
16
+ **母题动画**
17
+ - 李西茨基红楔刺入黑圆:顶点沿 0.34rad 轴线往返,`70·(0.5−0.5cos(2π·1.6·lt))`。
18
+ - 黑圆外的红虚线环:dash [46,22],`lineDashOffset = −260·lt`。
19
+ - 塔顶无线电波:4 道红弧,`r = 18 + ((1.4lt + k/4) mod 1)·230`,α 和线宽随相位衰减。
20
+ - 地面标语「ПЕЙТЕ ЧАЙ!」:逐字盖章(第 k 个字在 0.045k 秒起跳,0.12s 内从 1.5 倍缩回 1),之后整排波浪跳 `−10·max(0, sin(11lt − 0.8k))`;每第 4 个字是黑字。
21
+ - 头巾两条尾巴 `sin(9lt)·6` 轻摆;杯上热气是三条黑折线上行。
22
+
23
+ **角色**:共青团少女——红头巾(头部局部 13 点,前沿后移到能露出金色刘海,颈后打结两条三角尾)、白衬衫+红领巾三角+红袖口、深灰长裙(网点阴影)。猫用剪纸橙 `#e2741c`+米白,10px 黑条纹,尾巴用虚线描边做虎斑,眼睛是方瞳竖条。
24
+
25
+ **色板**:纸 `#e9dfc4`;红 `#c8231c`/`#8f1711`;黑 `#151311`;米白 `#f4ecd6`;金发 `#e3b03e`/`#a87a1c`;猫橙 `#e2741c`。
26
+
27
+ **坑**
28
+ - 「Й」的短音符第一版画在字格上方(y=−1.7u):竖排时被上一个字母盖住,地面标语里被裙摆盖住,审片读成「ЧАИ」。改成整个字画在 7 格内(И 部分下移 1.7 格),标语也改到角色之上画(海报字压人物)。
29
+ - 「А」第一版用两条反向斜腿+横杠拼在一个 path 里,重叠处被 nonzero 抵消,竖排时读成「В」。改成逐部件 fill。
30
+ - 地面标语第一版基线压在 y=1060,字的下半截出画。按 `translate(x, 990)` 以字中心定位。
31
+ - 颧下阴影第一版太重,网点化之后像一片胡子。灰度源里的阴影 α 要比平涂时低一半。
32
+
33
+ **仍可改进**:罗德琴科更典型的是「人物照片+喇叭形文字锥」。可以把热气换成从杯口放射出的红黑楔形字锥。
34
+
35
+ ---
@@ -0,0 +1,29 @@
1
+ # 23_dali · 1931 达利超现实主义(《记忆的永恒》)
2
+
3
+ > 来源:迁移测试 B(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/23_dali.js`。
4
+
5
+ 实验时的文件名:`scenes/c2_dali.js`(约 235 行)。每帧中位 47ms(首帧 84ms);帧差 4.6%。
6
+
7
+ **管线**
8
+ 1. 底版拆成三张缓存,因为影子必须夹在中间:`dali_bg`(天、海、岩、地)→ 每帧画影子 → `dali_wall`(开窗的断墙残片+枯枝)→ `dali_block`(石块桌+凳)→ 软钟 → 角色。
9
+ 2. **体积填色 `vol(c, path, x0,y0,x1,y1, a, b, occl, blur)`**:线性渐变填充,再在 clip 里用 shadowBlur 描一圈暗边做内阴影。全片无勾线,学院派的圆润感全靠这个。
10
+ 3. **长影子**:把每个物体的剪影用剪切仿射投到地面,`setTransform(1, 0, −kx, ky, kx·yg, yg·(1−ky))`,yg 是该物体的着地线(墙 700、桌/猫 905、人 930)。所有剪影先画进一张离屏(纯黑),再整体以 α 0.55、blur 1.5px 叠上去,避免影子重叠处加深。用 clip 只留地面部分(y > 594)。`kx = 0.85 + 0.6·easeInOut(lt/1.2)`,影子在 1.2s 里明显变长。
11
+ 4. **软钟 `softMap(o, sag)`**:圆盘局部坐标 (u,v) → 屏幕。v ≤ fold 的部分躺在台面上(y 压缩到 0.28–0.32);v > fold 的部分垂下:`X = cx + u·(1 − flare·q)`,`Y = … + d·(0.62 + 0.3·sag) + 中央下垂高斯 + sin 波纹`。外框、表盘、12 个刻度、两根指针(沿映射采样成软线)、折线高光**都走同一个映射**。
12
+
13
+ **关键参数**:`flare = −0.12`,负值让垂下部分像软布一样往外摊开,下缘是圆的;正值会收成冰淇淋筒。drip 0.18–0.4。sag 在 1.2s 内从 0.1 → 1.4:第一版 0.35→1.0,审片说「钟没有明显在淌」。三只钟:窗台 R72、桌沿 R88、枯枝 R64(fold −34,大部分垂下)。指针转速 4.5–6.5 rad/s。
14
+
15
+ **母题动画**:三只软钟持续下垂、指针以不同速度转;地平线上的高跷象(四条细腿相位差 π/2 交替迈步,膝关节 0.52 高度处微弯,身体 14Hz 微颠,背驮方尖碑)每秒左移 70px;9 只蚂蚁绕橙色怀表做椭圆爬行;长影子变长;猫尾巴软化下垂(尾尖 y + q²·34)。
16
+
17
+ **角色**:西班牙少女,浅蓝长裙+白翻领,金发髻,无勾线,体积靠渐变+内阴影,五官是暗褐细线。猫用渐变橙,条纹用 blur 2px 的半透明笔(柔),眼睛用径向渐变;白胸改用平滑椭圆 (606,768) 40×92,不用 `K.white`。
18
+
19
+ **色板**:天 `#22407c → #5f88bd → #e9dcae`;海 `#8aa6b8 → #4f6f86`;岩 `#e8c27a / #9a6a34`;地 `#d2ad70 → #7a5129`;墙 `#f4ead2 → #cdbf9f`;钟金 `#f0d27c / #9a7426`,表盘 `#f6efd6`。
20
+
21
+ **坑**
22
+ - 影子第一版往观众方向投(ky>0 向下),全被画框底边吃掉。太阳要放在左前方低空,影子往右后方躺(y′ = yg − ky·(yg − y))。
23
+ - 影子是投在地上的,必须画在墙和桌子下面,所以底版要拆层,不能一张缓存到底。
24
+ - 软钟 flare>0 加大 drip,就是冰淇淋筒。
25
+ - 这个计数器底色是深蓝天,原来设的深褐色字看不见,改成米白字+深色投影。
26
+
27
+ **仍可改进**:人物还是偏矢量插画,可以加更细的高光和暗部反光;《记忆的永恒》里那个侧卧的软体「自画像」生物可以作为第四个母题。
28
+
29
+ ---
@@ -0,0 +1,30 @@
1
+ # 24_hopper · 1942 霍珀美国现实主义(硬光块面)
2
+
3
+ > 来源:迁移测试 B(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/24_hopper.js`。
4
+
5
+ 实验时的文件名:`scenes/c3_hopper.js`(约 150 行)。每帧中位 13ms(首帧 54ms);帧差 6.0%。
6
+
7
+ **核心手法「双版本裁切」**:同一个 `room(g, K)` 函数按两套色画两张缓存——背光版 `SH`(冷绿墙 `#5d8679`、暗地板 `#5b3d2b`)和受光版 `LT`(暖黄墙 `#efcf8f`、亮地板 `#c98b52`)。每帧先画背光版,再用会移动的光斑多边形 clip 进受光版,光影边缘天然是硬的,还能整体平移。人物和家具同理:`girl(c, K, G)` 用背光色画一遍,再 clip 进斜光带用受光色画一遍。
8
+
9
+ **光斑几何**(dx = 30 − 95·easeInOut(lt/1.25),1.2s 里左移约 95px)
10
+ - 墙上光斑 WP:(1420+dx, 250) → (1920, 470) → (1920, 730) → (1420+dx, 730)
11
+ - 地上光斑 FP:接在墙光斑下面,往右下方展开
12
+ - 人物光带 OP:左缘从 (1345+dx, 0) 到 (1185+dx, 1080)。光边在这一段里扫过少女的脸,从半脸背光到全脸受光
13
+ - 窗棂影:竖条 24px + 一条平行于光斑上沿的斜条
14
+ - **人在墙上的投影** = 人物剪影平移 (+150, +18) 后画进离屏,`source-in` 填进背光底版,再画回光斑区域。效果就是光斑里透出背光墙,和人物姿态同步。
15
+
16
+ **母题动画**:光斑缓慢移动(核心);窗外对街红砖楼(致敬《星期天的清晨》)的理发店旋转柱,红蓝斜纹以 60px/s 上行;卷帘拉绳 `sin(4.2lt)·0.07rad` 轻摆;光带里 26 颗浮尘(只在光边右侧显示);热气。
17
+
18
+ **质感**:油画拖笔用竖向拉长的 fbm(x·0.06, y·0.006)为主、斜向为辅,1/4 分辨率生成后放大,`soft-light` α 0.2。窗外每个窗洞右侧画 10px 硬影,卷帘拉到不同高度(0.25–0.7),这是霍珀的细节。
19
+
20
+ **色板**:背光墙 `#5d8679`、护墙 `#4b6d63`、地 `#5b3d2b`;受光墙 `#efcf8f`、护墙 `#d8ad68`、地 `#c98b52`;裙 背光 `#7a2c2a` / 受光 `#cc4a3c`;金发 背光 `#a8893f` / 受光 `#f3d67e`;砖 `#b4553a`。
21
+
22
+ **坑**
23
+ - 刷痕第一版用横向 fbm、α 0.35,墙面像水纹大理石。霍珀的墙是平的,刷痕只能若有若无。
24
+ - 改代码时把注释插进一行中间,把同一行后半截代码注释掉了(Python 批量替换时注意)。
25
+
26
+ **角色**:第一版是盘发+红长裙,审片说「像成年女性,读不出 17 岁」。改成披肩长发(`hair:'long'`)+一条蓝发带,就年轻了。猫的白胸用平滑椭圆,背光白 `#dcd6c8`(第一版 `#c4bdac` 读成灰白猫)。
27
+
28
+ **仍可改进**:猫全程在阴影里,偏暗(这是孤独感的取舍)。也可以给猫一小块从后窗进来的光。
29
+
30
+ ---
@@ -0,0 +1,55 @@
1
+ # 25_ghibli · 吉卜力视觉家族:整体语言+既有背景实做
2
+
3
+
4
+ ## 2026-10-15 · 整体语言研究(尚待跨场景验证)
5
+
6
+ 先读[跨场景风格提炼](../15-跨场景风格提炼.md)。本卡下半部是一个既有房间场景的工程经验;它证明部分水彩/赛璐璐手法可运行,不代表整个吉卜力体系,也不是新片的构图模板。
7
+
8
+ **先定范围。**《龙猫》《魔女宅急便》《千与千寻》可用于研究不同环境中的人物、手绘背景与生活动作;《辉夜姬物语》有明显不同的线条与留白组织,不能把它强塞进同一水彩背景配方。制作时选与本次内容相符的影片/作者范围,比较不同场所、光照和动作的片段,不只挑森林远景。官方[作品与场面写真](https://www.ghibli.jp/works/)可定位参考;[场面写真发布说明](https://www.ghibli.jp/info/013344/)不等于所有素材取得无限使用许可。
9
+
10
+ **可迁移的研究维度。**①角色剪影、表情与关键动作清楚,背景有自身的观察和材料细节;②角色与环境在透视、光向、接触阴影和色彩上相容,不要求二者涂成同样的水彩纹理;③生活动作有身体重心、使用器物的次序和反应;④环境运动有风、重力、接触等原因;⑤场景同时具有可居住的结构与叙事用途。以上是初始研究归纳,具体影片中不成立的部分要改范围。
11
+
12
+ **内容可变。**绿色森林、乡间住宅、少女、猫、扫帚、美食和巨大云朵都不是必备。题材可以是城市维修间、夜班交通站或虚构设备舱。不能把「生活感」等同固定慢节奏;紧张段落也需要准确行动。
13
+
14
+ **制作假设。**从本次场景的空间与光开始,角色设定独立校比例、轮廓和表情,按10号制作帧库或导入素材,再用代码合成与编排。背景的洗染只是可选材料手段,不把整张人物图乘上纸纹当作完成。现有`scenes/25_ghibli.js`可参考局部背景手法,角色与新空间必须重新设计;复杂转身或交互不能靠同一张图平移代替。
15
+
16
+ **迁移压力测试(待做)。**城市自助洗衣房里找回遗失物;无人物的自动灌溉设施启动;两位成年维修员在太空舱完成紧急修补。三者不是新模板,仅用于检验不依赖森林、少女和慢动作的迁移能力。
17
+
18
+ **回流。**每次记录影片范围、场景、采用路线、图像/动画证据、角色环境一致性与接触问题;旧结论失效先改原句。单场景通过不能替整个工作室评级。当前状态:既有背景实做保持原质量,整体视觉与表演方向仍为研究。
19
+
20
+ ## 既有水彩背景示例(历史实现,不是风格定义)
21
+
22
+ > 来源:迁移测试 B(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/25_ghibli.js`。
23
+
24
+ 实验时的文件名:`scenes/c4_ghibli.js`(约 270 行)。每帧中位 17ms,**首帧 619ms**(水彩底版缓存);帧差 5.1%。
25
+
26
+ **水彩渲染器**
27
+ - `deform(pts, depth, amp, r)`:中点位移。每轮在每条边中点沿法向推一个近似高斯量(3 个均匀数相加),幅度和边长成比例(min(1, len/80)),每轮 amp×0.6。
28
+ - `wash(g, pts, color, {layers, alpha, amp, seed, edge, blend, fill})`:先 deform 3 轮得到基形;每层再 deform 2 轮,用 `multiply` 低 α 填充(透明颜料叠色),并以 α=edge 描一圈 1.6px 同色边。描边逐层叠加,就是颜料在边缘沉积的**水痕边**。fill 可以传渐变(天空、墙)。
29
+ - 常用参数:大面积墙 layers 5、α 0.4、amp 12;色晕 layers 3、α 0.045、amp 40(大幅变形);木板 layers 3、α 0.5、amp 3、edge 0.14;不透明的白(窗框、桌布、云)用 `blend:'source-over'`、α 0.9–0.95。
30
+ - 墙 = 径向渐变洗染(窗边亮 `#fbf3e0` → 角落 `#dcc49a`)+ 28 块大幅变形的透明色晕(暖黄、粉、蓝灰、浅绿交替)+ 两角暗晕。护墙板和地板**逐块**换色调洗染。最后 `multiply` α 0.3 叠一层高频纸纹颗粒。
31
+ - 云:白色不透明圆团(16 个 puff,用 wash 画边)+ `source-atop` 叠底部蓝灰渐变,缓存成精灵。大樟树也是精灵,绕树根转 ±0.025rad。
32
+
33
+ **赛璐璐角色 `cel(c, p, base, shade, dx, dy)`**:先整块填阴影色,再在 clip(p) 里把自身朝光平移 (−dx, −dy) 后填基色,只剩背光侧一道月牙阴影。最后描 2.4px 暖褐线 `#4a3428`。一个函数就是吉卜力式的两色赛璐璐。
34
+
35
+ **母题动画**
36
+ - 白纱窗帘:两幅,下摆鼓起 `q²·(90 + 70·gust)`,gust = 0.55 + 0.45·sin(3.2lt + 相位),再叠 `sin(7lt + 6q)` 小波纹;3 层半透明 wash,固定种子,所以边缘不沸腾。
37
+ - 窗外 360 根草叶:风是一阵一阵的,`wind = 0.5 + 0.5·sin(3.1t − 0.018x)`,相位沿 x 推进,看得出一道风浪扫过草坡。
38
+ - 云飘 22–30px/s;树冠轻摇;墙上 34 个 komorebi 光斑(`screen` 暖黄径向渐变,位置用 noise 漂,亮度 `sin(5t + 1.7i)` 闪);桌上雏菊点头;少女长发被风吹向右后(7 点 smooth,wind 推动);红蝴蝶结飘带抖动;桌布垂边摆动。
39
+
40
+ **角色**:长金发+大红蝴蝶结(致敬魔女宅急便,不复制角色)、青色长裙+白围裙+白袖口;猫是暖橙+米白赛璐璐。背景里靠墙的扫帚是彩蛋。
41
+ **角色的水彩填色**:审片说「背景像,人物不像(扁平矢量)」。把角色先画进离屏 L,另起纹理层 M(纸纹颗粒 α 0.8 + 40 块透明色晕 `charBloom`,α 0.1、amp 16),M 用 `destination-in` 按 L 的剪影裁掉,再以 `multiply` 叠回画面。线色从 `#4a3428` 调软到 `#6a4a38`。
42
+ **窗帘**:审片说不飘。gust 频率 3.2 → 5.4,鼓起 `q²·(60 + 150·gust)`。
43
+
44
+ **坑**
45
+ - 色晕 α 0.07×4 层、颗粒 multiply 0.5 时,墙面像发霉的旧羊皮纸。吉卜力的房间是亮的:色晕 α 降到 0.045×3 层,渐变整体提亮一档。
46
+ - 第一版用两个矩形 wash 拼墙(右侧更暗),x≈1100 出现硬接缝。暗部要用大幅变形的多边形(amp 60),不能用矩形。
47
+
48
+ **仍可改进**:人物还是平面,可以加吉卜力式的发丝高光块;地上的光斑里可以加窗帘影子的流动。
49
+
50
+ ---
51
+
52
+
53
+ ### 2026-10-15 · 新场景工程试作
54
+
55
+ 新增`54_ghibli_lab`临街修车铺,电车驶过、器物与环境微动;用`render.py --film style_studies --solo 54_ghibli_lab --from 0 --to 6`运行。代码与原25房间分开。确定性与解码通过,独立审片未见阻碍本轮研究展示的技术红项;仍偏程序化插画,未达到工作室影片级辨识度,也未做跨场景验证。
@@ -0,0 +1,27 @@
1
+ # 26_vaporwave · 2011 蒸汽波 / 赛博霓虹
2
+
3
+ > 来源:迁移测试 B(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/26_vaporwave.js`。
4
+
5
+ 实验时的文件名:`scenes/c5_vaporwave.js`(约 210 行)。审片红灯:上衣第一版是粉色,和粉调肤色混成一片,读起来像没穿衣服。改成薰衣草紫风衣 `#8f7cf6`+白三角领+青色拉链线。每帧中位 49ms;帧差 25%(VHS 后期让全屏都在动)。
6
+
7
+ **管线**:整幅先画进离屏 S,再做 VHS 后期输出到 c(计数器由引擎画在最上层,不受色差影响)。
8
+ 1. 墙:深紫纵向渐变 `#0d0322 → #4a0f6a` + 窗口处洋红径向光、招牌处青色径向光。墙脚一条青色灯带。
9
+ 2. **`glowLine(c, col, w, blur)`**:同一路径先用 shadowBlur 描粗的辉光,再描 2–3px 近白芯线,就是霓虹灯管。
10
+ 3. 窗里落日:太阳是黄 → 橙 → 洋红竖向渐变,用 `destination-out` 切 7 条横缝,缝宽随深度变大(2 + q²·16),整体以 0.9/s 上移。地平线是线框山(洋红辉光),下面是青色透视网格往观众方向滚,左右棕榈剪影摇。
11
+ 4. 地面:洋红透视网格,消失点 (960,600),横线 `y = 600 + 520/d`、d = k + 1 − phase(phase = 1.3t mod 1),线宽随近处加粗。
12
+ 5. **霓虹招牌「カフェ」用折线自己画灯管**(不依赖字体):每个假名 1–3 笔,(u,v) 单位坐标。逐字按帧哈希闪:`hash(floor(30t), k) < 0.07` 灭;「フ」额外在 `f mod 17 < 5` 时 22% 概率灭,灭时画暗紫灯管。
13
+ 6. Win95 对话框 TEA.EXE:灰体、海军蓝渐变标题栏、进度块 `3 + 14lt` 格、百分比 `18 + 70lt`。桌上大理石胸像(侧脸剪影 22 点、紫灰渐变+静脉线+粉色轮廓光+墨镜梗)。
14
+ 7. 角色:粉毛衣、青色百褶长裙、金发+粉发圈。辉光轮廓「朝窗一侧粉、背面青」:同一组路径描两次,分别 clip 在左右半屏。
15
+
16
+ **VHS 后期 `vhs(c, S, t, lt)`**
17
+ - RGB 分离:对每个通道,把 S 画进临时画布、`multiply` 纯色 `#ff0000/#00ff00/#0000ff` 取出单通道,再以 `lighter` 错位合成到黑底。错位量 3 + 1.5sin(7t),偶发(hash<0.12)+6。
18
+ - 跟踪噪声带:70px 高,`(520lt + 200) mod (H+160)` 下滚。带内每 6px 一条横向错位 `±30·sin(πy/bh)`,叠 90 条白灰噪线。
19
+ - 扫描线:4×4 tile pattern(第 0 行 α 0.28、第 2 行 α 0.12)。OSD:PressStart2P「PLAY」+手画 ▶(字体里没有这个字形),16 帧一闪;左下日期、时间码按 lt 走。
20
+
21
+ **色板**:洋红 `#ff4fd8`、热粉 `#ff2f8f`、青 `#3ff6ff`、深紫 `#12052a / #2a0b4a`、日黄 `#ffd84a`、橙 `#ff8a3a`。
22
+
23
+ **坑**
24
+ - 全角「VAPORWAVE」、▶、日文在 `lib/fonts` 里都没有,会静默回退系统字体。标签改用半角+字距 7,▶ 和假名都自己画。
25
+ - 人物描边用的是部件路径,腰线、手臂和躯干的交界也会发光。霓虹线稿能接受,但想要纯外轮廓,得先把剪影画进离屏,再描离屏的边缘。
26
+
27
+ ---
@@ -0,0 +1,30 @@
1
+ # 27_kirby · 1966 漫威银河时代(Jack Kirby + 四色胶印)
2
+
3
+ > 来源:迁移测试 C(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/27_kirby.js`。
4
+
5
+ 实验时的文件名:`scenes/k1_kirby.js`(255 行)。每帧约 20ms,帧差 7.5%。
6
+
7
+ **管线:同一份几何画两遍**
8
+ 1. **色版层**:纸 `#f4ecd6` + 平涂 + 本戴网点。墙浅蓝底上铺 C 网点(pitch 9、r 2.7、15°),地板深蓝底上铺紫网点(pitch 9、r 3.2、75°),皮肤是红点(pitch 7、r 1.5、75°)。**整层 `drawImage(color, 4, 3)`=套色不准**。
9
+ 2. **墨线层**:白底,每个部件「白填 → 阴影 → 黑描边 6px」。合成时 `multiply` 叠在色版上,白色=透明。逐部件填白会盖掉前面部件的线,所以只剩看得见的线,不需要 visibleLines。
10
+ 3. **Kirby 的黑块阴影+羽化排线(spotted blacks+feathering)**:光从窗来(LIGHT=(-0.86,-0.5))。
11
+ - 黑月牙:`path ∩ ¬translate(path, LIGHT·d1)`,d1=14。做法是先 `clip(path)`,再用「全屏矩形+平移后的 path」做 `clip(…,'evenodd')`,最后 fillRect 黑。
12
+ - 羽化带:同样的取法,用 d2=30 得到一条带,带里画沿光方向的平行线(间距 9px、线宽 2.6)。
13
+ - 参数(d1/d2):裙 16/34、躯干 14/30、袖 10/22、头发 12/26、猫身 16/34、桌面 10/18。
14
+ - 一个函数就能给任意 Path2D 打 Kirby 式阴影。
15
+
16
+ **母题动画**
17
+ - **Kirby krackle**:一簇 16–26 个黑圆。距离按 `R·rnd^0.7` 分布,越靠中心越大(`R·(0.05+0.2·(1-d/R))`),12fps 换种子,半径按 `sin(18t+i)` 脉动。6 簇沿窗外 S 形能量流移动(`(k/6+0.42t)%1`),能量流是橙边黄芯带+锯齿墨边。热气也用 krackle(4 簇小的往上飘)。
18
+ - **速度线**:端杯速度 `|sin(min(1,lt/0.9)π)|`,在杯底往下拖 9 根黑线,长 70–180·v,12fps 抖;肘后两道动作弧。
19
+ - **拟声大字 SLURRP!**:lt 0.52 起 `outBack` 弹出,用 `Bangers-400` 132px(×0.82);黑色挤出 7 层(每层偏移 (0.8d,d))做出 Kirby 的立体积木字;红字上面 46px 带 clip 成黄(双色字);底是 26 尖黄爆炸框;12fps ±3px 抖。
20
+ - **分格**:主格 24..1534,右侧一格是猫脸特写,瞳孔随 `cup` 上移(`lerp(14,-18,cup)`)、往左看。背景是品红底+黄网点+44 根聚焦黑三角(12fps 换)+头周围 6 簇 krackle。底部旁白框「BUT THE CAT IS WATCHING!」,左上旁白框「MEANWHILE, AT TEA TIME...」。计数器做成黄底黑框、带黑色错位投影的旁白框,放在右上格缝里。
21
+
22
+ **角色**:60 年代红色 A 字长裙、白色彼得潘领(两个椭圆)、前襟三颗黑纽扣、黑发箍(头部旋转坐标系里的椭圆弧,线宽 11)、外翻发尾(在 `skirt` 钩子里画,位于躯干后面)。椅子是 Saarinen 郁金香椅。
23
+
24
+ **坑**
25
+ - 拟声字一开始放在 (1000,300) 满尺寸,压住了窗和少女的脸。挪到 (990,318) 并缩到 0.82。
26
+ - 猫特写右侧的大黑椭圆让猫像玳瑁猫,改成贴边的窄月牙。
27
+ - 行星环要拆成后半弧(先画)和前半弧(后画),不然环会穿过星球。
28
+ - **仍可改进**:画面偏「干净的波普漫画」,还缺 Kirby 那种方块化的手指、更夸张的透视和肌肉张力。
29
+
30
+ ---
@@ -0,0 +1,39 @@
1
+ # 28_monet · 1899 莫奈《睡莲》+《日本桥》
2
+
3
+ > 来源:迁移测试 C(只读 skill 的独立 agent 实做,2026-10-04)。场景代码由整合后移植到 `scripts/engine/scenes/28_monet.js`。
4
+
5
+ 实验时的文件名:`scenes/k2_monet.js`(176 行)。每帧约 105ms,帧差 30%(主要是水面沸腾)。
6
+
7
+ **构图**:墙=橘园式睡莲壁画(整面水面),窗=绿色日本桥(拱桥+紫藤+池水),窗两侧是吉维尼的绿百叶,少女坐在壁画前。
8
+
9
+ **管线(09 标杆结构)**
10
+ 1. 底稿 `moBase`,每帧重画,因为睡莲在漂、柳影在晃。
11
+ - 水面:竖向渐变 `#b9c7e6→#8fa6d6→#6c84bf→#5a72a8`,加 4 片浅粉黄的天光倒影。
12
+ - 柳影:5 条竖带,边缘 `sin(0.03y−3.2t+k)·14` 横向波动。
13
+ - 睡莲:10 丛、共约 100 片缺口椭圆(rx 38–78、ry 12–21),40% 带粉/白花。
14
+ 2. 笔触 4 遍:
15
+ - 水面:cell 9、len 34、w 6.5,**横向** angle≈0±0.06,boil 6。
16
+ - 窗景:cell 6、len 13、w 4.5,上半斜笔、下半横笔,boil 6。
17
+ - 地板:cell 12、len 34、w 8,**boil 0**。
18
+ - 窗框/百叶:cell 6、竖横各一,boil 0。
19
+ - 所有遍 outline 0(印象派不勾边)。
20
+ 3. **桥单独成层**:底稿里先在桥后面铺一块深色树荫衬底 `#24452a`;桥本身用 `#3f8a62` 粗线(20px)衬底、`#8fdcae` 亮线描出。笔触用 cell 5、浅蓝绿 5 色板。不这样做的话,桥会被树叶色板吞掉,完全看不见。
21
+ 4. 区域色板:
22
+ - 水 `#5b6fb5 #7d8fd0 #9db5e0 #6aa0a8 #b7a6d8 #d9c8e8 #8fb8a8 #a6c4e8 #c8b0d8`(mix .45)
23
+ - 叶 `#5f8f4a #7fae5a #3f6f4a #9cc070 #6f9a7a #b4cc78`
24
+ - 粉 `#f0a0b8 #f7d0dc #fff2f4 #e88aa0`
25
+ - 地板 `#c69a6a #b07a5a #d8b08a #9a6a7a #8a7aa8 #e0bc90`
26
+ 5. 角色:fill 模式平涂 → source-atop 细笔触(cell 6、len 12,白裙从 `#fbf8f2 #e4e0f6 #cfd2ee #f8ecd0 #d8e8f2` 里抽色)→ **色彩阴影**:受光侧叠暖黄 α.22、背光侧叠紫 α.32 的线性渐变(source-atop)→ 只补五官,用 `#5a4f8a` 细线。
27
+
28
+ **母题动画**
29
+ - **水面光斑颤动**:160 根亮色横短笔(`#fffbe8 #fdf0d0 #f8e0ec #e8f4ff`)。亮度 `clamp(sin(t·(5..11)+φ)·sin(2.3t+i))`,10fps 横向跳 ±5px。
30
+ - 睡莲漂 `x+sin(1.3t+φ)·7+6t`,柳影波动,3 处涟漪(虚线椭圆 ry=rx·0.22,外扩并淡出)。
31
+ - 紫藤:12 串垂花,每串 9 个由大到小的淡紫色点,按 `sin(2.4t+0.9i)·8` 摆。草帽蓝丝带飘。
32
+
33
+ **角色**:1899 白色夏裙,高领、泡泡袖(肩部椭圆)、浅蓝腰带,RIG 草帽涂成 `#ecd28a`。
34
+ **坑**
35
+ - 全屏 6fps 沸腾时帧差 47%,满屏都是噪声。
36
+ - 紫藤第一版用粗线条,画出来像光滑的药丸,改成点列。
37
+ - 计数器放在笔触底上看不清,要加 blur 18 的奶白光晕。
38
+
39
+ ---