@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.
- package/bin/server.mjs +575 -0
- package/data/styles.json +533 -0
- package/engine/audit_clip.py +46 -0
- package/engine/clip.html +24 -0
- package/engine/clip.js +104 -0
- package/engine/clip_schema.json +19 -0
- package/engine/clips/t1_3b1b.js +203 -0
- package/engine/clips/t2_keynote_ui.js +347 -0
- package/engine/clips/t3_finance_chart.js +206 -0
- package/engine/clips/y1_kurzgesagt.js +183 -0
- package/engine/clips/y2_vox.js +150 -0
- package/engine/clips/y3_whiteboard.js +209 -0
- package/engine/clips/y4_storytime.js +194 -0
- package/engine/clips/y5_kinetic_type.js +134 -0
- package/engine/compare.py +19 -0
- package/engine/demos/_shared/hero/c1_0.png +0 -0
- package/engine/demos/_shared/hero/c1_1.png +0 -0
- package/engine/demos/_shared/hero/c1_2.png +0 -0
- package/engine/demos/_shared/hero/c3_line.png +0 -0
- package/engine/demos/_shared/hero.js +96 -0
- package/engine/demos/long_scroll/eras.js +23 -0
- package/engine/demos/long_scroll/frames/8bit_act/01.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_act/02.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_act/03.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_act/04.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_act/05.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_act/06.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_act/07.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_act/08.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_act/meta.json +69 -0
- package/engine/demos/long_scroll/frames/8bit_walk/01.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_walk/02.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_walk/03.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_walk/04.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_walk/05.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_walk/06.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_walk/07.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_walk/08.png +0 -0
- package/engine/demos/long_scroll/frames/8bit_walk/meta.json +69 -0
- package/engine/demos/long_scroll/frames/egypt_dodge/01.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_dodge/02.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_dodge/03.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_dodge/04.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_dodge/05.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_dodge/06.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_dodge/07.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_dodge/08.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_dodge/meta.json +69 -0
- package/engine/demos/long_scroll/frames/egypt_walk8/01.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_walk8/02.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_walk8/03.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_walk8/04.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_walk8/05.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_walk8/06.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_walk8/07.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_walk8/08.png +0 -0
- package/engine/demos/long_scroll/frames/egypt_walk8/meta.json +69 -0
- package/engine/demos/long_scroll/frames/monet_throw/01.png +0 -0
- package/engine/demos/long_scroll/frames/monet_throw/02.png +0 -0
- package/engine/demos/long_scroll/frames/monet_throw/03.png +0 -0
- package/engine/demos/long_scroll/frames/monet_throw/04.png +0 -0
- package/engine/demos/long_scroll/frames/monet_throw/05.png +0 -0
- package/engine/demos/long_scroll/frames/monet_throw/06.png +0 -0
- package/engine/demos/long_scroll/frames/monet_throw/07.png +0 -0
- package/engine/demos/long_scroll/frames/monet_throw/08.png +0 -0
- package/engine/demos/long_scroll/frames/monet_throw/meta.json +71 -0
- package/engine/demos/long_scroll/frames/monet_walk/01.png +0 -0
- package/engine/demos/long_scroll/frames/monet_walk/02.png +0 -0
- package/engine/demos/long_scroll/frames/monet_walk/03.png +0 -0
- package/engine/demos/long_scroll/frames/monet_walk/04.png +0 -0
- package/engine/demos/long_scroll/frames/monet_walk/05.png +0 -0
- package/engine/demos/long_scroll/frames/monet_walk/06.png +0 -0
- package/engine/demos/long_scroll/frames/monet_walk/07.png +0 -0
- package/engine/demos/long_scroll/frames/monet_walk/08.png +0 -0
- package/engine/demos/long_scroll/frames/monet_walk/meta.json +71 -0
- package/engine/demos/long_scroll/lib/acts.js +87 -0
- package/engine/demos/long_scroll/lib/crossing.js +463 -0
- package/engine/demos/long_scroll/lib/world.js +143 -0
- package/engine/demos/long_scroll/lib/xing2_ding.js +42 -0
- package/engine/demos/long_scroll/lib/xing2_jia.js +114 -0
- package/engine/demos/long_scroll/lib/xing2_yi.js +133 -0
- package/engine/demos/long_scroll/segments/02_egypt.js +234 -0
- package/engine/demos/long_scroll/segments/14_8bit.js +118 -0
- package/engine/demos/long_scroll/segments/28_monet.js +86 -0
- package/engine/demos/t1_3b1b/eras.js +11 -0
- package/engine/demos/t1_3b1b/t1_s1.js +101 -0
- package/engine/demos/t1_3b1b/t1_s2.js +74 -0
- package/engine/demos/t1_3b1b/t1_s3.js +65 -0
- package/engine/demos/t2_keynote_ui/eras.js +10 -0
- package/engine/demos/t2_keynote_ui/t2_s1.js +57 -0
- package/engine/demos/t2_keynote_ui/t2_s2.js +70 -0
- package/engine/demos/t2_keynote_ui/t2_s3.js +61 -0
- package/engine/demos/t3_finance_chart/eras.js +11 -0
- package/engine/demos/t3_finance_chart/t3_s1.js +48 -0
- package/engine/demos/t3_finance_chart/t3_s2.js +42 -0
- package/engine/demos/t3_finance_chart/t3_s3.js +51 -0
- package/engine/demos/y1_kurzgesagt/eras.js +10 -0
- package/engine/demos/y1_kurzgesagt/kurzgesagt.js +347 -0
- package/engine/demos/y2_vox/eras.js +10 -0
- package/engine/demos/y2_vox/vox.js +240 -0
- package/engine/demos/y3_whiteboard/eras.js +10 -0
- package/engine/demos/y3_whiteboard/whiteboard.js +162 -0
- package/engine/demos/y4_storytime/eras.js +14 -0
- package/engine/demos/y4_storytime/s1_desk.js +18 -0
- package/engine/demos/y4_storytime/s2_screen.js +82 -0
- package/engine/demos/y4_storytime/s3_react.js +39 -0
- package/engine/demos/y4_storytime/s4_wide.js +16 -0
- package/engine/demos/y4_storytime/s5_close.js +18 -0
- package/engine/demos/y4_storytime/story.js +25 -0
- package/engine/demos/y4_storytime/vo_env.js +2 -0
- package/engine/demos/y4_storytime/world.js +73 -0
- package/engine/demos/y5_kinetic_type/eras.js +16 -0
- package/engine/demos/y5_kinetic_type/k1_title.js +38 -0
- package/engine/demos/y5_kinetic_type/k2_complete.js +55 -0
- package/engine/demos/y5_kinetic_type/k3_chat.js +47 -0
- package/engine/demos/y5_kinetic_type/k4_agent.js +49 -0
- package/engine/demos/y5_kinetic_type/kinetic.js +52 -0
- package/engine/engine.js +277 -0
- package/engine/eras.js +60 -0
- package/engine/eras_gallery.js +115 -0
- package/engine/eras_style_studies.js +20 -0
- package/engine/examples/assets/K/347/272/277/345/233/276_/346/250/252/345/261/217.png +0 -0
- 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
- package/engine/examples/assets//347/273/210/347/253/257_sum/346/261/202/345/222/214.png +0 -0
- package/engine/examples/assets//350/220/245/346/224/266/345/233/276_/347/253/226/345/261/217.png +0 -0
- 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
- package/engine/examples/t1_3b1b.json +19 -0
- package/engine/examples/t2_fullbleed_pulse.json +15 -0
- package/engine/examples/t2_keynote_ui.json +15 -0
- package/engine/examples/t3_finance_chart.json +29 -0
- package/engine/examples/y1_kurzgesagt.json +16 -0
- package/engine/examples/y2_vox.json +14 -0
- package/engine/examples/y3_whiteboard.json +17 -0
- package/engine/examples/y4_storytime.json +52 -0
- package/engine/examples/y5_kinetic_type.json +14 -0
- package/engine/index.html +42 -0
- package/engine/lib/THREE_LICENSE.txt +21 -0
- package/engine/lib/brush.js +149 -0
- package/engine/lib/camera.js +99 -0
- package/engine/lib/chart.js +152 -0
- package/engine/lib/collage.js +97 -0
- package/engine/lib/diagram.js +264 -0
- package/engine/lib/finish.js +70 -0
- package/engine/lib/fonts/AlfaSlabOne-400.woff +0 -0
- package/engine/lib/fonts/Anton-400.woff +0 -0
- package/engine/lib/fonts/ArchivoBlack-400.woff +0 -0
- package/engine/lib/fonts/Bangers-400.woff +0 -0
- package/engine/lib/fonts/Caveat-600.woff +0 -0
- package/engine/lib/fonts/Cinzel-400.woff +0 -0
- package/engine/lib/fonts/Cinzel-700.woff +0 -0
- package/engine/lib/fonts/CormorantGaramond-500.woff +0 -0
- package/engine/lib/fonts/CormorantGaramond-500i.woff +0 -0
- package/engine/lib/fonts/CormorantGaramond-700.woff +0 -0
- package/engine/lib/fonts/EBGaramond-400.woff +0 -0
- package/engine/lib/fonts/EBGaramond-400i.woff +0 -0
- package/engine/lib/fonts/EBGaramond-600.woff +0 -0
- package/engine/lib/fonts/Exo2-800i.woff +0 -0
- package/engine/lib/fonts/GochiHand-400.woff +0 -0
- package/engine/lib/fonts/IMFellEnglish-400.woff +0 -0
- package/engine/lib/fonts/IMFellEnglish-400i.woff +0 -0
- package/engine/lib/fonts/Inter-var.woff +0 -0
- package/engine/lib/fonts/JosefinSans-700.woff +0 -0
- package/engine/lib/fonts/Kalam-700.woff +0 -0
- package/engine/lib/fonts/LICENSES.md +40 -0
- package/engine/lib/fonts/LXGWWenKai-500.woff +0 -0
- package/engine/lib/fonts/LibreBaskerville-400.woff +0 -0
- package/engine/lib/fonts/LibreBaskerville-700.woff +0 -0
- package/engine/lib/fonts/LilitaOne-400.woff +0 -0
- package/engine/lib/fonts/Marcellus-400.woff +0 -0
- package/engine/lib/fonts/NotoSansSC-500.woff +0 -0
- package/engine/lib/fonts/NotoSansSC-700.woff +0 -0
- package/engine/lib/fonts/NotoSansSC-800.woff +0 -0
- package/engine/lib/fonts/NotoSansSC-900.woff +0 -0
- package/engine/lib/fonts/NotoSansSC-sub.woff +0 -0
- package/engine/lib/fonts/NotoSerifJP-600.woff +0 -0
- package/engine/lib/fonts/NotoSerifSC-sub.woff +0 -0
- package/engine/lib/fonts/OFL.txt +94 -0
- package/engine/lib/fonts/PlayfairDisplay-400i.woff +0 -0
- package/engine/lib/fonts/PlayfairDisplay-700.woff +0 -0
- package/engine/lib/fonts/PlayfairDisplay-700i.woff +0 -0
- package/engine/lib/fonts/Poppins-600.woff +0 -0
- package/engine/lib/fonts/Poppins-700.woff +0 -0
- package/engine/lib/fonts/Poppins-800.woff +0 -0
- package/engine/lib/fonts/PressStart2P-400.woff +0 -0
- package/engine/lib/fonts/Righteous-400.woff +0 -0
- package/engine/lib/fonts/RobotoCondensed-var.woff +0 -0
- package/engine/lib/fonts/Rye-400.woff +0 -0
- package/engine/lib/fonts/UnifrakturMaguntia-400.woff +0 -0
- package/engine/lib/fonts/cmunrm.woff +0 -0
- package/engine/lib/fonts/cmunti.woff +0 -0
- package/engine/lib/fonts/index.json +1 -0
- package/engine/lib/fonts.js +56 -0
- package/engine/lib/kit.js +91 -0
- package/engine/lib/media.js +118 -0
- package/engine/lib/medium.js +258 -0
- package/engine/lib/motion.js +111 -0
- package/engine/lib/paint.js +200 -0
- package/engine/lib/palettes.js +57 -0
- package/engine/lib/post.js +108 -0
- package/engine/lib/render.js +189 -0
- package/engine/lib/rig.js +390 -0
- package/engine/lib/rig_huashu.js +171 -0
- package/engine/lib/three.min.js +7 -0
- package/engine/lib/toon.js +186 -0
- package/engine/lib/typo.js +136 -0
- package/engine/lib/ui.js +141 -0
- package/engine/lib/util.js +92 -0
- package/engine/render.py +157 -0
- package/engine/scenes/01_cave.js +364 -0
- package/engine/scenes/02_egypt.js +524 -0
- package/engine/scenes/03_greek.js +448 -0
- package/engine/scenes/04_roman.js +555 -0
- package/engine/scenes/05_gothic.js +522 -0
- package/engine/scenes/06_renaissance.js +338 -0
- package/engine/scenes/08_impressionism.js +206 -0
- package/engine/scenes/09_postimp.js +183 -0
- package/engine/scenes/10_nouveau.js +334 -0
- package/engine/scenes/11_cubism.js +265 -0
- package/engine/scenes/12_bauhaus.js +214 -0
- package/engine/scenes/13_pop.js +269 -0
- package/engine/scenes/14_8bit.js +238 -0
- package/engine/scenes/15_raytrace.js +300 -0
- package/engine/scenes/16_2026.js +565 -0
- package/engine/scenes/17_ink.js +273 -0
- package/engine/scenes/18_klimt.js +227 -0
- package/engine/scenes/19_munch.js +153 -0
- package/engine/scenes/20_dunhuang.js +215 -0
- package/engine/scenes/21_kusama.js +124 -0
- package/engine/scenes/22_constructivism.js +205 -0
- package/engine/scenes/23_dali.js +221 -0
- package/engine/scenes/24_hopper.js +150 -0
- package/engine/scenes/25_ghibli.js +251 -0
- package/engine/scenes/26_vaporwave.js +191 -0
- package/engine/scenes/27_kirby.js +255 -0
- package/engine/scenes/28_monet.js +176 -0
- package/engine/scenes/29_seurat.js +104 -0
- package/engine/scenes/30_matisse.js +151 -0
- package/engine/scenes/31_haring.js +109 -0
- package/engine/scenes/32_rembrandt.js +217 -0
- package/engine/scenes/33_rubberhose.js +219 -0
- package/engine/scenes/34_shadowpuppet.js +195 -0
- package/engine/scenes/35_shinkai.js +197 -0
- package/engine/scenes/36_picasso_blue.js +123 -0
- package/engine/scenes/38_giotto.js +133 -0
- package/engine/scenes/39_piero.js +53 -0
- package/engine/scenes/40_raphael.js +96 -0
- package/engine/scenes/41_michelangelo.js +112 -0
- package/engine/scenes/42_guardi.js +70 -0
- package/engine/scenes/43_lorenzetti.js +145 -0
- package/engine/scenes/44_cortona.js +86 -0
- package/engine/scenes/45_renoir.js +86 -0
- package/engine/scenes/46_pissarro.js +82 -0
- package/engine/scenes/47_sisley.js +94 -0
- package/engine/scenes/48_gauguin.js +107 -0
- package/engine/scenes/49_chagall.js +60 -0
- package/engine/scenes/50_ma_yuan.js +131 -0
- package/engine/scenes/51_persian_miniature.js +149 -0
- package/engine/scenes/52_south_park.js +105 -0
- package/engine/scenes/53_pixar.js +60 -0
- package/engine/scenes/54_ghibli_lab.js +68 -0
- package/engine/scenes/55_dunhuang.js +161 -0
- package/engine/scenes/index.js +28 -0
- package/engine/spec_assets.py +76 -0
- package/engine/transitions.js +929 -0
- package/engine//346/227/266/344/273/243/344/275/234/350/200/205/350/247/204/350/214/203.md +49 -0
- package/lib/host.mjs +754 -0
- package/lib/render-bridge.mjs +543 -0
- package/lib/render-cli.mjs +98 -0
- package/lib/storyboard-lint.mjs +54 -0
- package/manifest.json +52 -0
- package/package.json +8 -4
- package/runtime/package.json +8 -0
- package/skills/biuart/SKILL.md +154 -0
- package/skills/biuart/references/01-/346/213/206/350/247/243.md +55 -0
- package/skills/biuart/references/02-/346/234/272/345/210/266.md +41 -0
- 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
- package/skills/biuart/references/04-/347/272/257/344/273/243/347/240/201/347/273/230/345/210/266.md +92 -0
- package/skills/biuart/references/05-/350/212/202/345/245/217/344/270/216/351/205/215/344/271/220.md +19 -0
- 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
- package/skills/biuart/references/07-/346/255/243/351/235/242/347/273/217/351/252/214.md +196 -0
- 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
- 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
- package/skills/biuart/references/10-/350/247/222/350/211/262.md +34 -0
- package/skills/biuart/references/11-/351/225/277/345/215/267/347/251/277/350/266/212/347/211/207.md +43 -0
- 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
- 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
- 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
- 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
- package/skills/biuart/references/about-author.md +99 -0
- package/skills/biuart/references/capabilities.md +91 -0
- package/skills/biuart/references/compatibility.md +34 -0
- package/skills/biuart/references/images.md +97 -0
- package/skills/biuart/references/voice-model-review.md +18 -0
- package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/t1_3b1b.md +122 -0
- package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/t2_keynote_ui.md +117 -0
- package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/t3_finance_chart.md +116 -0
- package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y1_kurzgesagt.md +193 -0
- package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y2_vox.md +195 -0
- package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y3_whiteboard.md +190 -0
- package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y4_storytime.md +166 -0
- package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y5_kinetic_type.md +158 -0
- package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y6_presenter_explainer.md +24 -0
- package/skills/biuart/references//345/217/243/346/222/255API.md +125 -0
- package/skills/biuart/references//350/211/262/346/235/277.md +38 -0
- package/skills/biuart/references//350/247/222/350/211/262/347/262/276/347/273/206/345/272/246.md +61 -0
- package/skills/biuart/references//351/225/234/345/244/264/350/241/250/346/250/241/346/235/277.md +80 -0
- package/skills/biuart/references//351/225/234/345/244/264/350/257/255/350/250/200.md +73 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/01_cave.md +46 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/02_egypt.md +64 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/03_greek.md +50 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/04_roman.md +99 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/05_gothic.md +32 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/06_renaissance.md +41 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/08_impressionism.md +34 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/09_postimp.md +17 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/10_nouveau.md +31 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/11_cubism.md +30 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/12_bauhaus.md +30 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/13_pop.md +29 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/14_8bit.md +27 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/15_raytrace.md +32 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/16_2026.md +55 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/17_ink.md +50 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/18_klimt.md +37 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/19_munch.md +42 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/20_dunhuang.md +49 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/21_kusama.md +32 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/22_constructivism.md +35 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/23_dali.md +29 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/24_hopper.md +30 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/25_ghibli.md +55 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/26_vaporwave.md +27 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/27_kirby.md +30 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/28_monet.md +39 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/29_seurat.md +31 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/30_matisse.md +26 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/31_haring.md +22 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/32_rembrandt.md +29 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/33_rubberhose.md +31 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/34_shadowpuppet.md +40 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/35_shinkai.md +34 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/36_picasso_blue.md +25 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/37_rick_morty.md +48 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/38_giotto.md +67 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/39_piero.md +59 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/40_raphael.md +65 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/41_michelangelo.md +65 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/42_guardi.md +65 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/43_lorenzetti.md +69 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/44_cortona.md +66 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/45_renoir.md +66 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/46_pissarro.md +66 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/47_sisley.md +67 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/48_gauguin.md +66 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/49_chagall.md +59 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/50_ma_yuan.md +68 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/51_persian_miniature.md +66 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/52_south_park.md +65 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/53_pixar.md +61 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/55_dunhuang.md +41 -0
- package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/INDEX.md +89 -0
- 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
- 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
- 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
- package/studio/app.js +380 -0
- package/studio/assert-panel-permit.mjs +67 -0
- package/studio/composer.css +465 -0
- package/studio/composer.js +480 -0
- package/studio/index.html +97 -0
- package/studio/optimize-prompt.mjs +84 -0
- package/studio/optimize-prompt.test.mjs +47 -0
- package/studio/recipes.mjs +87 -0
- package/studio/select-menu.js +450 -0
- package/studio/styles.css +71 -0
- package/studio/to-english-prompt.mjs +149 -0
- package/studio/to-english-prompt.test.mjs +72 -0
- package/README.md +0 -3
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 01_cave · 40,000 BC 洞穴岩画(纯代码)
|
|
2
|
+
|
|
3
|
+
文件:`scenes/01_cave.js`(约 330 行)。最终性能:warm max 22ms / mean 21.1ms,cold(建缓存)在引擎 boot 时完成;确定性通过;0.2↔0.7s 运动差分 3.9% 像素。
|
|
4
|
+
|
|
5
|
+
## 管线
|
|
6
|
+
1. **岩壁(全部缓存,`cave_relief`/`cave_bg`)**
|
|
7
|
+
- 半分辨率 960×540 算高度场:`fbm(x·0.0022,4oct)·1.0 + fbm(x·0.011,3oct)·0.16 + noise(x·0.05)·0.03`(坐标用全分辨率像素)。
|
|
8
|
+
- 有限差分×52 得法线,光源 L=(-0.55,-0.62,0.56)(左上),`shade = clamp(0.5+(dot-0.56)·0.9)`;底色在 `#ce925a`(亮赭)/`#6e4426`(暗)/`#b6643a`(红斑) 之间用两层低频 fbm 混,再 ×(0.72+shade·0.55)。放大到全屏用平滑插值 → 起伏柔和。
|
|
9
|
+
- 叠两层 `P.grain`(暗 0.22 密度 α0.32、亮 0.10 α0.28)出颗粒;10 条随机游走裂缝(每步转角 ±0.45rad、步长 14–40px、12% 概率分叉),深线下面垫一条 +1.6px 偏移的亮线 → 刻痕感。
|
|
10
|
+
- 暗角:径向渐变 r 260→1180,外圈 α0.8;中心静态暖光用 lighter(α0.36)只照亮岩壁。
|
|
11
|
+
- **踩坑:relief 的中频项系数一大(0.35、×60 法线)整面墙就成了迷彩/沙丘,人物叠上贴图后像迷彩服**。中频降到 0.16、法线 ×52 后才像岩面。
|
|
12
|
+
2. **「颜料吃进岩石」**
|
|
13
|
+
- 所有图形统一画法 `shape()`:先用 **fuzz 图案**(稀疏炭点,宽 2lw+7)描一遍 → 再用 **ink 图案**(炭黑、7% 随机孔洞 + 噪声 >0.58 处大孔,宽 2lw)描 → 最后平涂填色盖住内半圈。效果 = 实心炭线 + 喷点毛边,且 painter 顺序天然处理遮挡(手臂盖住外衣的线)。
|
|
14
|
+
- 炭笔「沸腾」:两张 256 图案每 1/9 s 用 `pattern.setTransform` 随机平移一次,几何不动、颗粒在跳,比抖动路径省且不变形。
|
|
15
|
+
- 整个颜料层画完后 `source-atop` 叠一张 `cave_figtex`:岩面阴影→黑 α(0.5-v)·150、亮处→暖白 α(v-0.5)·50、暗/亮颗粒、低频干湿斑 α≤70。**颜料层只有一次全屏合成**,所以 19ms。
|
|
16
|
+
- 填色都是不透明平涂,颜色靠贴图「脏」掉;不要用 multiply 叠颜料——白垩(猫的白)会消失。
|
|
17
|
+
3. **负形手印/爪印**:320² 临时画布高斯喷点(σ46·s 3200 点 α0.15–0.6 + σ28 1400 点),再 `destination-out` 一张实心手形蒙版,最后蒙版 α0.3 填 `#f6e2bc`。**手形必须逐块 fill 到蒙版**:把手掌椭圆和手指胶囊 addPath 进一个 Path2D 一次 fill,子路径绕向相反处 nonzero 抵消,出现缺口(r4 踩到)。
|
|
18
|
+
4. **火光**:每帧一层径向渐变,中心 (1000+40·noise(t·3.1), 540+26·noise(t·2.3)),强度 `0.13+0.09·noise(t·8.5)+0.04·sin(21t)`,**用 overlay 合成**(α=强度×2.6)。外圈再叠一层随火光反向呼吸的暗角。踩坑:一开始用 lighter,少女的金发和兽皮被洗成粉白、失去赭石饱和度,改 overlay 后颜色回来了。
|
|
19
|
+
5. **余烬**:`P.particles` 三组(左 0–360 ×11、右 1540–1920 ×12、中间 ×5),y 从 1110 漂到 120,life 5.5s;亮核 r 2.2–4.6 + 3.2 倍光晕,`|sin(6t+1.9i)|` 闪烁,`sin(q·π)` 首尾淡入淡出,lighter 合成。
|
|
20
|
+
|
|
21
|
+
## 母题动画
|
|
22
|
+
- **野牛/马两张姿态**:`ph = floor(t·60/7)%2`(每 7 帧换),腿的终点两套坐标(伸展/收拢)、头绕颈点 ±0.07rad、整体 y 交替 -3/+1px;马与野牛反相。腿只用炭线(原片也是),身体是填色剪影 + 背脊一道 22px 深色晕染(拉斯科式明暗)。
|
|
23
|
+
- **端杯**:没用 RIG 的杯子轨迹(桌面→嘴,桌面点在少女胸前,不像原片「伸臂端在半空」)。自定:`hold=(1084,506)` → `mouth=HP(1224,380)`,进度 `k = choreo(max(0,lt-0.95)).cup`(choreo 曲线整体平移 0.95s,对上原片 58 帧起举杯),手臂用 `RIG.ik2(G.A.shoulder, cup+(34,10), 170,128,-1)`;`RIG.girl({cup:k})` 仍负责头部后仰与喝的微仰。k 在 lt≈1.85(T01 转场末)到 1。
|
|
24
|
+
- **热气**:三条炭线 `x0 + sin(13q − 11t + 1.3j)·6`,高 58px,跟杯走。
|
|
25
|
+
- **猫**:RIG.cat 的 head/eyes/nose/earInner/stripes/tailPts 锚点 + 自画梨形身体、白胸、白前腿、大腿弧线;尾巴 = fuzz/ink/橙三层描边 + 每 4 个采样点一道横纹;眨眼来自 choreo.blink。
|
|
26
|
+
- **猫的尺寸(复核返修)**:RIG.cat 原尺寸耳尖在 y≈535,顶进壁画框底边(550)。整只猫用画布变换以脚底 (540,905) 为锚缩 0.86(translate→scale→translate,RIG.cat 本身仍 s=1),耳尖落到 y≈582,与框底留出约 30px,脚底不动。线宽随之 ×0.86,看不出差别。
|
|
27
|
+
- **标题**:`Kalam-700` 78px letterSpacing 7,水平缩放到 930px 宽,`#9b2a18`,画进颜料层(同样吃岩面贴图)。α = t<0.933 ? 1 : 1-(t-0.933)/0.2。
|
|
28
|
+
|
|
29
|
+
## 运动量返修(复核口径:静止段帧 21–84,480×270 逐帧平均帧差)
|
|
30
|
+
复刻 0.62 vs 原片 0.86,偏静。只加局部动作,不靠全屏闪烁:
|
|
31
|
+
- 火光:强度 `0.14+0.11·noise(9.5t)+0.04·sin23t+0.03·sin37t`,中心游移 ±60/±36px(原 ±40/±26)。试过更大(±0.16、±90px)会冲到 1.22,画面发晃,回调。
|
|
32
|
+
- 余烬 28→49 颗(左 20、右 20、中 9),亮核 r 2.6–5.4,光晕 α0.32、3.6 倍,闪烁 `0.3+0.7|sin|`。
|
|
33
|
+
- 手印忽明忽暗:每个手印叠一块 r=105 的暖色径向渐变(lighter),α=0.2·clamp(0.5+0.9·noise(7t+3.7k)),各自独立相位。
|
|
34
|
+
- 野牛/马颠簸 ±3→上下 9px、左右 ±3px,头部摆 ±0.12rad。
|
|
35
|
+
- 猫头小动作(对原片 65–81 帧):lt 1.08–1.35 用 `sin(πq)` 包络,绕颈点 (596,680) 抬头转 −0.16rad,RIG.cat look 推 1.5,耳朵 60Hz 微抖 ±0.06rad。
|
|
36
|
+
- 结果:**0.62 → 1.06**(原片 0.86);每帧 max 22ms。
|
|
37
|
+
|
|
38
|
+
## 少女的时代化
|
|
39
|
+
红赭石 `#9c3520` 剪影(脸/颈/手臂/小腿),侧脸只留一只杏仁眼(米白眼白+黑瞳+一根睫毛,眨眼变弧线)——这一笔是「少女感」的关键;金发用黄赭 `#cf8f2c` 填 + 6 条 `#6e3c0e` 波浪发丝(振幅随长度增大),轮廓也是波浪;发丝下半段逐渐不跟头部旋转(HB 函数),避免喝水仰头时整片头发甩动。及膝兽皮外衣 = G.torso + 自画下摆(每 15px 一个 ±16px 锯齿毛边),`#b06a2c` + 26 个「圆斑+7 个小点」豹纹斑 + 18 道短毛线,接缝靠「先描两块的边再一起填」盖掉。
|
|
40
|
+
|
|
41
|
+
## 色板
|
|
42
|
+
墙 `#ce925a/#6e4426/#b6643a`;炭 `#21150d`;红赭 `#9c3520`/暗 `#74261a`;黄赭(猫)`#c9772f`;金发 `#cf8f2c`/`#6e3c0e`;兽皮 `#b06a2c`/斑 `#4e2610`;白垩 `#f0dfbf`;野牛 `#8c3d22`/头 `#76301a`;马 `#cf8236`;石 `#c98c50`/`#c08048`;桌面 `#d49a5a`;手印 `#8e2a1a`;余烬 `#ffe082`。
|
|
43
|
+
|
|
44
|
+
## 仍可改进
|
|
45
|
+
- 少女身体是 RIG 的写实曲线,比真正岩画人形「太顺」;更原始的做法是把轮廓点降采样到 12–16 个再加大手绘抖动。
|
|
46
|
+
- 岩壁浮雕是静态的,火光只改亮度不改阴影方向;真要「火光跳动下岩面起伏在动」需要两张不同光向的 shade 图按火光插值(+1 次全屏合成)。
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 02_egypt · 公元前1350年埃及墓室壁画(纯代码)
|
|
2
|
+
|
|
3
|
+
文件:`scenes/02_egypt.js`(约 460 行)。性能:warm max 20.7ms / mean 10.5ms(1920×1080),boot 时 `init()` 预热缓存,第一帧不再卡 170ms。确定性检查通过。
|
|
4
|
+
|
|
5
|
+
## 管线
|
|
6
|
+
1. **静态层 `eg_static`(缓存一次)**:灰泥墙 → 象形文字栏 → 窗(檐口/彩块框/白底/阿顿日盘/圣蛇) → 陶罐×3 → 供桌与供品 → 金椅 → 蓝碗 → 地线与底部多层饰带 → 深蓝带 → 顶/左右彩块边框。
|
|
7
|
+
2. **会动的母题(每帧画,便宜)**:水纹象形字流动、阿顿光线+末端小手开合、两条长光线伸到猫面前托安卡、圣甲虫推日球。
|
|
8
|
+
3. **角色**:埃及程式重画,不走 RIG.drawGirl/drawCat,只取锚点与编舞。
|
|
9
|
+
4. **壁画表面**:`eg_surface` 斑驳图层 `multiply` 全画面+`P.grain` 颗粒+6 条随机游走发丝裂纹(裂纹画在表面层里,所以会跨过人物,像真墙面老化)。
|
|
10
|
+
|
|
11
|
+
埃及壁画是「无透视、平涂、轮廓线」,这里**不用任何笔触渲染器**,线条也不沸腾(干净的 2.2–2.8px 深棕线 `#2a1810` 才像),时代感全靠程式(侧脸正面眼、正面双肩)+色板+纹样密度。
|
|
12
|
+
|
|
13
|
+
## 色板
|
|
14
|
+
墙 `#eadcb8`→斑驳暗部 `#d8c597`;四色边框 红 `#b8322a` 蓝 `#2a58a8` 黄 `#e2b13a` 绿 `#2e8a55`,块间米白 `#f2ead6`、黑缝 `#231a14`;金 `#e0ab38`/暗金 `#a8741c`/亮金 `#f3d27a`;深蓝带 `#1c2236`;分栏红线 `#9a2b22`;阿顿日盘 `#c8372b`、光线 `#c23a2a`、小手 `#b4452c`;肤色 `#e6b282`(埃及女性的浅黄赭);猫 橘 `#e08a3c` 条纹 `#b45a1c` 白 `#f6efe0`;圣甲虫 青金 `#2c56b0`+绿松石 `#3fa6a0`。
|
|
15
|
+
|
|
16
|
+
## 象形文字(最出时代感的部分)
|
|
17
|
+
- 写了 **24 个字形函数**(安卡、日轮、面包、芦苇、猫头鹰、隼、鹭、角蝰、荷鲁斯之眼、王名圈、圣甲虫、坐人、腿、手臂、篮、房、三竖、羽、杰德柱、申环、罐、莲花、nfr、嘴、水纹),每个在 ~50px 框内用 10–20 笔画出,自带候选颜色。线宽 3.1(缩放后约 3px),`round` 端点。
|
|
18
|
+
- 栏位照原片量:左 3 栏 x=78..306/y=66..566、中上 4 栏 x=852..1172/y=66..452、右 4 栏 x=1560..1866/y=252..882、猫左 1 栏 x=298..366/y=614..886。
|
|
19
|
+
- 排布:`U.rng(1350)` 种子,逐栏往下塞,字形缩放 = 栏宽/78×(1.0–1.14),间距 6–11px;**同栏不相邻重复、同栏同字形 ≤3 次、圣甲虫/水纹降权 60%**(第一版没限制,满屏都是圣甲虫,像贴纸)。
|
|
20
|
+
- 排布在模块初始化时算好、存位置——这样水纹字可以不进缓存,单独每帧画。保底至少 6 个水纹字。
|
|
21
|
+
|
|
22
|
+
## 母题动画(全部只靠 lt/t,确定性)
|
|
23
|
+
| 母题 | 做法 | 数字 |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| 圣甲虫推日球 | x(lt)=800+642·(lt−0.394),原片 10.7px/帧量出来的;取模 2160 循环;球滚动角 = 球心x/半径;腿两套姿态 `floor(lt*15)%2`(60fps 每 4 帧换) | 整体 ×1.22,球 r=23×1.22 |
|
|
26
|
+
| 阿顿小手开合 | open=0.5+0.5·sin(2π·lt/0.4+k·0.9),手指张角 (0.1+0.24·open) | 周期 0.4s,13 只窗内+2 只窗外 |
|
|
27
|
+
| 光线微颤 | 末端 x+=3·sin(7t+1.3k),y+=2·cos(6t+k) | ±3px |
|
|
28
|
+
| 水纹字流动 | zigzag 相位 = floor(lt·12)·0.5,12fps 步进、4 步一循环 | 0.33s/循环,像逐张手绘 |
|
|
29
|
+
| 端杯 | `cup = lerp(0.8,1,choreo.cup)`:原片「一直端在嘴边喝」,只走最后 20% 的举杯+choreo.sip 仰头 | — |
|
|
30
|
+
| 猫 | choreo.tail 甩尾(RIG.cat.tailPts)、blink(t≈2.18–2.30,正好落在本段 lt≈0.77–0.89)、breathe 上身 | — |
|
|
31
|
+
|
|
32
|
+
运动量:lt 0.45↔0.9(避开拍点冲击缩放)动像素 3.5%,集中在光线小手、猫尾、少女头臂、圣甲虫——量不大但都是视线焦点。
|
|
33
|
+
|
|
34
|
+
## 角色:埃及程式
|
|
35
|
+
**少女**(`RIG.girl({dy:-25})`,dy 让脚落在 y=900 地线上):
|
|
36
|
+
- 侧脸取 `G.face`;**正面眼**自己画:杏仁形白眼+黑瞳 r4.2 贴上眼睑、上眼线 3.2px 往后拖 18px(kohl 拖尾)、长眉。
|
|
37
|
+
- **正面双肩**:躯干不用 G.torso,自己画宽梯形 x 1270–1452(两个肩都看得见,上宽下窄)。
|
|
38
|
+
- 白亚麻:先填肤色,再 `alpha .9` 罩白 → 透出一点肤色=亚麻半透明感;裙身 27 条贝塞尔细褶从腰扇形散到下摆(clip 在裙里,`rgba(120,96,70,.5)` 1.3px),胸前竖褶间距 9px。
|
|
39
|
+
- 宽领项圈:5 条同心半椭圆(蓝/红/绿/金/蓝,rx 50→88、ry 24→55),外圈 18 颗红蓝交替水滴坠。
|
|
40
|
+
- **金色发辫**:假发轮廓 clip 后画 15 束竖辫,每束 = 11.5px 深金底线+8.5px 金色线+每 8px 一道左右交替的斜分节(人字纹),末端长短错落。第一版用小圆珠铺满,像「金色鱼子酱」,换成长条+斜节才读成编发。
|
|
41
|
+
- 金发箍(贝塞尔 15px 黑底/11px 金/3px 亮金)+后垂带、大金耳环、金臂环(金 8px+蓝 2.5px 横条)。
|
|
42
|
+
- **端杯手臂**:RIG 默认的手在杯侧、肩在躯干中间,肘会甩到很远。改成「手托在杯身下(杯脚)」,肩挪到前肩 (1282,476),`RIG.ik2(sh, hand, 140, 160, -1)` 让肘下垂到胸前。
|
|
43
|
+
- 蓝色莲花杯:花瓣形杯身+三道浅蓝瓣线+杯脚,跟 G.cup 的位置/倾角走。
|
|
44
|
+
|
|
45
|
+
**猫=巴斯特坐姿**(`RIG.cat({dy:-5})` 取 headC、tailPts、blink、breathe,身体自己画):
|
|
46
|
+
- 剪影:挺直的胸+圆臀,**前腿包在剪影里**,胸口到前爪一整片白,再用两条线分出两条前腿+趾线。第一版把前腿画成两根独立白柱,像保龄球瓶。
|
|
47
|
+
- 侧头+高尖耳+正面杏仁眼(黄 `#e8cf4a`、竖瞳、黑眼线拖尾)、白口鼻、胡须、金耳环。
|
|
48
|
+
- 项圈 clip 在「身体∪头」里(`Path2D.addPath` 合并),不然圆头描边会戳出脖子;荷鲁斯之眼金坠子。
|
|
49
|
+
- 橘色虎斑:背上 9 道、大腿 4 道、头顶 5 道深橘弧线,尾巴每 3 个采样点一道横纹,尾尖白。
|
|
50
|
+
|
|
51
|
+
## 踩到的坑
|
|
52
|
+
- selfcheck 的 0.2↔0.7 差分在本段会「全画面都在动」——那是引擎的拍点冲击缩放(lt<0.36s),不是场景在动。看真实运动要比 lt≥0.4 的两帧。
|
|
53
|
+
- `P.texture` 首次生成约 170ms;在 `init()` 里预热(引擎 boot 时调用),否则会卡在 T01 转场第一帧。
|
|
54
|
+
- 原片 ref 里的碎石块是转场残留,不是画面内容,别照抄(设定稿里也没有)。
|
|
55
|
+
- 年份牌区域 1500–1890×40–210 只留墙面;右侧象形栏从 y=252 开始正好避开。
|
|
56
|
+
- 复核返修:猫原尺寸时耳尖 y≈530,压到窗框底部彩块(y 530–560)上,像猫头插进窗框。改为以脚底 (540,898) 为锚、画布变换整体缩到 0.85(RIG.cat 仍是 s=1),耳尖落到 y≈585;两条长光线末端用同一变换 `catPt()` 换算,小手仍落在猫头/口鼻处;背线和臀部前移 12–20px,让巴斯特坐姿更修长。**教训:猫/人和窗框各自对齐标准构图框还不够,两个框在 y≈540–600 贴得很近,加高耳朵这类超出骨架框的部件要单独查和邻近物体的间隙。**
|
|
57
|
+
|
|
58
|
+
## 返修 v2:埃及偏静(审片报告第 3 条)
|
|
59
|
+
口径:整片 renderFrame,静止段帧 112–140,480×270 逐帧平均绝对差(屏蔽计数器)。**改前 0.32 → 改后 0.84(原片 0.90)**,性能 warm max 21.7ms。
|
|
60
|
+
- **端杯循环**:lt<0.35 照 choreo 举到嘴边;之后每 0.6s 一个循环 `cup = 1 − 0.46·(1−cos 2πu)/2`(杯离嘴下放到 0.54 再举回);杯在嘴边时加仰头 `sip += 0.3·clamp((cup−0.78)/0.22)·(0.65+0.35·sin 13lt)`,头部倾角到 ~0.2rad。这一项贡献最大。
|
|
61
|
+
- **铭文被写出来**:每 0.12s 从打乱的字表(种子 77,跨所有栏)取 6 个字:先用墙面纹理 `drawImage` 子矩形擦掉,再用 `setLineDash([p·95, 999])` 按笔画描出(每个子路径的 dash 会各自从头开始,正好像逐笔书写),填色部分 p>0.55 才出现;笔迹颜色从亮金 `#f6c846` 落回原色,带 10px 金色 shadowBlur 余辉,0.36s 写完。同时约 18 个字在写。
|
|
62
|
+
- **阿顿脉动**:周期 0.45s;光线长度沿扇形依次 ±9%(相位 −0.55k,像一道波扫过),线宽 2.2→3.8,小手整体缩放 0.9–1.2、手指张角 0.03–0.45;日盘外金色光晕+亮环脉动,日盘重画在光晕之上保持红色。小手坐标 clamp 在窗内(x 428–752,y≤512),否则伸长时会被窗框裁掉半只。
|
|
63
|
+
- **猫**:尾巴幅度 `tail·2.1 + 0.25·sin 9.5t`;两耳错相快速一抖(每 ~0.38s 一次 0.1s,绕耳根中点转 0.32–0.38rad)。
|
|
64
|
+
- 教训:阿顿光线、水纹字这类细线母题在 480×270 的帧差里几乎不计分,**测「看得出在动」要靠面积够大的局部动作**(手臂+头、整字擦写),细线摆动只能当点缀。第一版日盘脉动用半透明橙色盖在日盘上,峰值时把红日盘冲成橙色,改成盘外光晕+亮环。
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# 03_greek · 公元前530 阿提卡黑绘陶器 —— 代码画法笔记
|
|
2
|
+
|
|
3
|
+
文件:`scenes/03_greek.js`(纯 Canvas 2D,无图片)。最终自检:warm max 15.9ms / mean 7.6ms / cold 80ms,确定性通过,0.2↔0.7s 运动差分 22% 像素在动。
|
|
4
|
+
|
|
5
|
+
## 一句话诀窍
|
|
6
|
+
黑绘 = **黑釉剪影 + 刻线 + 附加色**三件套,缺一不可:
|
|
7
|
+
- 剪影:所有人/物填 `#1b120d`(近黑带暖),不描边,靠剪影和陶土底对比成形。
|
|
8
|
+
- 刻线:在黑剪影上「刻穿」,用陶土亮橙 `#e8904c` 画 1.5–2px 细线(衣褶、五官、肢体重叠处的分界)。
|
|
9
|
+
- 附加色:紫红 `#8a2a37` 色带(发带、袖口、下摆、项圈、坐垫)+白色小点(`#f6ead6`,r≈2,间距 11–17px)。
|
|
10
|
+
做到这三样,不需要任何纹理就一眼是希腊陶瓶。
|
|
11
|
+
|
|
12
|
+
## 色板
|
|
13
|
+
陶土 `#dc6a2f`、亮陶土(瓶面板)`#e8803f`、黑釉 `#1b120d`、紫红 `#8a2a37`、白 `#f6ead6`、刻线 `#e8904c`、金发 `#f2bd48`、陶土留白(猫白区)`#f3cfa4`、猫橘 `#f2913f`、猫鼻 `#e7897a`。
|
|
14
|
+
|
|
15
|
+
## 管线与参数
|
|
16
|
+
1. **陶土底(缓存 `gr_bg`)**:480×270 低分辨率逐像素算 fbm(×0.016, 4 octave) 斑驳 ±30 + `noise(x*0.006, y*0.85)` 的**水平条带噪声**(拉坯纹)±9,放大到 1920×1080(低频本来就糊,省 16 倍计算);再画 560 条随机水平细线(长 150–1050,alpha 0.03–0.08,深/浅两种)当拉坯细纹;420 个深色小点 + 120 个浅点;两层 `P.grain`;5 条裂纹(每 9px 一段、±2px 抖动,下沿再画一条 1px 偏移的淡亮边,裂缝立刻有厚度)。中心叠一层暖色径向提亮 0.16。冷启动整帧 ~80ms。
|
|
17
|
+
2. **暗角(缓存 `gr_vig`)**:径向 380→1180,外沿 rgba(30,6,0,.62),最后一层盖全画面(含纹带)。
|
|
18
|
+
3. **静态黑绘层(缓存 `gr_static`)**:画框(黑边 18px+白点串 11.6px 间距+内细线)、葡萄藤(正弦茎+三角葡萄串 3-2-1 圆点)、桌(腿带兽爪脚)、车旋椅腿(宽度表 [y,w] 折线对称成形)、天鹅颈椅背(13px 粗描边曲线+椭圆头+三角喙)、双耳瓶(24 点对称轮廓→`RIG.smooth`,瓶面板留陶土+小黑猫、瓶底射线纹、一条竖向 0.09 的光泽渐变)、两段希腊铭文。
|
|
19
|
+
4. **希腊铭文**:字体库没有希腊字形 → 自写**笔画表**(每个字母 1–3 段折线,单位格 0..1)。字高 30、笔宽 3.4、每字高度 ×(0.9–1.06) 随机、基线 ±6% 抖动、顶点 ±0.7px 抖动;Ο 画成小圆(字高 0.25,原片就是小 o),Ι 宽 2px。手写陶画铭文味道主要来自「字母不等高 + 小 o」。
|
|
20
|
+
5. **滚动纹带**:顶部回纹(周期 60px,7px 黑线,单元折线 `[[4,46],[4,0],[50,0],[50,34],[18,34],[18,14],[36,14],[36,22]]` +通长底线)与底部莲苞链+射线纹(周期 76px=两个 38px 单元,奇数苞填紫红,所以真实周期是 76)各预渲成宽 W+2P 的条带,每帧 `drawImage(strip, -(off mod P))`。偏移曲线:
|
|
21
|
+
- 顶:`off = 22·lt + 60·easeInOut((lt−0.49)/0.35)`,向左;
|
|
22
|
+
- 底:`off = −(18·lt + 76·easeInOut((lt−0.477)/0.367))`,向右。
|
|
23
|
+
原片只在 169–191 帧做一次 easeInOut 周期跳;我额外加了 18–22px/s 匀速漂移,让本段前 0.47s 也能看出在走。
|
|
24
|
+
6. **画框内母题**(每帧画,clip 进画框):6 条海豚(自写贝塞尔剪影:喙、背鳍、腹鳍、尾叉+腹部刻线+白眼点)沿自身朝向 ±9px 来回游、角度 ±0.12rad,周期 0.85s,彼此相位差 1.3;船整体绕 (560,420) 起伏 ±4px、摇 ±0.025rad,周期 0.9s。白帆+紫红缝线、新月船身+蝎尾形船尾、紫红船舱、斜倚人形。
|
|
25
|
+
7. **里拉琴**:以钉子 (1050,150) 为轴 `0.09·sin(2π·lt/0.8+0.5)` 摆(±5°,音箱处位移 ±17px,1 秒内明显)。龟壳音箱=黑圆+刻线圈+5 个刻线小圆。
|
|
26
|
+
8. **玫瑰花饰**:8 瓣黑椭圆+刻线分瓣+紫红心,`lt·1.6` rad/s 正反交替旋转。
|
|
27
|
+
9. **橘白猫**(自画,不用 RIG 默认多边形;尾巴用 `RIG.cat` 的 tailPts 跟 choreo.tail 摆):整体以 (548,903) 缩 0.9 落进标准框;橘剪影+黑描边 3.4px;白胸/白爪/口鼻用「陶土留白」奶油色;**背部虎斑沿背轮廓按弧长等距取 12 点,朝身体中心 (575,800) 画锥形斑**(长 30–48,根宽 10)——比手摆斑纹自然得多;大腿弧、前腿竖斑;古风大圆眼(白眼+黑瞳+高光+上方一道眉弧),眨眼时换成弧线;紫红项圈白点。
|
|
28
|
+
10. **少女**:`RIG.girl({cup,sip,breathe,s:0.97,dy:-14,hair:'long'})`——缩放下移让脚落在地线 903。
|
|
29
|
+
- 身体直接填 RIG 的 Path2D(farSleeve/skirt/torso/neck),远侧手换成小椭圆(RIG 的 farHand 在黑剪影里像一片刀片)。
|
|
30
|
+
- **头部自画**:在 RIG 静止坐标系里写希腊侧脸(直鼻梁连额、细下巴)+发型轮廓,用 canvas 变换复刻 RIG 的头部运动:`translate(neck)·rotate(G.tilt)·translate(−neck)·T`。同一个矩阵用 `DOMMatrix` 再算一份,`Path2D.addPath(faceSil, M)` 拿来做刻线裁剪区。
|
|
31
|
+
- **金发**(认出「金发少女」的关键):发区 clip 内画 11 条头顶波浪发丝(二次贝塞尔+法向 2.6px·sin(7πu) 波动)、8 绺背后长卷发(正弦 4.5 个半波+末端小螺旋)、发髻双螺旋、额前 4 个小卷、鬓角两条螺旋卷(黑底 6px 垫一道再画金 2.2px,跨出剪影也看得清)。金线 2.5px 在 1080p 下才够「量」,2px 时缩略图里就看不出是金发。
|
|
32
|
+
- 刻线:衣褶 16 条(clip 在身体内)、杏仁眼(浅色眼白+黑瞳,正面眼画在侧脸上)、眉、鼻翼、唇、下巴。**近侧手臂与身体/头重叠处的分界**:clip(身体∪头) 后描手臂轮廓的刻线——黑叠黑只能靠这个分开,手举到嘴边时脸才不会糊成一团。
|
|
33
|
+
- 附加色:下摆 15px 紫红带+白点、袖口带(clip 在上臂内,沿上臂法向画 15px 宽色带+上下刻线)、手镯、白点四瓣小花 8 朵、发带。
|
|
34
|
+
- 基里克斯杯(宽浅双耳,半宽 32)跟 `G.cup`(含 tilt),杯口紫红线;热气是三道「≀」黑细线,相位 `t·9`。
|
|
35
|
+
|
|
36
|
+
## 动的东西(0–0.94s 内都可见)
|
|
37
|
+
端杯(choreo.cup 0.9s 举到嘴边+头微仰)、猫尾/眨眼/呼吸、顶底纹带滚动(漂移+拍点周期跳)、里拉琴摆、船起伏、海豚游、玫瑰转、热气扭。
|
|
38
|
+
|
|
39
|
+
## 踩到的坑
|
|
40
|
+
- RIG 头发轮廓直接放大后后脑太宽(第一版后脑伸到 x=1450,头像头盔);按设定稿收到 1424,长发只垂到 y≈558。
|
|
41
|
+
- 杯子在嘴边时黑手黑杯黑脸糊成一块:①手臂对头部做刻线分界 ②杯子缩小(半宽 44→32)③杯口留一条紫红线。
|
|
42
|
+
- RIG 猫的头顶到 y=535,标准框猫顶是 610;不缩会压到画框下沿。
|
|
43
|
+
- 底带奇偶苞交替时真实周期是 2 个单元(76px),预渲条带的 wrap 周期必须用 76,否则每 38px 跳色。
|
|
44
|
+
- `P.grain` 的种子 = key 长度,两层 grain 的 key 必须不同长度,否则图案相同。
|
|
45
|
+
- **端杯终点要时代化(复核返修)**:RIG 的 cup→mouth 终点在鼻尖附近、杯倾 −0.45rad,换成宽浅的基里克斯杯后像一根鸟嘴/烟斗插在脸上,手还捂住嘴和下巴。改成自己做 IK:唇点 rest(1243,391) 用头部 DOMMatrix 变换到屏幕,杯沿中心 = 唇点 −(30,−1)(杯沿右端刚碰嘴唇),倾角 −0.08·cup(≤5°),手的 IK 目标 = 杯沿 +(lerp(32,6,cup), 30),即托在杯脚下;`RIG.ik2(S, 手目标, 165s, 122s, −1)`+`RIG.taper` 自己出上臂/前臂。前臂竖在胸前,鼻、唇、下巴的侧脸轮廓完整露出。热气跟随杯沿。
|
|
46
|
+
|
|
47
|
+
## v1 审片返修(猫改黑绘 + 顶带滚动加量)
|
|
48
|
+
- **猫必须和人同一套画法**:亮橘大圆眼卡通猫在黑绘里一眼跳戏。改成黑釉剪影,「橘白」只靠附加色和刻线分区:背部沿轮廓画一条 26px 紫红鞍带、头顶一块紫红(椭圆 46×22 clip 在头内)、尾巴黑底+7px 紫红芯;虎斑全部是陶土橙 `#f2913f` 3px **刻线**(沿背轮廓弧长等距 14 条朝身体中心的弯线+大腿 3 条+前腿 3 条+尾巴每隔 2 点一道环);白胸/口鼻/爪用白彩 `#efe1c8`,爪上黑刻趾;眼睛改古风刻线杏仁眼(白彩眼白+竖椭圆黑瞳+眼尾小刻线),眨眼是一道下弯刻线;鼻子紫红,须左侧用刻线(落在黑脸上)、右侧用黑线(落在陶土上)。
|
|
49
|
+
- **周期图案滚整数个周期 = 首尾两帧一样**:顶带 60px 周期跳一次后画面和跳之前完全相同,看静帧对比或抽帧很容易判成「没动」。匀速漂移从 22→48px/s(底带 18→30px/s),保证任意两帧间都有相位差。
|
|
50
|
+
- 整片静止段运动量(480×270 帧差均值):03_greek 1.87 → 2.02,原片 2.06。warm max 17ms。
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# 04_roman · 公元79年 庞贝马赛克 —— 手法笔记
|
|
2
|
+
|
|
3
|
+
文件:`scenes/04_roman.js`(约 330 行)。最终自检:warm max 17ms / mean 13ms(1920×1080),init 206ms(boot 时一次),17,871 块石头,其中 13,067 块在动态区每帧重新取色。确定性通过。
|
|
4
|
+
|
|
5
|
+
## 核心思路:布局只算一次,颜色每帧流过石块
|
|
6
|
+
|
|
7
|
+
马赛克的动画应当长成这样:石块本身固定在墙上,动的是颜色从一块流到另一块。所以渲染器拆成两半。
|
|
8
|
+
|
|
9
|
+
1. **init(`build()`,206ms)**:先算出每一块石头在哪、多大、朝哪、哪些像素属于它、斜面明暗如何,存成 `ID`(Int32,每像素对应的石块号,-1 表示灰浆)和 `SH`(Uint8,每像素明暗,128=1.0)。
|
|
10
|
+
2. **每帧**:重画平涂底稿,`getImageData` 一次,然后在动态石块的中心点取色(加上每块石头固定的颜色抖动),再在动态矩形里逐像素填 `色×明暗>>7`,最后 `putImageData` 到自己的离屏画布,用 `drawImage` 贴到 `c` 上。
|
|
11
|
+
- 坑:**不能直接对 `c` 做 `putImageData`**,因为它会无视引擎的镜头冲击缩放(punch zoom)和转场裁剪。必须先写进离屏画布再 `drawImage`。
|
|
12
|
+
- 每帧逐像素只处理约 100 万像素(4 条边框带、画框内、少女、猫),用 JS 循环大约 5ms。所有离屏 context 都用 `{willReadFrequently:true}`,`getImageData` 才快。
|
|
13
|
+
|
|
14
|
+
## 石块布局(andamento:沿轮廓排)
|
|
15
|
+
|
|
16
|
+
按 Hausner 2001「Simulating Decorative Mosaics」的思路简化而来。
|
|
17
|
+
|
|
18
|
+
- **结构图**:静态底稿加上第 0 帧的猫和少女(不画会动的近侧手臂),降采样到 960×540。相邻像素的 RGB 差之和大于 34 就记为边缘,再把类别图里边框带的边界也算作边缘。
|
|
19
|
+
- **距离场**:用 Felzenszwalb–Huttenlocher 精确欧氏距离变换(两遍一维下包络),半分辨率下约 20ms。
|
|
20
|
+
- **沿轮廓走线放石块**:候选像素满足 |d−(k+½)s|<1.5、k<该类的圈数,也就是距离场的等值线带。从未访问的候选点出发,沿 8 邻域优先走「和上一步方向最一致」的候选(方向做 0.6/0.4 平滑),离上一块的距离 ≥s 时放一块。石块的朝向取距离场梯度的切向。空间哈希保证任意两块的间距 ≥0.8×平均尺寸。
|
|
21
|
+
- **规则成行补洞**:每个类别铺一张砖缝错开半块的网格(行抖动 ±5%、列抖动 ±9%)。最小间距检查用 0.86,能放下就放。这一步同时填掉轮廓行之间和中轴线上的洞。
|
|
22
|
+
- 坑:起初只让「距离 ≥K×s」的地方放网格,结果窄形状(猫尾巴,26px 宽)里一块石头都没有,整条尾巴露出灰浆。改成只靠最小间距之后就解决了。
|
|
23
|
+
- **边框带单独排**:每条边在自己的局部坐标里排 11 行,石块 7.6px,沿边方向宽度在 0.86–1.14 之间随机;四角是 11×11 的方格。
|
|
24
|
+
|
|
25
|
+
| 类别 | 石块边长 px | 沿轮廓圈数 | 颜色抖动 |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| 墙 | 12 | 1,之后规则成行 | ±8%,7% 的石块额外压暗 12% |
|
|
28
|
+
| 晕圈(人/猫/物件外侧白边) | 11 | 9(整条晕圈都沿轮廓) | ±5% |
|
|
29
|
+
| 少女身体 / 物件 | 10 | 全部沿轮廓 | ±5% |
|
|
30
|
+
| 少女脸、猫头 | 6 | 全部 | ±4% |
|
|
31
|
+
| 头发 | 8 | 全部 | ±5% |
|
|
32
|
+
| 火山画内 | 9 | 2 | ±6% |
|
|
33
|
+
| 外框带 | 7.6 | 沿边成行 | ±5% |
|
|
34
|
+
| 文字 | 7 | 全部 | ±5% |
|
|
35
|
+
| 地面带 | 13 | 1 | ±6.5% |
|
|
36
|
+
|
|
37
|
+
除了表里的抖动,每块石头还会加一个 ±7 的加性灰度抖动。9% 的石块偏暖(+12,+4,−8),7% 偏冷(−6,0,+9)。
|
|
38
|
+
|
|
39
|
+
## 石块形状与灰浆:加权 L∞ Voronoi
|
|
40
|
+
|
|
41
|
+
- 每块石头是一个旋转方块。四条半边长各自独立取 `s/2×(1.08–1.28)`,旋转角再抖动 ±0.06rad。像素到石块 k 的距离定义为 `D=max(|u|/h±, |v|/h±)`,其中 (u,v) 是像素在该石块局部坐标里的位置。
|
|
42
|
+
- 光栅化时对每个像素记录最小的 D1、次小的 D2 和对应石块号,开销是每块石头的包围盒 1.5h。
|
|
43
|
+
- **灰浆**:满足 `D1>1`,或 `(D2−D1)·h/2 < g`(g = clamp(0.1s, 0.75, 1.25)px)的像素算灰浆,也就是落在两块石头的平分线附近。所以缝宽约 1.5–2.5px,石头被邻居「切」出不规则边,像真的錾过。
|
|
44
|
+
- 坑:半边长最初只取 `s/2×(0.9–1.1)`,石块小于间距,结果灰浆占了约 40% 的面积,看起来很稀。把石块做得比半间距大 8–28%,交给平分线去切,石块就密实了。这一处是质感的关键。
|
|
45
|
+
- **斜面明暗**:离边 2.2px 以内,按外法线与光向 (−0.6,−0.8) 的点积 ±16% 变亮或变暗(左上亮、右下暗)。再加穹顶项 `−5%·D1²` 和 ±3% 的像素颗粒。
|
|
46
|
+
- 灰浆色:`rgb(112,103,92)` ±8 噪声。
|
|
47
|
+
|
|
48
|
+
## 平涂底稿与配色
|
|
49
|
+
|
|
50
|
+
- 墙 `#e4ddcd`,晕圈 `#f5f1e8`(每个人和物件外面都描一圈 44–50px 的晕圈,石块会沿它排出白边),描边 `#46322a`,描边 8px(脸部 8px,以便成排)。
|
|
51
|
+
- 画框:红 `#a8322a`,往里依次是深红 `#7c221d` 线、金 `#d0a23c` 线、深色线。
|
|
52
|
+
- 火山:三个面分别是亮 `#7c84b8`、中 `#4e5796`、暗 `#2f3672`;天空 `#9ec0d8`→`#d3e3e4`;山坡 `#6f9341`/`#92b254`;地面 `#cba344`;柏树 `#2b5a2f`;熔岩 `#d64a22`/`#f2952c`。
|
|
53
|
+
- 少女:斯托拉 `#efe7d5`,下摆两道红条 `#a8322a`;红披肩分三块(背后斜披、膝上一条、前襟垂下),褶线 `#7c221d`,配金色胸针;短袖口是在上臂里裁一个以肩为圆心、半径 62 的圆,加红边;金发 `#dcaa42`,分层线 `#9c6c1c`,脑后螺旋发髻;红发带用三次贝塞尔并跟随头部 tilt 旋转。眼睛画成 10×6 的白加半径 5.5 的深色,这样恰好落成「一白一深」两块 6px 石头。
|
|
54
|
+
- 猫:橘 `#dc8530`,背部压暗 `#c06a24`,条纹 `#9c4818`,白 `#f7f2e8`,大黄眼 `#e9c22c`(半径为 eyeR×1.65),红项圈 `#b02a22` 带金坠。身体用 `RIG.smooth(K.bodyPts)` 平滑出梨形,替代原来的多边形。尾巴的环纹用虚线 `setLineDash([9,13])` 画。
|
|
55
|
+
- 「CAVE CATTVM」:**自己写的等宽粗笔画字母**(C 用椭圆弧,A、V、E、T、M 用折线),笔画 14px、字高 60px、字距 16,横向缩放到 600px 宽。
|
|
56
|
+
- 坑:用 Cinzel-700 直接 fillText,细横笔在 7–9px 石块下会断(E 变 F、A 丢横),字距紧时还会粘成一团。三轮迭代下来,结论是「马赛克字 = 等宽粗笔画、每笔约 2 块石头宽」。
|
|
57
|
+
|
|
58
|
+
## 母题动画(本段 lt 0–0.94s,T04 转场期间画到 1.29s)
|
|
59
|
+
|
|
60
|
+
- **四边波浪纹顺时针流动**:每条边用 `setTransform` 切到局部坐标(u 沿顺时针方向,v 从外往里),画同一个维特鲁威卷涡:从内侧黑带起笔,螺旋 r 从 24 收到 5、转 2.25 圈,线宽 13,周期 81px。相位为 `42·lt + 81·easeInOut((lt−0.485)/0.365)`,即全程匀速漂移,再在原片的 226–248 帧多走一个周期。石块位置不动,所以黑白在石块间流动,正是马赛克动起来的样子。0.4→0.9s 之间边框带有 20% 的像素在变。
|
|
61
|
+
- **维苏威冒烟**:火山口离画框顶只有 70px,烟往上飘很快就被裁掉,看不见(第一版就踩了这个坑)。改为让整条灰云带以 55px/s 向右漂(周期 380px),再加 9 团烟(深 `#3f3c3a`→浅 `#a29c94`)贴着天空往右压低飘,加 12 颗火星(10px 方块,抛物线轨迹)和火山口熔岩脉动。画框内有 4.4% 的像素在变。
|
|
62
|
+
- **端杯**:节奏用 `choreo.cup/sip`,杯子是金色双耳杯 kantharos,杯口有白石热气,透明度为 1−0.85·cup。路线是自写的 `armPose`(见文末「复核返修」)。
|
|
63
|
+
- 坑:墙石 15px 时,手和杯子在大石块里糊成一团。一度给手臂扫过区单独换成 8.5px 石块,结果静止时成了发白的补丁,最后改成全墙统一 12px。
|
|
64
|
+
- **猫**:尾巴用 `choreo.tail×1.6`(9px 石块下原幅度太小,看不出摆),眨眼时眼睛变成橘色石块加一条深线。
|
|
65
|
+
|
|
66
|
+
## 性能与动态矩形
|
|
67
|
+
|
|
68
|
+
- 动态矩形在 init 时由采样姿态的包围盒算出(cup 从 0 到 1 每 0.05 一档,sip 取 0/0.15;猫尾 tail 在 ±0.75 范围内),外扩 58px,包住晕圈和热气。矩形外是第 0 帧的静态马赛克。
|
|
69
|
+
- 坑:矩形要包得足够大,否则跨边界的石块会出现一半新色、一半旧色。
|
|
70
|
+
- 全片时间轴里罗马段(包括前后两次转场、新旧两层同画)的帧,除了首次进入转场时其他时代的冷缓存外,都在 40ms 以下。
|
|
71
|
+
|
|
72
|
+
## 自检里要知道的
|
|
73
|
+
|
|
74
|
+
- `selfcheck` 的「运动差分 0.2↔0.7」会被引擎的拍点镜头冲击污染。lt<0.37 时整幅画面在缩放,结果报 68%,那不是画在动。改用 0.4↔0.9(冲击已结束)测:全画面 6.2%,其中边框带 20.4%、少女 8.4%、画框 4.4%、猫 0.8%。
|
|
75
|
+
|
|
76
|
+
## 还能更好的地方
|
|
77
|
+
|
|
78
|
+
- 少女举杯到嘴边时,手、杯和脸挤在一起,在 6–8.5px 的石块尺度下略糊。
|
|
79
|
+
|
|
80
|
+
## 复核返修(第二轮)
|
|
81
|
+
|
|
82
|
+
- **猫**:以脚底 (540,905) 为锚,用画布变换缩到 0.85(类别图、动态矩形同步缩放),耳尖从 y≈540 降到约 590,晕圈不再碰画框。头改画成正脸庞贝猫:两只 R17 的大黄圆眼、黑竖瞳、7px 深色眼眶,头部 11px 深色描边,类别图里也描进 6px 小石块,所以轮廓能成排。
|
|
83
|
+
- **举杯糊脸**:不再走骨架原来的举杯路线,改用自写的 `armPose`。杯子沿「桌面→前上方 (1150,470)→唇前」的二次贝塞尔移动,终点是杯沿右端贴在 `G.lips[0]`,倾角 0.15rad(8.6°)。手托在杯脚下(偏移从 (28,34) 插值到 (3,44)),IK 用同一副臂长 165/122 和肘向。前臂竖在下巴前方,鼻、唇、下巴和眼都露出来了。面部描边加粗到 10px。
|
|
84
|
+
- **补墙感**:去掉了「手臂扫过区 8.5px」这个类别。墙石统一改为 12px(也更接近原片墙石的尺度),动态区的墙和周围共用同一套布局,只是每帧重新取色,看不出边界。
|
|
85
|
+
- 教训:动态区千万别为了细节单独换石块尺寸,静止时它就是一块补丁。
|
|
86
|
+
- 返修后:warm max 17.1ms,mean 13.0ms,确定性通过。
|
|
87
|
+
|
|
88
|
+
## 审片返修(第三轮,v1 审片报告第 3、4 条)
|
|
89
|
+
|
|
90
|
+
- **边框看不出在滚**:整片时间轴(renderFrame)里其实在动,但「石块不动、只换色」的做法下,卷涡每帧只移 1–3px,被 7.6px 的石块量化之后,在运动热力图里几乎不亮。
|
|
91
|
+
- 改法:边框改成「传送带」。在 init 里预烘一条长 2106px(26 个周期)的石块带。图案周期是 81px,石块布局也按 81px 循环:每行 11 块,宽度各自随机,但归一化到正好 81px,抖动也按周期复用。所以整条带平移任意相位都能无缝接上。
|
|
92
|
+
- 每帧对四条边各做一次 `c.transform(边的局部坐标)`,再裁剪、`drawImage(strip, BW−2·81+相位, 0)`,石块跟着图案一起顺时针走。四角方块保持静态。
|
|
93
|
+
- 相位改为 `15·lt + 81·easeInOut((lt−0.485)/0.365)`,匀速漂移从 42 降到 15px/s,主运动留给原片 226–248 帧那一个周期。
|
|
94
|
+
- 静止段运动量(motion.py,480×270 平均帧差,帧 222–253):复刻从 1.98 升到 4.62,原片 2.90。漂移是 42px/s 时为 5.5。
|
|
95
|
+
- 规律:慢速图案位移小于石块尺寸时,「只换色」会被量化吃掉,要么让石块跟着走,要么位移必须远大于石块。
|
|
96
|
+
- **杯子读不出**:杯子从底稿里拿掉,改成 4.4px 小石块的拼片 `cupSprite`。内容是放大 1.3 倍的双耳杯:深色描边石块、金色杯身(右侧压暗)、亮杯口加深色杯内、两只耳、杯脚。每帧按 `armPose` 的位置和倾角整块叠在马赛克上。热气也改成两列沿正弦上行的白色方石(`steamTiles`),带灰浆边。底稿里只留杯子的白晕。
|
|
97
|
+
- 规律:小于 3 块石头宽的道具在固定布局里读不出来,应当做成随手移动的「嵌片」(emblema 式拼片)。
|
|
98
|
+
- **脸读不出五官**:脸部石块从 6px 改为 5px。眼睛白色 13×7,深色 8×7,约 3 块深石加白;嘴唇改成红 `#a8282a`、8.5×6 的椭圆,约 2 块;眉毛 6px 深棕。1080p 缩到一半看,能读出眼睛和嘴。
|
|
99
|
+
- 返修后:warm max 20.9ms,p90 17.4ms,mean 13.9ms,确定性通过。
|
package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/05_gothic.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 05_gothic · 1290 哥特泥金手抄本
|
|
2
|
+
|
|
3
|
+
每帧 11–22ms(中位 12ms)。静态层+金箔掩膜在 `init()` 里一次性建好。
|
|
4
|
+
|
|
5
|
+
## 管线
|
|
6
|
+
1. 静态层 `goth_static`(缓存):羊皮纸 → 金箔 → 菱格压花 → 山墙、小尖塔、侧柱 → 尖拱窗和彩玻璃 → 桌子、宝座 → 拉丁文栏 → 页边小骑士。
|
|
7
|
+
2. 金箔掩膜 `goth_mask`:对静态层逐像素算「金色度」 `clamp((r-b-70)/50)·clamp((g-b-30)/40)·clamp((r-140)/40)`,结果当 alpha。羊皮纸 (236,223,194) 的 r−b 只有 42,被排除;粉色带 b 值高,也被排除。**不用再画一遍金色形状来做遮罩**,凡是金色的地方都会自动被高光扫到:背景、首字母、金球、山墙顶饰。
|
|
8
|
+
3. 每帧依次画:彩玻璃闪烁 → 斜向高光 → 高光经过处出现四角星 → 藤蔓花饰 → 蜗牛 → 跑过的老鼠 → 猫 → 少女 → 颗粒。
|
|
9
|
+
|
|
10
|
+
## 金箔质感(规范要求的「细纹理+高光」)
|
|
11
|
+
- 逐像素着色:`f = 0.52 + fbm(x·.0035)·0.42 + 横向打磨纹 noise(x·.004, y·.09)·0.5 + 左上受光 + 颗粒±0.05`,再在 goldLo #9c6a1a / gold #d9a63a / goldHi #f8de86 三个色之间插值。打磨纹的 y 频率是 x 的 20 倍以上,所以看起来是横向的金属拉丝。
|
|
12
|
+
- 菱格:间距 46px,两族斜线(x+y、x−y 各为常数)。每条线画两遍:一遍暗线,一遍错开 1.2px 的亮线,看起来就是刻进金里的。菱心压 4 个点,左上亮、右下暗。
|
|
13
|
+
- 每隔 118×125px 画一条极淡的方块接缝,模仿一片片贴上去的金箔。
|
|
14
|
+
- 斜向高光:先在一张 920px 宽的 scratch 上画线性渐变带,斜率 K=0.45(“/” 方向)。用 `destination-in` 乘掩膜,再以 `lighter`、α0.62 叠回画面。**按匀速移动** `x = lerp(150,1650,(lt-0.08)/1.15)`。最初用 inOut 缓动,结果 0.9s 时高光已经扫出金区,少女身上看不到;改成匀速后,0.3s 扫到窗边,0.9s 正好扫过少女。光环、11 个固定点按 `|u − sweepX| < 70` 判定,在高光经过时出四角星闪光。
|
|
15
|
+
|
|
16
|
+
## 母题动画(0.25–1.4s 窗口内都看得出)
|
|
17
|
+
- 藤蔓:两条茎各约 120 个点,每个点加 `sin(t·2.1+i·.09)·2.5` 的摆动。每 3–5 个点挂一片三瓣常春藤叶(蓝/红/金轮换)或一颗带 3 根须的金球。叶片绕挂点按 `sin(t·3.1+k·1.7)·0.28` 摆。叶片缩放第一版用 0.85,太小太稀,改为 1.05–1.45 后,密度才接近原片。
|
|
18
|
+
- 彩玻璃:26 个随机点,`sin(t·5+h·40) > 0.6` 时点亮一团白色径向光。
|
|
19
|
+
- 猫抬起一只前爪,拎着老鼠尾巴,老鼠像钟摆一样摆 `0.32·sin(t·5.5)`,小腿乱蹬。蜗牛以 62px/s 向左爬,触角晃动;文字栏下的老鼠在 0.12–1.17s 内跑过 360px,腿每秒摆 40 弧度。
|
|
20
|
+
- 少女按共享编舞端起金杯,杯沿有一颗四角星闪烁,杯上热气用细墨线。
|
|
21
|
+
|
|
22
|
+
## 角色
|
|
23
|
+
- 少女直接拿 `RIG.girl` 的 Path2D 自己按顺序画,**不调 `RIG.drawGirl`**,原因有两个:drawGirl 一定会画成带把手的马克杯;斗篷和光环要插在中间某几层之间。画的顺序:光环(以 headC 为中心偏 (16,−22),r=114,红圈加 36 颗压印点)→ 波浪长金发 → 红袍(金细竖条每 20px 一条,袍摆一道金边)→ 蓝斗篷(锚在 nape/back 上,带金边)→ 头 → 金圣杯。
|
|
24
|
+
- 猫做成手抄本里「人脸猫」:脸部是一块奶油色椭圆,杏眼瞳孔挤在右侧斜睨少女,上眼皮加粗,眉毛挑起,嘴角下撇,两颊红晕。只用 `legs[0]`,另一条前腿用 `RIG.limb` 自己画成抬起的姿势。
|
|
25
|
+
- 拉丁文正文用 UnifrakturMaguntia 44px。50px 会把 “cum poculo suo” 挤出画面右边。句首的 Cattus/Nemo/Mus 用朱红,这是中世纪的朱批做法。
|
|
26
|
+
|
|
27
|
+
## 坑
|
|
28
|
+
- scratchpad 和其它时代作者共用,`check.py` 被别人覆盖过一次。自检脚本要放进自己的子目录。
|
|
29
|
+
- 运动差分图如果拿 lt=0 当基准,会被引擎前 20 帧的镜头冲击(1.03 缩放)污染。基准要取 lt≥0.35。
|
|
30
|
+
|
|
31
|
+
## v2 微调
|
|
32
|
+
藤蔓摆幅 ×2、叶摆 0.42;彩窗闪点 40 个;金箔高光 α0.85、高光带加宽。静止段帧差 1.10 → 1.32(原片 1.64)。
|
package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/06_renaissance.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 06_renaissance · 1503 文艺复兴盛期(达芬奇式)
|
|
2
|
+
|
|
3
|
+
每帧 16–37ms(中位 16ms)。
|
|
4
|
+
|
|
5
|
+
## 管线
|
|
6
|
+
1. 静态层 `ren_static`:先在原始 canvas 上画完房间,再整层用 `filter: blur(1.3px)` 画进缓存,相当于全画面做一遍 sfumato。房间内容如下:
|
|
7
|
+
- 墙:P.texture #43321f→#22180e,加窗光晕的径向渐变,顶部压暗。
|
|
8
|
+
- 窗:半圆拱窗,石框左侧受光,窗洞里是远景。
|
|
9
|
+
- 地砖:透视棋盘。按真投影算:`y = 420 + f·h/Z`,`x = 960 + f·X/Z`,f=1029、h=5.75,Z 从 16 往前每块砖 1.4。第一行落在 y=790,往下依次 825/868/922/989,和原片的行距对得上。地砖色是 #a88c64 和 #5c2418,再叠一层 soft-light 光池和一层四周压暗的径向渐变(以 760,960 为中心)。
|
|
10
|
+
- 方桌白布、梯背椅。
|
|
11
|
+
2. 远景(空气透视):画三层山,越远越蓝越淡(#9fb4b8 → #7d9294),轮廓用 fbm 生成。之后是湖、河谷(由灰绿过渡到暖赭)、蜿蜒的银白河(宽度随远近从 3 增到 16px)、柏树和圆树、石桥。
|
|
12
|
+
3. 每帧依次画:河面碎光(24 个光点顺流移动、闪烁)→ 飞鸟 → 扑翼机(三者都裁剪在窗洞内)→ 角色层 → 光柱和浮尘 → 罩层。
|
|
13
|
+
4. 罩层 `ren_over`(缓存后一次 drawImage):
|
|
14
|
+
- 暗角:0.55 处 α0.3,边缘 α0.8。
|
|
15
|
+
- 黄釉:α0.07。
|
|
16
|
+
- 画布经纬:每 3px 一条线。
|
|
17
|
+
- 油彩笔触肌理:9000 笔,α0.022/0.028,线宽 5–10,方向随机。
|
|
18
|
+
- 龟裂纹:P.craquelure 取 α0.32;再用 `brightness(0) invert(1)` 把它变成白线,错开 1px、α0.16、`lighter` 叠一遍,模拟漆皮翘起的亮边。
|
|
19
|
+
|
|
20
|
+
## 晕涂(sfumato)
|
|
21
|
+
角色先画进离屏层 `renChars`,只处理 (320,180,1200,780) 这块区域。画回主画面分两遍:先 `blur(2.6px)` 全不透明,再叠一张 α0.38 的清晰层。这样边缘是软的,五官还认得出。角色不描线,全部靠渐变出体积:
|
|
22
|
+
- 裙褶:亮褶 rgba(200,70,60,.3),暗褶 rgba(40,0,0,.45)。
|
|
23
|
+
- 天鹅绒袖子:沿骨骼方向画一条 rgba(170,200,140,.45) 的光带。
|
|
24
|
+
- 脸:左侧受光渐变,加眼窝阴影。
|
|
25
|
+
|
|
26
|
+
## 母题动画
|
|
27
|
+
- 扑翼机:0–1.35s 从 x=470 飞到 740,同时上下浮动、略有俯仰。两张蝙蝠翼的扇动按 `up = 0.5+0.5·sin(t·12+相位)`,翼尖在 −118 到 +24px 之间。远翼缩到 0.78 倍、颜色压暗、相位错开 0.5。翼的画法:前缘梁+6 根放射肋+扇贝形后缘膜,尾舵也在摆。第一版是平面「纸飞机」,认不出是达芬奇的扑翼机,重画成现在的肋骨扇形翼后才认得出。
|
|
28
|
+
- 光柱:楔形一次性画进缓存并做 `blur(28px)`,每帧 screen 叠加。第一版每帧直接填多边形,两条硬边很假。浮尘是 46 颗粒子,沿光柱缓慢上浮并闪烁。
|
|
29
|
+
- 少女按编舞用银杯啜饮,cup>0.7 时闭眼。猫一直眯眼微笑,尾巴在摆。
|
|
30
|
+
|
|
31
|
+
## 坑
|
|
32
|
+
- 第一版油彩肌理用 26000 笔、α0.05、方向跟着 noise 走,结果整面墙像梵高的漩涡(后印象派)。降到 9000 笔、α0.025、方向随机后才回到古典油画的感觉。
|
|
33
|
+
- 猫身体的轮廓内侧压暗用了 26px、α0.45,奶白色身体看起来像个玻璃罩。改成 14px、α0.22,白色的胸部改用径向渐变把橘色毛「晕」进来,不留硬边界。
|
|
34
|
+
- 地砖第一版太亮、对比太强,像矢量插画。必须压暗四周,只留下窗光照到的那块光池。
|
|
35
|
+
|
|
36
|
+
## v2 返修(审片:偏静 0.20 vs 0.46;主角被模糊、窗外反而清晰,景深倒置)
|
|
37
|
+
- 晕涂改为:模糊层 1.6px(原 2.6),清晰层 α0.82(原 0.38)。软边保留,五官和轮廓清楚了。
|
|
38
|
+
- 扑翼机放大 1.6 倍,航程 440→790,俯仰幅度 ±0.07;飞鸟增加到 14 只、放大 1–1.8 倍。
|
|
39
|
+
- 猫:头绕脖子歪蹭 ±0.16rad,眯眼松紧交替,尾巴 ×2.2,呼吸 ×3,look 左右转头。少女:发梢摆 ±11px,sip ×1.6。
|
|
40
|
+
- 窗外云影掠过河谷;光柱亮度随「云过日」以 0.75±0.35 变化;浮尘 70 颗。
|
|
41
|
+
- 静止段帧差:0.20(审片口径)/0.30(我量)→ 0.37。原片 0.43。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# 08_impressionism · 1874 印象派(莫奈)
|
|
2
|
+
|
|
3
|
+
每帧 65–76ms(中位 69ms)。主要开销是两遍全屏 P.strokes 加一遍角色笔触。
|
|
4
|
+
|
|
5
|
+
## 管线(照 09_postimp 标杆)
|
|
6
|
+
1. 平涂底稿 `impBase`,每帧重画,因为罂粟、云、花束、盆栽、窗帘都在动:
|
|
7
|
+
- 粉紫墙(#d8bede→#f0c8cc→#f2c4d4),右上叠一个 r=900 的暖黄阳光径向渐变。
|
|
8
|
+
- 窗外花园:天、树林、红顶屋、草地,70 朵罂粟(茎底不动,花头横摆 `sin(t·3.2+ph+x·.02)·(6+r·.6)`),撑阳伞的女子加孩子(向《罂粟田》致敬),花丛。
|
|
9
|
+
- 白窗框、淡紫窗帘、墙上的《日出·印象》、圆桌白紫桌布、花瓶、茶壶、右侧盆栽(整团叶子随 `sin(t·1.9)·8` 摆)。
|
|
10
|
+
2. 笔触重画,**两遍**:
|
|
11
|
+
- 主画面:cell 11、len 20、width 7、outline 0、jitterCol 26,用 mask 排除窗景和墙上的小画。
|
|
12
|
+
- 窗景和《日出》:cell 6、len 11、width 4.5,只画 mask 范围内。
|
|
13
|
+
- 第一版只有一遍粗笔,窗外的房子、撑伞女人全被糊掉,《日出》也被斜笔刷成一片。分开两遍、《日出》改成横向水波笔后就都认得出了。
|
|
14
|
+
- 画布先铺 #f2e6ee,笔触缝隙里露出浅色底。
|
|
15
|
+
3. 方向场:墙向右上斜(阳光区 −0.95 弧度,其余 −0.55,再加 ±0.55 噪声);地面接近水平;窗帘和桌布竖向;盆栽从盆口往外放射;窗里的天空横向。
|
|
16
|
+
4. 区域色板 `P.swatch`(mixBase 0.3–0.45):墙 9 色粉紫黄;阳光墙 7 色奶黄;地面 7 色玫瑰橙紫;天空、草绿、窗帘淡紫、桌布蓝紫各一组。白窗框用 `col > (240,236,225)` 判定,混回白色,否则会被刷成墙色、窗框消失。罂粟的红返回 null,保留底稿原色。
|
|
17
|
+
5. 角色:先用 `RIG.drawCat` / `RIG.drawGirl` 的 fill 模式平涂,再在角色层上用 `source-atop` 跑一遍 P.strokes(cell 7、len 13),只在角色内部出笔。白裙用白、淡紫、奶黄四色抽色。之后只补五官,用淡紫细线,印象派不勾轮廓。
|
|
18
|
+
- 草帽、蓝丝带、腰带飘带都在飘。
|
|
19
|
+
- `pal.line` 一定要设成发色金:drawGirl 的 locks、lid 这些部位即使 lw=0 也会用 pal.line 描线,默认的深蓝会在脸旁边留下黑道。猫同理,要设 `line`/`whisker`。
|
|
20
|
+
|
|
21
|
+
## 母题动画
|
|
22
|
+
- **阳光斑闪烁跳动**:26 个斑块(6 块在桌面,20 块在地面)。每块的强度是 `0.5+0.5·sin(t·sp+ph)·sin(t·sp·0.53+2ph)`,再用 clamp 截断,所以亮灭的节奏不规则。斑块缓慢横漂 ±10px。每块是 40 笔亮黄白短笔,按 8fps 换种子沸腾。第一版用 screen 叠加、α0.75,在粉底上几乎看不见,改成 source-over、α0.95 才够亮。
|
|
23
|
+
- 墙上阳光区有 60 根斜向亮笔,按 6fps 换种子闪烁。
|
|
24
|
+
- 猫毛闪光:60 个候选点,用 `isPointInPath` 限定在猫身和猫头的左半边(受光侧),按 `sin(t·7+h·30)` 明灭。
|
|
25
|
+
- 全画 8fps 沸腾,热气白色。
|
|
26
|
+
|
|
27
|
+
## 性能
|
|
28
|
+
两遍全屏笔触加一遍角色笔触,约 69ms。转场时引擎要同时画前后两个时代,08→09 合计约 69+110ms,会超过 150ms,但只发生在转场的那十几帧里。
|
|
29
|
+
|
|
30
|
+
## v2 返修(审片:整屏每 7–8 帧笔触重洗,帧差 18)
|
|
31
|
+
- 笔触位置全部固定:`boil: 0`。**光固定种子不够**:P.strokes 的随机数是一条顺序流,palette 返回 null 时 jitter 会多吃 3 个数;而返回不返回 null 取决于底稿颜色,罂粟一摇、盆栽一摆,后面所有格子的笔就整体重洗。`stable(palette)` 包装成每格只吃 1 个数、永不返回 null。
|
|
32
|
+
- 角色笔触不用 alphaMask(端杯一动跳过的格子就变,整层重洗),改成自写循环:每格随机数用 `U.hash(i,j)`。顺带每帧从 115ms 降回 72ms。
|
|
33
|
+
- 「活」改由局部运动承担:光斑漂移 ±44px、明灭频率 5–11;罂粟摆幅加到 10+;云横走 45px/s;窗帘和盆栽摆动;窗外花草的笔按风向 ±0.22rad 转角;猫甩尾(×2.2)、扭头(look)。
|
|
34
|
+
- 静止段帧差(480×270,屏蔽计数器,去掉段尾转场帧):v1 均值 4.14、峰值 20.5,是频闪;v2 均值 0.57、峰值 1.9。原片 0.77。
|
package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/09_postimp.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# 09_postimp · 1889 梵高(标杆实现)
|
|
2
|
+
|
|
3
|
+
文件:`scripts/engine/scenes/09_postimp.js`,每帧约 110ms(全幅三遍笔触)。其他时代照它的结构写。
|
|
4
|
+
|
|
5
|
+
## 管线
|
|
6
|
+
平涂底稿(墙/地/窗/床大面积)→ 流场笔触重画(区域色板)→ 道具层(桌椅花瓶画框吊灯,单独小笔触 source-atop)→ 环境线稿(深蓝 4.5px,8fps 沸腾)→ 角色(平涂 → 细笔触 source-atop → 补线与五官)→ 会动的高光(灯晕虚线环外扩、星星闪、热气)。
|
|
7
|
+
|
|
8
|
+
## 关键参数
|
|
9
|
+
- 方向场:墙竖向 −π/2 ± 0.22·noise;地板沿透视线指向消失点 (960,330);星空沿最近漩涡切线+0.3t 旋转;灯晕沿圆周;床头竖、床单近水平。
|
|
10
|
+
- 三遍笔触:非墙非地 cell10 len22 w6.5;墙 cell14 len64 w8;地 cell12 len46 w8。描边 outline 0.8–0.9、混 40–45% 深蓝。8fps 换种子。
|
|
11
|
+
- 区域色板(P.swatch,mixBase 0.3–0.45):墙 `#7f9be6 #5f7fd8 #a7bbf2 #6c6fd2 #8ad0e6 #c3cbf6 #4f6cc8 #9a8fe0`;星空 `#22339a #2f4fb8 #5c86dc #8fb6ee #1b2a78 #3c6bd0`;地板 `#c0573c #a8453a #d7774a #8e3b30 #5f8f6a #c96a52 #e08a5c`。
|
|
12
|
+
- 猫身上 7 圈橘/浅橘螺旋纹(clip 到身体,0.6rad/s 转)——原片的「漩涡猫」。
|
|
13
|
+
|
|
14
|
+
## 坑
|
|
15
|
+
- 同一参数跑全图会糊成地毯:墙、地、其余必须分三遍。
|
|
16
|
+
- 小物件被大笔触打碎:一律拆成道具层。
|
|
17
|
+
- 只靠颜色抖动出来的是「同一个蓝的噪点」,梵高的感觉来自区域色板里十几种色相。
|
package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/10_nouveau.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# 10_nouveau · 1896 新艺术运动(慕夏海报)
|
|
2
|
+
|
|
3
|
+
文件:`scenes/10_nouveau.js`(约 300 行)。性能:warm 平均 29ms、最大 37ms,首帧(建缓存)≈80ms;确定性通过(同一 lt 两次逐像素相同);lt 0.35→0.65 运动差分 13.1% 像素。片中停留 0.70s(T09 有机波浪转场 0.24s,从 (1330,320) = 少女光环长出来)。
|
|
4
|
+
|
|
5
|
+
## 管线
|
|
6
|
+
1. **底版全缓存 `nv_bg`**:灰绿→米绿→桃色三段竖渐变(`#b9cba0`→`#cfd3a6`→`#ecc9a2`,只铺内框 34..1886×32..907);圆点花纹 = 环 r10 + 心点 r2.6,行距 54、列距 62,奇数行错 31(菱形交错),色 `rgba(120,140,100,.38)`;240×135 的 fbm 小图放大 α0.5 叠石版斑驳(比全屏算噪声快几百倍);马赛克地砖带 20×24 一格、9 色循环 `(k*7+(k>>2))%9` 打散;绿横幅 `#8fac80`;标题 `Marcellus-400` 76px、letterSpacing 12、先 7px 深棕描边再填奶白;金框 = 外 6px 金 `#c9a24a` + 内外两条 2px 深棕。
|
|
7
|
+
2. **可变线宽路径 `ribbon(pts, w(q))`**:点列先 Catmull-Rom 加密(每段 4–10 点),每点沿法线两侧各偏 w/2,拼成闭合多边形 fill。所有「鞭线」都是它:茎、叶、铁艺桌腿、横幅卷草、头发、热气。`swellW(wmax)` = 两头尖中间粗(sin 包络),这就是慕夏线条的粗细呼吸。螺旋收尾 `spiral(cx,cy,r0,a0,turns,dir)`:半径线性收到 15%。
|
|
8
|
+
3. **慕夏式「外轮廓粗、内线细」——整体剪影错位法**:角色(猫+少女+头发+披帛)全部画进离屏层 L(RIG 的 both 模式,lw 2 → 内线按部件顺序遮挡正确);再复制 L 用 `source-in` 染成深棕 `#4e3320`,在主画布按 (-1.5,-1.5)、(3.5,4.5)、(2,2.5) 三个偏移垫在 L 下面。结果:剪影外缘一圈 1.5px,右下侧 4–5px 厚边;内部线保持 2px。只多 3 次全屏 drawImage。
|
|
9
|
+
4. 颗粒 `P.grain('nv', .05, 暖棕, .14)` 盖最上层,像石版印刷。
|
|
10
|
+
|
|
11
|
+
## 母题动画(0.7s 内都要看得见)
|
|
12
|
+
- **太阳升起**:按原片测量(509 帧 (583,400) → 530 帧 (576,299),≈-5px/帧)写成 `sy = 400 - (lt-0.267)·288`、`sx = 583 - (lt-0.267)·20`,lt=0 时在 477(藏在山后),lt=0.7 到 275。山丘色带画在太阳之后 = 天然遮挡「从山后升起」。
|
|
13
|
+
- **铅条光芒转动**:14 根放射铅条从日心 r92→r420,角度 `+lt·0.9·0.25` 慢转并带 ±0.04 摆动;铅条随太阳移动,所以整窗玻璃分割都在变——这是窗里最显眼的动。
|
|
14
|
+
- **彩色玻璃边带**:沿拱形内缘(直边+椭圆弧 rx219 ry130)每 17px 放一块 14×14 色片,按切线旋转,6 色循环。
|
|
15
|
+
- **罂粟/百合摇摆**:花头水平位移 `sin(7.5t+φ)·13 + sin(3.1t+2φ)·5`,茎是 ribbon 的三控制点曲线只推上段;左右两丛相位相反;叶片 0.3 倍幅度。
|
|
16
|
+
- **光环转动**:少女光环 R172,18 颗圆钉 `+0.9t` 转,内圈 32 片玫瑰窗花瓣 `-0.63t` 反转;猫光环 R106 八瓣橙花 `-1.1t` + 金色虚线环 lineDashOffset 走。
|
|
17
|
+
- **头发**:先一大块发团(16 点 smooth,外缘按 `sin(6t+y·0.035)·9` 波动),再 7 绺背后卷发 + 2 绺肩前卷发:每绺 12 点 S 曲线 `sin(7.4q+φ-7t)·(6+20q)`(行波往下传)、末端接 1.2 圈螺旋、宽 14–18 → 2.5 递减,奶黄高光芯 + 深金细线。头顶外缘 6 个小卷做体积。所有点跟随 `G.A.headC` 的偏移(喝水仰头时一起动,越往下跟得越少)。
|
|
18
|
+
- **S 形装饰热气**:3 条奶白 ribbon(宽 26/20/14)+ 1.8px 棕描边 + 中线,`sin(4q+φ-6t)·(18+70q)` 行波,横向间距随高度 ×(1+2.6q) 散开,末端 34px 螺旋;整体 `lean = -90 - 160·cup` 往左倒——**踩坑**:choreo 把杯子举到嘴边,热气如果竖直升会横穿少女的脸,必须随 cup 往窗那边倒。
|
|
19
|
+
- choreo:端杯、仰头、眨眼、甩尾、呼吸全用 RIG;碟子留在桌上(杯子被端走后桌面不空)。
|
|
20
|
+
|
|
21
|
+
## 色板
|
|
22
|
+
线 `#4e3320`;金 `#c9a24a`/`#9c7a2e`;奶白 `#f6eedb`;皮肤 `#f6dcc4`;金发 `#e8bf55`/高光 `#f6dc8a`/暗 `#b9862a`;裙 `#f4ecda`;粉披帛 `#e6aaa5`/褶 `#d48e8c`;罂粟 `#d9706a`/`#b4504b`、花心 `#3f6a4a`+金点;百合 `#f7f2e6`;铁艺 `#3d7763`;猫 `#e39a4c`/`#fbf3e3`/纹 `#c0672c`、眼 `#e6c040`;光环粉 `#ebb8b2`、青环 `#5f9a8a`、猫光环红 `#b8473a`。
|
|
23
|
+
|
|
24
|
+
## 踩坑
|
|
25
|
+
- **`drawGirl(mode:'line')` 叠在最上层会把被遮住的部件轮廓(远侧袖子)画穿躯干**(09 标杆也有)。改成在离屏层里用 both 模式按部件顺序画线,再整体做粗外轮廓。
|
|
26
|
+
- 头发最初是 7 条 34px 宽的长带,像香肠/面条;慕夏头发 = 一块发团打底 + 细绺 S 卷 + 螺旋收尾,宽度 ≤18。
|
|
27
|
+
- 自检差分别拿 lt<0.33 的帧:引擎在转场开始后 20 帧内有 1.03 倍「拍点冲击」缩放,差分会全屏发红。
|
|
28
|
+
|
|
29
|
+
## 仍可改进
|
|
30
|
+
- 猫仍是 RIG 的坐姿(白色直腿),设定稿是趴卧的毛茸茸橘猫;慕夏味主要靠光环和粗细线撑。
|
|
31
|
+
- 标题用 Marcellus,设定稿是更圆的手绘新艺术字形;可以手写一套字母路径。
|
package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/11_cubism.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# 11_cubism · 1912 分析立体主义(毕加索/布拉克)
|
|
2
|
+
|
|
3
|
+
文件:`scenes/11_cubism.js`(约 280 行)。性能:warm 平均 13ms、最大 19ms,首帧(建缓存)≈100ms;确定性通过;lt 0.34→0.46 运动差分 6.9% 像素。片中停留 0.47s(T10 碎片转场 0.24s)。
|
|
4
|
+
|
|
5
|
+
## 管线
|
|
6
|
+
1. **底版全缓存 `cb_bg`——「透明叠面」**:核心函数 `plane(g, pts, col, alpha, r)`:每块面一条线性渐变,起点取第 0 顶点、终点随机取另一顶点,三个色标 = 混 25% 米白 → 原色 → 混 40% 深棕,alpha 0.18–0.7。叠法:18 块手排大面(照原片构图位置)+ 桌下 9 片放射扇面(自 (1000,1090) 发出,亮暗交替 α0.3)+ 70 片随机 3/4 边形(避开右上年份区)。多层半透明渐变叠起来就出现分析立体主义那种「透明、互相穿插、每面一亮一暗」的空间。
|
|
7
|
+
- 肌理面:4 块点画(9px 菱形格 r1.6)、4 块排线(7px 间距斜线)、左缘一页横线纸。
|
|
8
|
+
- 布拉克短划砂纹:9000 个 3–8×1.5px 小划,55% 米白 α0.28 / 45% 深棕 α0.16——原片那种「砖纹」质感就靠它。
|
|
9
|
+
- 46 条贯穿细直线(1.3px α0.55)= passage。
|
|
10
|
+
- 仿木纹 `wood()`:沿长边画 S/6 条波浪线,过节疤位置加高斯鼓包 `14·exp(-(u-k)²/0.01)`,节疤 4 圈椭圆。用于桌面和右侧木板(布拉克的梳纹假木)。藤编椅背 = 10px 菱形孔点 + 双向斜线。
|
|
11
|
+
2. **窗格碎面滑动**:窗景单独缓存成 560×540 大图(55 片蓝灰切面 + 3 条斜光束 + 埃菲尔铁塔 + 海鸥弧),四格各自 clip 后以不同偏移取景 `dx = sin(9lt+1.7i)·18 + 10fps 抖动 ±3`、`dy = cos(7lt+i)·8`——同一窗景在四格里错位 = 多视角拼合;每格另有一片半透明三角以 260px/s 横向滑过。
|
|
12
|
+
3. **CAFÉ 模版字跳动换位**:`AlfaSlabOne-400` 104px 画进离屏小层,12fps 卡点(`st=floor(lt·12)`),顺序表 `CAFÉ/ACFÉ/CAÉF/CFAÉ` 轮换,每步每字 y ±13、旋转 ±0.11rad(hash 取);然后 `destination-out` 切出横竖断口 = 模版字(断口透出底下的叠面,比画纸色条真实)。
|
|
13
|
+
4. **报纸 JOU**:缓存 300×190 小图(LibreBaskerville-700 84px「JOU」+ 12px 标题「LA BATAILLE / S'EST ENGAGÉ UN CHAT」+ 三栏灰色假字),每帧以 8fps 微颤(旋转 ±0.0125rad、x ±1.5px),右上折角按 `sin(20lt)` 翻。
|
|
14
|
+
5. **角色 = 自写切面器 `facetize`**:RIG 平涂(fill 模式,无线)进离屏层 → 读回该包围盒像素 → 抖动三角网(每格随机选对角线)→ 每个三角在质心取色,`×(0.8+0.38·rand)` 明暗、再做一条从顶点 0 到顶点 2 的亮→暗渐变 → **三角不裁剪**直接画回去(质心 alpha<120 的跳过)。不裁剪是关键:剪影边缘被切成锯齿直边,有的三角还伸出轮廓外——就是立体派「平面溢出轮廓」的感觉。
|
|
15
|
+
- 少女 cell 58(大面),发区再用 cell 26 细切一遍、只切「像金发的颜色」(`only: R>150 && B<130 && R-B>60`),猫 cell 26。
|
|
16
|
+
- 顶点每 8fps 抖 ±8% cell、16–35% 的三角明暗跳 ±12%(boil)→ 角色在「微动」,原片 548–562 帧猫区域就是这样。
|
|
17
|
+
6. **切完再补毕加索式的结构**:脸重铺两块肤色明暗面(切面会把金发色带进脸)+ 前半张脸蓝灰面 α0.82 + 正面杏眼(侧脸上画正面眼)+ 螺旋耳 + 红唇;白领两块明暗三角 + 三颗扣;裙摆从腰部 8 条放射切线 + 亮暗交替楔面;外轮廓用直线段 `segs()`,每段两端各外伸 10–16px(线画出界)。猫:六边形直线头轮廓、`bodyPts` 直线身轮廓、黄色菱形眼 + 竖瞳、侧面三角鼻。
|
|
18
|
+
7. 最上层 5 片 α0.2 的叠面压在人和猫身上并以 `sin(6lt)·8` 错动——把角色「嵌」进空间,不像贴在背景上。
|
|
19
|
+
|
|
20
|
+
## 色板
|
|
21
|
+
纸 `#d6c8ac`、米白 `#ece3cf`、赭 `#b8975f`、棕 `#6e5538`、深棕 `#3a2c1e`、灰 `#a8a395`、蓝灰 `#8e9eab`、暗灰 `#5a5852`;窗景 `#c9d3da/#8fa3b3/#e4e6e2/#6f8597/#b4c1cb/#5f7385`;裙 `#6a7a8b`、袖 `#3c4857`(必须比裙深,否则端杯的手臂整个融进裙子切面里)、皮肤 `#e2cfae`、金发 `#c9a256`;猫 `#c8773a`/`#e8dfc9`。
|
|
22
|
+
|
|
23
|
+
## 踩坑(重要)
|
|
24
|
+
- **不确定性:第一帧和之后不一样。** 两个原因叠加,都只在第一帧出现:① 要 `getImageData` 的离屏层第一次画时走 GPU,读回后 Chrome 把它转成 CPU 光栅,抗锯齿不同 → 质心取色不同 → 三角颜色不同;② 更主要的:离屏层的 context 状态(facetize 里设的 `lineJoin='round'`、segs 的 `lineCap='round'`)会残留到下一帧,第一帧用的是默认 miter/butt。修法:自建层 `getContext('2d',{willReadFrequently:true})`,**每帧开头用 `g.reset()`(清像素 + 清状态)而不是 `clearRect`**。用 hash 对比「同一 lt 连渲三次」才查出来。
|
|
25
|
+
- 切面 cell 34 时满身小三角,像 low-poly 3D 模型而不是立体派;58 才有「大块明暗面」。
|
|
26
|
+
- 第二遍发区细切一开始用圆形 clip,把半张脸也切成了金色——加了按颜色过滤的 `only`。
|
|
27
|
+
|
|
28
|
+
## 仍可改进
|
|
29
|
+
- 少女整体轮廓仍是 RIG 的写实曲线,切面只改了边缘;更彻底的做法是把肩、肘、膝都换成折线骨架再切。
|
|
30
|
+
- 原片色调更暗、明暗对比更强(大块深褐面更多),我这版偏亮。
|
package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/12_bauhaus.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# 12_bauhaus · 1923 包豪斯海报
|
|
2
|
+
|
|
3
|
+
文件:`scenes/12_bauhaus.js`(约 210 行)。性能:warm 平均 5ms、最大 9.5ms,首帧≈85ms;确定性通过;lt 0.34→0.46 运动差分 4.9% 像素(黑杆、格窗、同心弧、猫、球、人偶都在动)。片中停留 0.47s(T11 蓝方块/红圆/黄三角/圆孔转场 0.20s,原点 (1330,590) ≈ 红圆圆心)。
|
|
4
|
+
|
|
5
|
+
## 管线
|
|
6
|
+
1. **底版全缓存 `bh_bg`**:米白旧纸 `#ebe3cf` + 320×180 fbm 小图放大 α0.5(做旧斑驳)+ 贯穿细斜线 (40,170)→(1900,840)(压在窗后)+ 左上黑横条 (60,61,256,13)、红竖条 (292,105,24,468) + 竖排 bauhaus(`Poppins-800` 210px,`rotate(-π/2)` 后水平缩放到正好 820px 长,原点 (262,1000) 自下而上读)+ 灰小方块 + 地线 (345,898)-(1860,915) + 黄直角三角 + katze(Poppins-800 150px,红 `#d3262b`)+ 右下两行 Poppins-600 31px + 黑面桌/镀铬管腿(三色线性渐变)+ 布劳耶悬臂椅(同一路径描 15px 深灰 / 10px 镀铬 / 3px 高光偏移 2px)+ 两层颗粒(暗点 0.02 密度 α0.35,旧印刷黑斑)。
|
|
7
|
+
2. 红圆单独缓存 520²:底色 + `source-atop` 叠 fbm 浅色斑 α0.55,模仿丝网/石版的不匀墨。
|
|
8
|
+
3. 角色、构成全是几何体:没有任何曲线描边,只有圆、方、三角、粗杆。
|
|
9
|
+
|
|
10
|
+
## 母题动画
|
|
11
|
+
- **斜长黑杆像指针转**:按原片逐帧量的角度(575–579 帧 28°,581 帧 33°,583 帧 37°,585 帧 42°,587 帧 46°,591 帧 49.5°)写成 `deg = 28 + 21.5·easeOut(clamp((lt-0.26)/0.22))`。转轴 = 毂心 (1125,195)(原片对比 576/590 帧确认:毂不动、下端扫下来),杆 27px 从 -432 到 +150,细平行线偏 30px,红短杆偏 -30px,毂内弧跟着转。
|
|
12
|
+
- **蒙德里安格窗轮换**:4×4 格(内框 366..794 × 126..561,格 100×101、缝 9.5),6 个格子参与轮换,13fps 卡点 `step=floor(lt·13)`,每格相位不同、`(step+2·sw)%9 < 6` 才换(不是每拍都换,节奏不机械);轮换色只用红黄蓝米浅蓝灰。图样格(9px 方格纸)、四分之一圆格保留。
|
|
13
|
+
- **同心弧**:红圆右侧 6 条弧,起点相位 `sin(9lt-0.7i)·0.05` 波动、半径 `±3` 呼吸、弧长在 0.4s 内从 55% 扫到 100%——像声波往外推。
|
|
14
|
+
- **杯上热气**:一根 2.2px 正弦细线(26 个周期/170px、`-18t` 行波),线性渐变淡出。
|
|
15
|
+
- **猫拨球滚一下**:右前爪 `tap = sin(clamp((lt-0.05)/0.16)·π)` 往前伸 36px 再收;蓝球 r31 在 `lt 0.13→0.47` 以 easeOut 从 x712 滚到 816,**转角 = 位移/半径**(白直径线+白点看得出在滚),滚动中身后两条速度线。尾巴 = 26px 粗橙弧 + 同宽虚线深橙条纹,角度跟 `choreo.tail·0.5`。
|
|
16
|
+
|
|
17
|
+
## 角色的几何化(锚点全来自 RIG)
|
|
18
|
+
- **施莱默人偶**:头 = 圆 r70(`G.A.headC + (14,-18)`),金色几何发片 = 后半个头的扇形(-1.95→1.15rad)+ 额前三角 + 发髻圆 r34 + 背后半圆发片(`G.A.back`);脸 = 黑竖条眼(眨眼变横条)、红方腮、短黑口。头部整组绕 `G.A.neck` 按 `G.tilt` 转(喝时仰头)。躯干 = 蓝梯形 + 后半黑梯形(随 breathe 起伏);裙 = 黑扇面 r178 + 蓝梯形;四肢 = 粗黑圆头杆,关节 = 米白圆盘 + 5px 黑圈 + 黑心点。近侧手臂直接用 `G.A.shoulder/elbow/hand`(RIG 的 IK 端杯),远侧手臂平放桌上(复现原片那只伸向桌面的手)。
|
|
19
|
+
- **猫**:身体圆 r100(`K.box` 推算的 (536,805),随 breathe 缩放)+ 左侧 4 条深橙横条(clip 在圆里)+ 右下米白扇面(橙白块面);头 = 104 方块(`K.headC + (14,48)`,随尾巴相位微转 ±0.08rad)+ 黄三角耳 + 米白下半脸 + 深橙额带;眼 = 白圆 + 黑竖条瞳。
|
|
20
|
+
|
|
21
|
+
## 色板
|
|
22
|
+
纸 `#ebe3cf`;黑 `#161514`;红 `#d3262b`;蓝 `#2a58b4`;黄 `#efc12f`;浅蓝 `#b9cee0`/`#a6c0da`;灰 `#c6c3bb`;米 `#f2ecdf`;橙 `#ee8a2a`/`#c25a14`;镀铬 `#c9c9c6`。
|
|
23
|
+
|
|
24
|
+
## 踩坑
|
|
25
|
+
- 第一版格子按 107px 算,右侧溢出黑框 16px——格窗尺寸要从「内框宽 - 3 缝」反推。
|
|
26
|
+
- 轮换色里放了黑色,换到黑格时整窗突然变重、像坏格子,删掉。
|
|
27
|
+
- 人偶嘴原本照原片画成伸出头外的长黑杠,放在少女脸上像叼烟,改成头内短横。
|
|
28
|
+
|
|
29
|
+
## 仍可改进
|
|
30
|
+
- 猫头/身体的位置相对 RIG 骨架做了下移(为了方头压在圆身上),转场时与前后时代的猫头位置差约 50px。
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# 13_pop · 1962 波普(利希滕斯坦漫画格+沃霍尔四宫格)
|
|
2
|
+
|
|
3
|
+
文件:`scenes/13_pop.js`(约 230 行)。性能:warm 平均 6ms、最大 9ms,首帧≈45ms;确定性通过;lt 0.34→0.46 运动差分 11.6% 像素。片中停留 0.47s(T12 黄闪电网点化转场 0.16s)。
|
|
4
|
+
|
|
5
|
+
## 管线
|
|
6
|
+
1. **本戴点 = `createPattern`,零成本**:一个 pitch×pitch 的小 tile 画 4 角 + 中心 5 个圆 = 45° 网格(对角间距 pitch/√2)。墙:pitch 24、r5.6、蓝 `#2f5cc8` 底白(对角 17px,与原片 FFT 量的 17px 周期一致);皮肤:pitch 13、r3.3、红 `#e2483c` 底肤色 `#fae0cc`;黄地:pitch 14 r2.2 α0.18 隐约印刷点。皮肤用 `fillStyle = pattern; fill(path)`,比 `PAINT.halftone`(逐点 getImageData)快两个数量级,而且图案对齐屏幕坐标、不会随角色移动「游泳」。
|
|
7
|
+
2. **底版全缓存 `pop_bg`**:漫画格外框 6px 黑;白踢脚线 754–792(上下 6px 黑线);黄地 796→990/1003(地平线略斜);红带;MEANWHILE...(`Bangers-400` 46px,黄底黑框 5px);沃霍尔白画框+窗台蓝线;蓝椅;纸面颗粒。
|
|
8
|
+
3. **所有角色都是「粗黑描边 5px + 平涂」**,`ink(c, path, fill, lw)` 一个函数到底;高光用白色粗短线;阴影用 `hatch()`:椭圆 clip 内画 10px 间距、3.5px 宽的黑斜线。
|
|
9
|
+
|
|
10
|
+
## 母题动画
|
|
11
|
+
- **沃霍尔四格换配色**:4 套配色(底/脸/下半脸/眼影/口红),`step = floor(lt·11)`(≈每 5.5 帧换一次,原片 601、605/606、612 帧换),格 i 用第 `(i+step)%4` 套。猫脸 = RIG.smooth 的 9 点头型 + 下半脸椭圆 + 右侧黑块(丝网错版的黑影)+ 眼影/口红/鼻/胡须;右上格两道白色玻璃反光。
|
|
12
|
+
- **思考泡泡三点依次闪**:原片「点1 612–615、点2 614–617、点3 616–618 帧」→ 每 12 帧一循环,点 k 在 `((f-2k) mod 12) < 4` 时亮(r20、上跳 6px),否则 r12。泡泡 = 10 个圆先统一描 11px 黑再统一填白(并集轮廓的最省写法)。
|
|
13
|
+
- **WIGGLE WIGGLE 爆炸框抖**:30fps 卡点 hash 抖动 ±8px/±6px/±0.03rad;外层白爆炸(14 尖,半径 128/178 带随机)+ 内层黄爆炸 + 两行 `Bangers-400` 82px 红字(12px 黑描边 + 4px 黑投影);外围 10 根黑三角动作线长度 `0.85+0.25·sin(40lt+2i)` 脉动。
|
|
14
|
+
- **猫扭屁股准备扑**:用 RIG.cat 的锚点做时代化变形——趴低:身体用 10 点自定轮廓(以 `K.box` 为原点),头 `K.headC + (22,104)` 压低贴身,前爪白椭圆往前伸;扭:`wig = sin(lt·2π·6)·16`(6Hz,0.47s 里 ~3 次),点的权重 `clamp((560-x)/140)` → 越靠屁股位移越大,并同时上翘 `|wig|·0.6`;条纹、尾巴跟同一变形走;屁股旁三道弧形动作线跟着 wig 移动。
|
|
15
|
+
- **少女端杯**:RIG IK 端杯;杯 = 白杯 + 蓝斜条纹 + 咖啡;热气两条 14Hz 抖动的黑波浪线。
|
|
16
|
+
|
|
17
|
+
## 少女(利希滕斯坦)
|
|
18
|
+
- 金色大波浪:发团(19 点 smooth,后缘 `sin(2.1i+4t)·14` 鼓包)+ 7 个卷团圆(r30–48,沿后缘排),**先全部描 10px 黑、再全部填黄 = 并集轮廓**;每个卷团里一道 4.5px 黑 C 形弧 + 一道深金 `#d9a514` 弧 = 利希滕斯坦那种雕塑感卷发;5 条黑色 S 发丝、2 道白高光。
|
|
19
|
+
- 皮肤(脸、颈、手、腿)全部红本戴点;红裙(截到膝,裙摆 clip 用曲线不是矩形)+ 白高光条;两条点点腿 + 红高跟(7 点多边形);大眼(白眼 12×8.5、蓝虹膜 r7、高光点)+ 3 根粗睫毛 + 眉毛上移 5px;红唇放大。
|
|
20
|
+
|
|
21
|
+
## 色板
|
|
22
|
+
黑 `#141414`;纸 `#f3eedb`;蓝 `#2f5cc8`;黄 `#f7d52c`;红 `#d8232a`/`#a8161c`;白 `#fbf8ee`;皮 `#fae0cc` + 点 `#e2483c`;金发 `#f8d62c`/`#d9a514`;猫 `#f39a2c`/`#c4561a`;沃霍尔底色 `#9ccf3a/#e0359a/#2fc0b0/#f08a2a`。
|
|
23
|
+
|
|
24
|
+
## 踩坑
|
|
25
|
+
- 猫头按 RIG 原位置画会悬在趴低的身体上方(空一截),趴姿下头要下移 ~100px 压进身体。
|
|
26
|
+
- 头发第一版只是一整片带轻微波浪的黄色,远看像披了块布;利希滕斯坦的金发辨识度来自「卷团 + 黑色 C 弧」。
|
|
27
|
+
|
|
28
|
+
## 仍可改进
|
|
29
|
+
- 原片少女有泪珠和白领子(经典利希滕斯坦哭泣女孩),设定稿去掉了,我也没加;想更「漫画」可以加一个对白框。
|