dsh-drawai 0.4.2 → 0.4.4

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 (379) hide show
  1. package/README.md +7 -5
  2. package/lib/client.js +142 -16
  3. package/lib/index.js +7945 -7719
  4. package/lib/motion/asset-pack.js +394 -394
  5. package/lib/motion/assets.js +291 -291
  6. package/lib/motion/demo-assets-lock.js +10 -10
  7. package/lib/motion/mgstyles/briefs/23-ink-wash.md +147 -0
  8. package/lib/motion/mgstyles/catalog.d/23-ink-wash.json +28 -0
  9. package/lib/motion/mgstyles/catalog.json +127 -14
  10. package/lib/motion/mgstyles/upstream/demos/23-ink-wash/brush.js +149 -0
  11. package/lib/motion/mgstyles/upstream/demos/23-ink-wash/film.js +202 -0
  12. package/lib/motion/mgstyles/upstream/manifest.json +28 -3
  13. package/lib/motion/mgstyles/upstream/prompts/23-ink-wash.md +59 -0
  14. package/lib/motion/mgstyles/vendor/README.md +28 -28
  15. package/lib/motion/mgstyles/vendor/modules/d3/LICENSE +13 -13
  16. package/lib/motion/mgstyles/vendor/modules/d3/dist/d3.min.js +2 -2
  17. package/lib/motion/mgstyles/vendor/modules/opentype.js/LICENSE +20 -20
  18. package/lib/motion/mgstyles/vendor/modules/opentype.js/dist/opentype.mjs +14460 -14460
  19. package/lib/motion/mgstyles/vendor/modules/simplex-noise/LICENSE +21 -21
  20. package/lib/motion/mgstyles/vendor/modules/simplex-noise/dist/esm/simplex-noise.js +465 -465
  21. package/lib/motion/mgstyles/vendor/modules/topojson-client/LICENSE +13 -13
  22. package/lib/motion/mgstyles/vendor/modules/topojson-client/dist/topojson-client.min.js +2 -2
  23. package/lib/motion/project.js +5 -1
  24. package/lib/motion/qa.js +116 -6
  25. package/lib/motion/render.js +179 -179
  26. package/lib/motion/scene-kit.js +1 -1
  27. package/lib/motion/shotcraft/upstream/SKILL.md +286 -286
  28. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -54
  29. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -200
  30. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -45
  31. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -20
  32. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -65
  33. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -151
  34. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -129
  35. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -75
  36. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -40
  37. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -11
  38. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -10
  39. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -49
  40. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -210
  41. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -423
  42. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -170
  43. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -157
  44. package/lib/motion/shotcraft/upstream/demos/README.md +120 -120
  45. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -112
  46. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -647
  47. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -316
  48. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -82
  49. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -115
  50. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -243
  51. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +388 -388
  52. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -250
  53. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -305
  54. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -246
  55. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -390
  56. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -138
  57. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -542
  58. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -315
  59. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -299
  60. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -173
  61. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -348
  62. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -366
  63. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -279
  64. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -184
  65. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -390
  66. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -155
  67. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -303
  68. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -290
  69. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -278
  70. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -307
  71. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -215
  72. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -299
  73. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -232
  74. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -290
  75. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -273
  76. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -167
  77. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -536
  78. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -164
  79. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -175
  80. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -197
  81. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -241
  82. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -279
  83. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -230
  84. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -345
  85. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -275
  86. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -229
  87. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -312
  88. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -222
  89. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -295
  90. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -329
  91. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -315
  92. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -264
  93. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -260
  94. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -263
  95. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -123
  96. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -187
  97. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -175
  98. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -305
  99. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -350
  100. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -352
  101. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -218
  102. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -297
  103. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -157
  104. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -218
  105. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -202
  106. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -265
  107. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -457
  108. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -446
  109. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -249
  110. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -278
  111. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -332
  112. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -358
  113. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -201
  114. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -200
  115. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -208
  116. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -341
  117. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -389
  118. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -293
  119. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -183
  120. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -245
  121. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -222
  122. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -223
  123. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -217
  124. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -343
  125. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -357
  126. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -187
  127. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -333
  128. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -274
  129. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -270
  130. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -430
  131. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -252
  132. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -106
  133. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -288
  134. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -362
  135. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -168
  136. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -310
  137. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -261
  138. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -459
  139. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -294
  140. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -161
  141. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -248
  142. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -359
  143. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -227
  144. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -162
  145. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -248
  146. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -186
  147. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -355
  148. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -272
  149. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -262
  150. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -217
  151. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -285
  152. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -205
  153. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -178
  154. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -147
  155. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -143
  156. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -134
  157. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -217
  158. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -198
  159. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -221
  160. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -312
  161. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -261
  162. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -121
  163. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -153
  164. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -179
  165. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -140
  166. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -309
  167. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -191
  168. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -292
  169. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -135
  170. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -124
  171. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -255
  172. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -173
  173. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -225
  174. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -141
  175. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -137
  176. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -147
  177. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -409
  178. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -280
  179. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -271
  180. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -385
  181. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -312
  182. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -303
  183. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -77
  184. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -311
  185. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -307
  186. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -349
  187. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -255
  188. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -244
  189. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -217
  190. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -652
  191. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -153
  192. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -238
  193. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -324
  194. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -354
  195. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -101
  196. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -129
  197. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -297
  198. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -57
  199. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -155
  200. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -175
  201. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -153
  202. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -146
  203. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -226
  204. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -1
  205. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -193
  206. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -121
  207. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -199
  208. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -183
  209. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -257
  210. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -382
  211. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -111
  212. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -50
  213. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -95
  214. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -41
  215. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -52
  216. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -39
  217. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -39
  218. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -57
  219. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -51
  220. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -46
  221. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -52
  222. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -43
  223. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -42
  224. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -48
  225. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -52
  226. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -45
  227. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -46
  228. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -44
  229. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -63
  230. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -54
  231. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -58
  232. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -35
  233. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -53
  234. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -42
  235. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -50
  236. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -46
  237. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -56
  238. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -49
  239. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -50
  240. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -53
  241. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -53
  242. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -55
  243. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -52
  244. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -60
  245. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -57
  246. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -51
  247. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -41
  248. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -53
  249. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -60
  250. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -55
  251. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -57
  252. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -47
  253. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -37
  254. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -54
  255. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -36
  256. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -56
  257. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -56
  258. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -40
  259. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -60
  260. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -57
  261. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -73
  262. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -87
  263. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -55
  264. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -50
  265. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -59
  266. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -38
  267. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -38
  268. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -59
  269. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -39
  270. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -61
  271. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -52
  272. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -50
  273. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -66
  274. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -43
  275. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -38
  276. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -38
  277. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -56
  278. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -44
  279. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -38
  280. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -63
  281. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -57
  282. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -63
  283. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -58
  284. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -45
  285. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -55
  286. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -49
  287. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -42
  288. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -42
  289. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -45
  290. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -48
  291. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -55
  292. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -43
  293. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -41
  294. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -42
  295. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -59
  296. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -55
  297. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -65
  298. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -42
  299. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -64
  300. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -64
  301. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -54
  302. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -91
  303. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -51
  304. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -66
  305. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -38
  306. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -66
  307. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -58
  308. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -61
  309. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -64
  310. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -45
  311. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -41
  312. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -51
  313. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -42
  314. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -63
  315. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -57
  316. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -75
  317. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -59
  318. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -67
  319. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -60
  320. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -66
  321. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -40
  322. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -45
  323. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -62
  324. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -55
  325. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -37
  326. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -55
  327. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -50
  328. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -43
  329. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -55
  330. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -51
  331. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -51
  332. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -56
  333. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -49
  334. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -57
  335. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -36
  336. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -64
  337. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -47
  338. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -170
  339. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -157
  340. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -103
  341. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -44
  342. package/lib/motion/shotcraft/upstream/template/package.json +20 -20
  343. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -6
  344. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -17
  345. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -65
  346. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -48
  347. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -24
  348. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -192
  349. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -111
  350. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -150
  351. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -158
  352. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -468
  353. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -552
  354. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -411
  355. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -200
  356. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -324
  357. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +388 -388
  358. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -4
  359. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -7
  360. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -68
  361. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -1
  362. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -24
  363. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -74
  364. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -91
  365. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -213
  366. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -15
  367. package/lib/motion/style-frames.js +306 -306
  368. package/lib/motion/sync.js +214 -214
  369. package/lib/motion-library.js +1 -1
  370. package/lib/motion-project.js +105 -105
  371. package/lib/motion-render-worker.js +174 -174
  372. package/lib/routing/router.js +222 -222
  373. package/lib/routing/vendor/README.md +96 -96
  374. package/lib/routing/vendor/libavoid-routing.js +753 -753
  375. package/lib/routing/vendor/libavoid.min.js +59 -59
  376. package/lib/svg-export.js +1344 -0
  377. package/lib/video-trace-pool.js +128 -128
  378. package/package.json +3 -2
  379. package/LICENSE +0 -4175
@@ -1,67 +1,67 @@
1
- ---
2
- name: bezier-source-converge-merge
3
- 一句话: 左侧四个来源节点各有一条细贝塞尔曲线连向右侧同一汇聚点,曲线先错峰由左向右 draw-on,节点沿自己的曲线滑向汇聚点并三段式加速缩小到消失,强调色数据包全程沿路径滑行,吞并完成后曲线从左端反向擦除只留品牌标志(demo:白瓷圆片托 video-shotcraft 镜刻标志)
4
- 适用: "多源整合/统一接入/数据汇聚"的核心机制镜头;集成、聚合、单一入口类产品的说明段落
5
- 时长: 约 5.6s(168f@30fps)
6
- 能量: 中(长镜慢速推进,靠数据包滑行维持活性;吞并瞬间是唯一小高点)
7
- ---
8
-
9
- ## 意图
10
- "我们把四个来源统一了"是一句抽象话。这个动效把它变成可看的物理过程:先建立四条独立
11
- 的通路(draw-on 是"连上了"),再让四个来源真的顺着通路走进同一个点并被吸进去(缩小
12
- 到 0 是"被吞并"),最后擦掉通路只留品牌标志("现在只有一个")。三段叙事各自有明确的
13
- 起止,观众不需要旁白就能读出因果。
14
-
15
- ## 动效核心
16
- - 路径几何:每条 `d = "M -22,y L 74,y C 186,y 214,120 332,120"`——起点在画框外 -22,
17
- 74 处是来源节点的驻留位,之后一段三次贝塞尔弯向汇聚点 (332,120)。四条只差起始 y
18
- (36/92/148/204),所以它们的曲率天然不同,汇入角度也不同
19
- - draw-on 用 `stroke-dasharray = len` + `dashoffset = len*(1-draw)`,`seg(t, 0.04+i*0.045,
20
- +0.17, E.outQuad)`——0.045 的错峰让四条线像被依次接通而不是一起亮
21
- - 节点定位用 `getPointAtLength`:x=74 恰是直线段终点,直接标定路径比例
22
- `f0 = 96/len`(原 40 步扫描精度不足,四节点会排不成一列),运行时 `frac = f0 + (1-f0)*conv`,`conv = seg(t, 0.34, 0.74, E.inOutCubic)`——
23
- 节点是**沿真实曲线**走的,不是两点间插值
24
- - 三段式缩小:`conv < 0.75` 时 44→15px(缓慢瘦身),`conv ≥ 0.75` 时 15→0px(最后
25
- 1/4 行程掉光)——后段的尺寸变化率是前段的 4 倍多,这就是"被吸进去"的加速感;
26
- 字号跟着 `size*0.26` 同步缩,标签不会脱离节点
27
- - 数据包:`pkCycle = (seg(t, 0.1, 0.74, E.linear)*2) % 1` 走两个整数周期,各路加
28
- `i*0.13` 相位偏移;透明度用 `1 - |cycle-0.5|*0.6` 让包在路径中段最亮、两端淡——
29
- 避免看到包在起点凭空出现
30
- - 擦除:`erase = seg(t, 0.78, 0.9, E.outQuad)` 把 dashoffset 推成负值(`-erase*len`),
31
- 于是虚线从**起点**方向退走,方向与 draw-on 相反,读作"通路收回"
32
- - 徽标:`seg(t, 0.16, 0.26)` 淡入并从 0.7 放到 1,吞并时刻(0.7→0.78 outBack 加 12%,
33
- 0.78→0.86 outQuad 减回)做一次接收脉冲;末尾 `endCap` 字幕在 0.84 后淡入
34
-
35
- ## 参数表
36
- | 参数 | 典型值 | 调节手感 |
37
- |------|--------|----------|
38
- | 来源数 | 4 条(y=36/92/148/204,间距 56) | 4 条是曲率差异明显又不打结的甜点;>6 条中间几条的贝塞尔几乎重合,汇入角读不出区别 |
39
- | draw-on | 起点 `0.04+i*0.045`,窗 0.17,outQuad | 0.045 的错峰约 7f;归零会读作四条线一起刷出,失去"逐路接通"的语义 |
40
- | 汇聚窗 | 0.34→0.74(inOutCubic) | 占全片 40%,是主段落;inOut 的缓起是"启动"、缓收是"到位",换 linear 立刻变成匀速传送带 |
41
- | 三段缩小 | 44→15px(前 75%)→ 0(后 25%) | 拐点 0.75 越靠后吸入越突然;把它挪到 0.5 会变成"一路缩小",吞并的那一下就没了 |
42
- | 数据包周期 | 2 个整数周期(0.1→0.74 线性) | 必须是整数周期,否则末帧包停在半路;周期加密到 4 会读作数据流很急,也更容易和节点重叠 |
43
- | 包相位偏移 | `i*0.13` | 错开四路的包,避免它们排成一行同时汇入;0 会看到四个包整齐并进,像一次发车 |
44
- | 擦除 | 0.78→0.9,dashoffset 取负 | 12f 完成;擦除必须在节点全部消失(conv=0.74 结束、节点 0.92 前淡完)之后,否则线先没了节点悬在空中 |
45
- | 徽标脉冲 | outBack +12%(0.7→0.78)→ 回落(0.78→0.86) | 12% 是"接收到了"的量级;>25% 会抢过汇聚本身的注意力 |
46
-
47
- ## 已知坑
48
- - `getTotalLength` / `getPointAtLength` 必须在 SVG 已挂到文档且完成布局之后才有效,
49
- 代码用 `ready` 标志在首帧 `prime()` 里做——移植到 Remotion 时首帧渲染可能拿不到
50
- 长度(fallback 写了 `|| 380`)。稳妥做法是在 `useEffect`/layout 后再算,或预先算好
51
- 常量表,否则首帧会出现一次错位跳变
52
- - `f0` 直接按直线段长 96 标定(`96/len`)。旧版用 40 步线性扫描,精度只有 1/40,节点驻留位
53
- 会偏离 74、四个节点排不成一列——改路径(尤其直线段长度)后要同步改这个标定
54
- - 节点 opacity 在 `conv > 0.92` 后才开始淡出,而 conv 在 t=0.74 就到 1,所以节点是在
55
- 尺寸缩到 0 时消失而不是淡出消失。这是有意的(被吸进去不该淡出),但如果把三段式
56
- 拐点改晚,会看到节点在有尺寸时突然消失
57
- - 节点是灰阶线性图标(demo:页面截图/镜头卡/代码/声音四种素材)的白瓷占位圆(灰度分层仅用于区分四路),落地可换成真实来源
58
- logo;强调色只留给数据包与涟漪,不要给节点上色,否则汇聚点的视觉主体被夺走。汇聚点的标志要托在一枚不透明的
59
- 圆片上——曲线终点与数据包都落在汇聚点中心,开口形标志(如镜刻取景框)直接放上去会从缺口里露出线头
60
- - 汇聚点 (332,120) 与 SVG 视口 440×240、`overflow:visible` 是绑定的一组坐标。改画布
61
- 比例要整套重标,路径起点 -22 依赖 `overflow:visible` 才能露出画框外的一截
62
- - 字幕 "From screenshot to showreel"(video-shotcraft 宣传语),出现在 0.84 之后——如果要配旁白,这句的
63
- 出现点应对齐旁白落词而非动画节点
64
-
65
- ## 参考实现
66
- demos/ui-entrance/bezier-source-converge-merge/
67
- (BezierSourceConvergeMerge.tsx)
1
+ ---
2
+ name: bezier-source-converge-merge
3
+ 一句话: 左侧四个来源节点各有一条细贝塞尔曲线连向右侧同一汇聚点,曲线先错峰由左向右 draw-on,节点沿自己的曲线滑向汇聚点并三段式加速缩小到消失,强调色数据包全程沿路径滑行,吞并完成后曲线从左端反向擦除只留品牌标志(demo:白瓷圆片托 video-shotcraft 镜刻标志)
4
+ 适用: "多源整合/统一接入/数据汇聚"的核心机制镜头;集成、聚合、单一入口类产品的说明段落
5
+ 时长: 约 5.6s(168f@30fps)
6
+ 能量: 中(长镜慢速推进,靠数据包滑行维持活性;吞并瞬间是唯一小高点)
7
+ ---
8
+
9
+ ## 意图
10
+ "我们把四个来源统一了"是一句抽象话。这个动效把它变成可看的物理过程:先建立四条独立
11
+ 的通路(draw-on 是"连上了"),再让四个来源真的顺着通路走进同一个点并被吸进去(缩小
12
+ 到 0 是"被吞并"),最后擦掉通路只留品牌标志("现在只有一个")。三段叙事各自有明确的
13
+ 起止,观众不需要旁白就能读出因果。
14
+
15
+ ## 动效核心
16
+ - 路径几何:每条 `d = "M -22,y L 74,y C 186,y 214,120 332,120"`——起点在画框外 -22,
17
+ 74 处是来源节点的驻留位,之后一段三次贝塞尔弯向汇聚点 (332,120)。四条只差起始 y
18
+ (36/92/148/204),所以它们的曲率天然不同,汇入角度也不同
19
+ - draw-on 用 `stroke-dasharray = len` + `dashoffset = len*(1-draw)`,`seg(t, 0.04+i*0.045,
20
+ +0.17, E.outQuad)`——0.045 的错峰让四条线像被依次接通而不是一起亮
21
+ - 节点定位用 `getPointAtLength`:x=74 恰是直线段终点,直接标定路径比例
22
+ `f0 = 96/len`(原 40 步扫描精度不足,四节点会排不成一列),运行时 `frac = f0 + (1-f0)*conv`,`conv = seg(t, 0.34, 0.74, E.inOutCubic)`——
23
+ 节点是**沿真实曲线**走的,不是两点间插值
24
+ - 三段式缩小:`conv < 0.75` 时 44→15px(缓慢瘦身),`conv ≥ 0.75` 时 15→0px(最后
25
+ 1/4 行程掉光)——后段的尺寸变化率是前段的 4 倍多,这就是"被吸进去"的加速感;
26
+ 字号跟着 `size*0.26` 同步缩,标签不会脱离节点
27
+ - 数据包:`pkCycle = (seg(t, 0.1, 0.74, E.linear)*2) % 1` 走两个整数周期,各路加
28
+ `i*0.13` 相位偏移;透明度用 `1 - |cycle-0.5|*0.6` 让包在路径中段最亮、两端淡——
29
+ 避免看到包在起点凭空出现
30
+ - 擦除:`erase = seg(t, 0.78, 0.9, E.outQuad)` 把 dashoffset 推成负值(`-erase*len`),
31
+ 于是虚线从**起点**方向退走,方向与 draw-on 相反,读作"通路收回"
32
+ - 徽标:`seg(t, 0.16, 0.26)` 淡入并从 0.7 放到 1,吞并时刻(0.7→0.78 outBack 加 12%,
33
+ 0.78→0.86 outQuad 减回)做一次接收脉冲;末尾 `endCap` 字幕在 0.84 后淡入
34
+
35
+ ## 参数表
36
+ | 参数 | 典型值 | 调节手感 |
37
+ |------|--------|----------|
38
+ | 来源数 | 4 条(y=36/92/148/204,间距 56) | 4 条是曲率差异明显又不打结的甜点;>6 条中间几条的贝塞尔几乎重合,汇入角读不出区别 |
39
+ | draw-on | 起点 `0.04+i*0.045`,窗 0.17,outQuad | 0.045 的错峰约 7f;归零会读作四条线一起刷出,失去"逐路接通"的语义 |
40
+ | 汇聚窗 | 0.34→0.74(inOutCubic) | 占全片 40%,是主段落;inOut 的缓起是"启动"、缓收是"到位",换 linear 立刻变成匀速传送带 |
41
+ | 三段缩小 | 44→15px(前 75%)→ 0(后 25%) | 拐点 0.75 越靠后吸入越突然;把它挪到 0.5 会变成"一路缩小",吞并的那一下就没了 |
42
+ | 数据包周期 | 2 个整数周期(0.1→0.74 线性) | 必须是整数周期,否则末帧包停在半路;周期加密到 4 会读作数据流很急,也更容易和节点重叠 |
43
+ | 包相位偏移 | `i*0.13` | 错开四路的包,避免它们排成一行同时汇入;0 会看到四个包整齐并进,像一次发车 |
44
+ | 擦除 | 0.78→0.9,dashoffset 取负 | 12f 完成;擦除必须在节点全部消失(conv=0.74 结束、节点 0.92 前淡完)之后,否则线先没了节点悬在空中 |
45
+ | 徽标脉冲 | outBack +12%(0.7→0.78)→ 回落(0.78→0.86) | 12% 是"接收到了"的量级;>25% 会抢过汇聚本身的注意力 |
46
+
47
+ ## 已知坑
48
+ - `getTotalLength` / `getPointAtLength` 必须在 SVG 已挂到文档且完成布局之后才有效,
49
+ 代码用 `ready` 标志在首帧 `prime()` 里做——移植到 Remotion 时首帧渲染可能拿不到
50
+ 长度(fallback 写了 `|| 380`)。稳妥做法是在 `useEffect`/layout 后再算,或预先算好
51
+ 常量表,否则首帧会出现一次错位跳变
52
+ - `f0` 直接按直线段长 96 标定(`96/len`)。旧版用 40 步线性扫描,精度只有 1/40,节点驻留位
53
+ 会偏离 74、四个节点排不成一列——改路径(尤其直线段长度)后要同步改这个标定
54
+ - 节点 opacity 在 `conv > 0.92` 后才开始淡出,而 conv 在 t=0.74 就到 1,所以节点是在
55
+ 尺寸缩到 0 时消失而不是淡出消失。这是有意的(被吸进去不该淡出),但如果把三段式
56
+ 拐点改晚,会看到节点在有尺寸时突然消失
57
+ - 节点是灰阶线性图标(demo:页面截图/镜头卡/代码/声音四种素材)的白瓷占位圆(灰度分层仅用于区分四路),落地可换成真实来源
58
+ logo;强调色只留给数据包与涟漪,不要给节点上色,否则汇聚点的视觉主体被夺走。汇聚点的标志要托在一枚不透明的
59
+ 圆片上——曲线终点与数据包都落在汇聚点中心,开口形标志(如镜刻取景框)直接放上去会从缺口里露出线头
60
+ - 汇聚点 (332,120) 与 SVG 视口 440×240、`overflow:visible` 是绑定的一组坐标。改画布
61
+ 比例要整套重标,路径起点 -22 依赖 `overflow:visible` 才能露出画框外的一截
62
+ - 字幕 "From screenshot to showreel"(video-shotcraft 宣传语),出现在 0.84 之后——如果要配旁白,这句的
63
+ 出现点应对齐旁白落词而非动画节点
64
+
65
+ ## 参考实现
66
+ demos/ui-entrance/bezier-source-converge-merge/
67
+ (BezierSourceConvergeMerge.tsx)
@@ -1,60 +1,60 @@
1
- ---
2
- name: card-stack
3
- 一句话: 一组模板卡(demo 9 张)从屏幕下方逐张 spring 弹入、越落越快叠成一摞,全员落位后整摞一次性展成扇面——每张按序号偏转 6.5°、横移 138px,最后中心卡被抽出
4
- 适用: 需要交代"我们有一组东西"的产品段落;卡片墙/模板库/方案列表的建立镜头,也能当 logo 前的一拍蓄势
5
- 时长: 约 5.0s(150f@30fps)
6
- 能量: 中高(入场是连续小爆发,展开段收成一次平滑的整体动作)
7
- ---
8
-
9
- ## 意图
10
- 一摞卡先聚成一个物体,再摊开成一组物体——顺序很关键:先给"整体"再给"个体"。
11
- 观众第一眼记住的是有分量的一摞(数量感),第二眼才看清每张不一样(多样性)。
12
- 展开动作留到最后一次性完成,是为了不和入场的节拍打架。
13
-
14
- ## 动效核心
15
- (demo 版本:瓷白模板库发布——video-shotcraft 镜头配方库,9 张 320×440 镜头 / 模板卡,1920×1080 原生坐标)
16
- - 两层运动分离叠加:入场(每张自己的弹簧)与扇形(全员共享的一条展开进度),
17
- 最终 transform 是 `translate3d(tx, y, tz) rotate(rot)` 里两层各自算出的分量合成
18
- - 入场:起跳帧 `2 + stagger(i, 9, 40, EASE.out)`——EASE.out 映射让间隔先大后小(砰——砰—砰-砰砰,越来越快);
19
- 每张 `springAt(f, start, {damping:13, stiffness:150})`,`y` 从 820px 抬到 0(起点在画框外),≈20f 落座;
20
- 飞行中带 ±9° 交替倾角并随落座收敛,按竖向速度加运动模糊(≤10px)
21
- - 重量:每张落座(起跳后约 6f 越过终点)时整摞被压低 5px(sin 包络 9f);成摞时确定性 ±3.2° / ±11px 错位,
22
- 像随手码齐的一摞;展开前 62–72f 整摞收紧 2%(预备)
23
- - 扇形:`springAt(f, 68, {damping:20, stiffness:95})` 是唯一的展开时钟(带一次轻微过冲 = 手腕甩开的惯性),
24
- 终态 `k = i-4`,`rot = k*6.5°`、`tx = k*138px`;`transform-origin: 50% 130%` 把旋转轴放到卡片下缘之外——
25
- 扇柄在手里,卡片是绕手腕转开的
26
- - 叠压次序 = 序号(`zIndex = i`,左压右,像手里摊开的一手牌),全程不换——成摞时顶牌就是最后一张,
27
- 展开时不会出现顶牌跳变
28
- - 相机:成摞段 1→1.06 极缓推近给"一摞"分量,展开同段(64→106f)拉远到 0.88 让扇面完整入画;
29
- 地面接触影随扇面从 220 变宽到 760
30
- - 结尾:中心卡(钴蓝实色封面:镜刻标志反白版 +「Launch」,卡名 Launch film)沿自身轴抽出 72px(overshoot)+ 3px 钴蓝描边 + 一次扫光(Q4),
31
- 标题 "Start from a shot recipe."(88px)逐词升起、副句跟随,hold 28f
32
-
33
- ## 参数表
34
- | 参数 | 典型值 | 调节手感 |
35
- |------|--------|----------|
36
- | 卡数 | N=9(奇数,中心卡独占中位) | 9 张 × 6.5° = 52° 总张角是舒适上限;>11 张要把每张角度降到 4–5°,否则两端卡飞出画框 |
37
- | 入场 stagger | 40f 跨度,EASE.out 分布 | 越来越快是"一串"的手感;等差分布读作逐张点名,<20f 读作一团一起冒 |
38
- | 入场行程 | y 820→0,spring damping 13 | 起点必须在画框外;damping <10 回弹两次以上,成组时抖动互相干扰 |
39
- | 落座下压 | 5px,sin 9f | 这是"有分量"的来源;>10px 整摞像弹簧床 |
40
- | 展开弹簧 | damping 20 / stiffness 95 | 一次轻微过冲像手腕甩开;damping >26 无过冲读作机械展开,<16 扇面来回晃 |
41
- | 扇形张角 | `k*6.5°`,横移 `k*138px` | 角度与横移要同比调:只加角度不加横移,卡会互相穿插 |
42
- | 深度 | `tz = i*2`,perspective 1800px | 只做叠压的暗示;深度主要靠叠压次序 + 两层软阴影 |
43
- | 旋转轴 | `transform-origin: 50% 130%` | 130% 决定"扇柄"离卡多远;改成 50% 50% 立刻退化成风车式散开 |
44
- | 抽卡 | 72px overshoot + 描边 + 扫光 | 只给中心卡一次;抽出量 <40px 看不出"被选中",>120px 卡与标题打架 |
45
-
46
- ## 已知坑
47
- - 两段时间窗刚好首尾相接:末张 42f 起跳、≈62f 落座,62f 预备、68f 展开。
48
- 加卡数或加大 stagger 会让入场吃进展开段,出现"还在飞就开始转"的浑浊——加卡必须
49
- 同步把预备与展开起点往后推
50
- - 卡数为偶数时 `k` 取半整数(±0.5, ±1.5…),没有中心卡,结尾"抽出主角"会偏在一侧;
51
- demo 用 9 张。若改用"中间压两边"的 zIndex,要注意成摞→扇面时顶牌会跳变
52
- - 卡片 320×440 以 `left = CX-CW/2, top = CY-CH/2` 居中,扇柄位置随 CH 变;改尺寸要同步检查
53
- 两端卡是否出安全边距(相机 0.88 时最外卡角距画边约 100px)
54
- - 卡面是手搓的模板封面占位(生成式封面图 + 标题 + mono 元信息),落地应换成真实页面切片;
55
- 封面只用钴蓝 / 青绿 / 墨三色的浅色调,只有中心卡用钴蓝实色——真实素材里也要留一张「主角」
56
- - 展开同段(64→106f)相机拉远到 0.88,保证两端卡不出画;要接下一镜可在抽卡落定(≈120f)后切,别让扇面白停太久
57
-
58
- ## 参考实现
59
- demos/ui-entrance/card-stack/
60
- (CardStack.tsx)
1
+ ---
2
+ name: card-stack
3
+ 一句话: 一组模板卡(demo 9 张)从屏幕下方逐张 spring 弹入、越落越快叠成一摞,全员落位后整摞一次性展成扇面——每张按序号偏转 6.5°、横移 138px,最后中心卡被抽出
4
+ 适用: 需要交代"我们有一组东西"的产品段落;卡片墙/模板库/方案列表的建立镜头,也能当 logo 前的一拍蓄势
5
+ 时长: 约 5.0s(150f@30fps)
6
+ 能量: 中高(入场是连续小爆发,展开段收成一次平滑的整体动作)
7
+ ---
8
+
9
+ ## 意图
10
+ 一摞卡先聚成一个物体,再摊开成一组物体——顺序很关键:先给"整体"再给"个体"。
11
+ 观众第一眼记住的是有分量的一摞(数量感),第二眼才看清每张不一样(多样性)。
12
+ 展开动作留到最后一次性完成,是为了不和入场的节拍打架。
13
+
14
+ ## 动效核心
15
+ (demo 版本:瓷白模板库发布——video-shotcraft 镜头配方库,9 张 320×440 镜头 / 模板卡,1920×1080 原生坐标)
16
+ - 两层运动分离叠加:入场(每张自己的弹簧)与扇形(全员共享的一条展开进度),
17
+ 最终 transform 是 `translate3d(tx, y, tz) rotate(rot)` 里两层各自算出的分量合成
18
+ - 入场:起跳帧 `2 + stagger(i, 9, 40, EASE.out)`——EASE.out 映射让间隔先大后小(砰——砰—砰-砰砰,越来越快);
19
+ 每张 `springAt(f, start, {damping:13, stiffness:150})`,`y` 从 820px 抬到 0(起点在画框外),≈20f 落座;
20
+ 飞行中带 ±9° 交替倾角并随落座收敛,按竖向速度加运动模糊(≤10px)
21
+ - 重量:每张落座(起跳后约 6f 越过终点)时整摞被压低 5px(sin 包络 9f);成摞时确定性 ±3.2° / ±11px 错位,
22
+ 像随手码齐的一摞;展开前 62–72f 整摞收紧 2%(预备)
23
+ - 扇形:`springAt(f, 68, {damping:20, stiffness:95})` 是唯一的展开时钟(带一次轻微过冲 = 手腕甩开的惯性),
24
+ 终态 `k = i-4`,`rot = k*6.5°`、`tx = k*138px`;`transform-origin: 50% 130%` 把旋转轴放到卡片下缘之外——
25
+ 扇柄在手里,卡片是绕手腕转开的
26
+ - 叠压次序 = 序号(`zIndex = i`,左压右,像手里摊开的一手牌),全程不换——成摞时顶牌就是最后一张,
27
+ 展开时不会出现顶牌跳变
28
+ - 相机:成摞段 1→1.06 极缓推近给"一摞"分量,展开同段(64→106f)拉远到 0.88 让扇面完整入画;
29
+ 地面接触影随扇面从 220 变宽到 760
30
+ - 结尾:中心卡(钴蓝实色封面:镜刻标志反白版 +「Launch」,卡名 Launch film)沿自身轴抽出 72px(overshoot)+ 3px 钴蓝描边 + 一次扫光(Q4),
31
+ 标题 "Start from a shot recipe."(88px)逐词升起、副句跟随,hold 28f
32
+
33
+ ## 参数表
34
+ | 参数 | 典型值 | 调节手感 |
35
+ |------|--------|----------|
36
+ | 卡数 | N=9(奇数,中心卡独占中位) | 9 张 × 6.5° = 52° 总张角是舒适上限;>11 张要把每张角度降到 4–5°,否则两端卡飞出画框 |
37
+ | 入场 stagger | 40f 跨度,EASE.out 分布 | 越来越快是"一串"的手感;等差分布读作逐张点名,<20f 读作一团一起冒 |
38
+ | 入场行程 | y 820→0,spring damping 13 | 起点必须在画框外;damping <10 回弹两次以上,成组时抖动互相干扰 |
39
+ | 落座下压 | 5px,sin 9f | 这是"有分量"的来源;>10px 整摞像弹簧床 |
40
+ | 展开弹簧 | damping 20 / stiffness 95 | 一次轻微过冲像手腕甩开;damping >26 无过冲读作机械展开,<16 扇面来回晃 |
41
+ | 扇形张角 | `k*6.5°`,横移 `k*138px` | 角度与横移要同比调:只加角度不加横移,卡会互相穿插 |
42
+ | 深度 | `tz = i*2`,perspective 1800px | 只做叠压的暗示;深度主要靠叠压次序 + 两层软阴影 |
43
+ | 旋转轴 | `transform-origin: 50% 130%` | 130% 决定"扇柄"离卡多远;改成 50% 50% 立刻退化成风车式散开 |
44
+ | 抽卡 | 72px overshoot + 描边 + 扫光 | 只给中心卡一次;抽出量 <40px 看不出"被选中",>120px 卡与标题打架 |
45
+
46
+ ## 已知坑
47
+ - 两段时间窗刚好首尾相接:末张 42f 起跳、≈62f 落座,62f 预备、68f 展开。
48
+ 加卡数或加大 stagger 会让入场吃进展开段,出现"还在飞就开始转"的浑浊——加卡必须
49
+ 同步把预备与展开起点往后推
50
+ - 卡数为偶数时 `k` 取半整数(±0.5, ±1.5…),没有中心卡,结尾"抽出主角"会偏在一侧;
51
+ demo 用 9 张。若改用"中间压两边"的 zIndex,要注意成摞→扇面时顶牌会跳变
52
+ - 卡片 320×440 以 `left = CX-CW/2, top = CY-CH/2` 居中,扇柄位置随 CH 变;改尺寸要同步检查
53
+ 两端卡是否出安全边距(相机 0.88 时最外卡角距画边约 100px)
54
+ - 卡面是手搓的模板封面占位(生成式封面图 + 标题 + mono 元信息),落地应换成真实页面切片;
55
+ 封面只用钴蓝 / 青绿 / 墨三色的浅色调,只有中心卡用钴蓝实色——真实素材里也要留一张「主角」
56
+ - 展开同段(64→106f)相机拉远到 0.88,保证两端卡不出画;要接下一镜可在抽卡落定(≈120f)后切,别让扇面白停太久
57
+
58
+ ## 参考实现
59
+ demos/ui-entrance/card-stack/
60
+ (CardStack.tsx)
@@ -1,66 +1,66 @@
1
- ---
2
- name: carousel-3d
3
- 一句话: 8 张卡排成圆环整环自转一圈(匀速底 + 每 45° 一次停靠的分步),每卡只绕 Y 公转、自身 billboard 朝外,正反两层同向贴图配 backface-visibility:hidden 保证任何时刻都正立不倒置,正前方卡被点亮、环下字幕随之换字,相机全程钉在浅俯角
4
- 适用: 作品集/模板库/集成清单的循环展示;需要无缝 loop 的背景拍或落地页 hero
5
- 时长: 约 5.6s(168f@30fps)
6
- 能量: 中(可无限循环的稳态运动,每 45° 一次停靠给出节拍)
7
- ---
8
-
9
- ## 意图
10
- 展示"一组东西"最省事的办法是排成一排横滑,但横滑有起点和终点。环形没有——它天然
11
- 循环,观众看多久都不会觉得"放完了"。这张卡真正要解决的是环形 carousel 最容易翻车
12
- 的点:卡片背面。方案是双面同向贴图,所以从环内看和从环外看是同一张正立的卡,环转一圈
13
- 不会有任何一帧出现镜像或倒置。
14
-
15
- ## 动效核心
16
- (demo 版本:酸柠石墨暗场 video-shotcraft 镜头配方画廊,卡 340×460、半径 700px,1920×1080 原生坐标)
17
- - 环上定位公式只有一行:`transform: rotateY(i*360/N) translateZ(RADIUS)`——先转到自己
18
- 的方位角再沿新的 Z 轴推出半径。这一步同时完成了排布与 billboard:卡的法向天然朝外;
19
- 转到正前方的卡沿法向多推出 44px(只平移不旋转),停靠时读作"被选中"
20
- - 整环自转靠父层:`ring.transform = rotateY(-spin)`,卡自身的 transform 只有定位分量。
21
- **卡永不绕 X 或 Z 转**,这是"永远正立"的根本保证
22
- - 转角不是死匀速:`turn = 0.5·f/168 + 0.5·stepPart(f)`,`stepPart` 每 21f 一步(8f 停靠 + 13f smooth 换位)。
23
- 匀速底让整环永远在走(loop 稳态),分步层每 45° 给一次"推一把—停靠";8 步 × 21f = 168f 正好一圈,
24
- f=168 时 turn=1,首尾帧逐像素可接
25
- - 双面同向贴图:front 与 back 用**同一份卡面**,back 额外加 `rotateY(180deg)`,
26
- 两层都设 `backface-visibility:hidden`。于是环外看到 front、环内看到 back,两者内容
27
- 朝向一致——如果只用一层,转到环背面时会看到镜像文字
28
- - 正前方点亮:`hl = smooth(1 - |方位角|/26°)`,驱动荧光描边、图形色(石墨灰 → 荧光黄绿插值)与外推量;
29
- 环下方字幕(mono 编号 + 72px 名称)在裁切窗里随分步层上滚换字,停靠时定格
30
- - 相机固定,一帧都不动:`perspective: 2200px`,环容器 `translateZ(-RADIUS) rotateX(-9deg)`——
31
- 正前方卡落在 z=0(按原生尺寸栅格化,文字不糊),所有运动都来自环的自转,这是"画廊"而不是"过山车"
32
- - 地面:2.7 倍半径的反光盘 + 96 格刻度环(随环同转)`rotateX(90deg)` 躺平在卡脚下;再叠一份以地面为镜面
33
- `scaleY(-1)` 的倒影环(叶子层 8% 透明度 + 渐隐 mask,透明度不能挂在 preserve-3d 容器上,否则整环被拍平)
34
- - 空气透视:按卡的方位角 `(1-cos θ)/2` 给卡面叠一层底色(最后方 70%),环的前后关系一眼可读
35
-
36
- ## 参数表
37
- | 参数 | 典型值 | 调节手感 |
38
- |------|--------|----------|
39
- | 卡数 | N=8(方位角间隔 45°) | 8 张在 700px 半径上前后互不遮挡;>12 张卡会互相压边,需要同步加大 RADIUS |
40
- | 半径 | RADIUS=700px(卡 340×460) | 半径/卡宽 ≈2 是疏密甜点;<1.5 倍时环背面的卡从正面卡的缝里挤出来,画面变乱 |
41
- | 转速构成 | 50% 匀速 + 50% 分步(21f/步,停靠 8f) | 分步比例 >70% 停靠时整环几乎停住,loop 读出"卡顿";<30% 停靠感消失,又回到平的匀速 |
42
- | 圈数 | 全片 1 圈(8 步) | 圈数与步数都必须是整数才能 loop;非整数则末帧跳变 |
43
- | 透视 | `perspective: 2200px` | 相对 700 半径是较平的透视;调到 1200 以下近处卡会夸张放大,读作鱼眼 |
44
- | 相机俯角 | `rotateX(-9deg)` | 只是"略微俯视",刚好露出地面盘与刻度环;>-20° 环会压扁成椭圆 |
45
- | 点亮窗 | 方位角 ±26° | 窗太宽相邻两张同时半亮,主角不明确;太窄换位途中整环全灰 |
46
- | 倒影 | 8% 透明度,62% 起渐隐 | >15% 倒影里的文字可读,会和下方字幕打架 |
47
-
48
- ## 已知坑
49
- - 稳态循环是这张卡的特性也是限制:**它没有开头也没有结尾**。分步停靠给了节拍,但当主镜用
50
- 仍偏平,适合当背景层、loop 素材或与前景文字/相机运动叠加使用
51
- - 每帧都重设了 8 张卡的 transform(`rotateY(i*45) translateZ(RADIUS + 44·hl)`)——旋转分量恒定,
52
- 只有沿法向的外推随点亮变化。这让"卡自身不参与旋转"在代码里显式可见;不要把外推挂到旋转上
53
- - `backface-visibility:hidden` 在部分 WebKit 下需要 `-webkit-` 前缀(代码里已双写)。
54
- 漏掉前缀会看到两层 face 同时可见,卡片内容叠成一团
55
- - 卡面是手搓的镜头配方卡占位(mono 编号 + 生成式图形 + 大数字 + 名称),落地要换成真实截图,
56
- **且 front/back 必须换成同一份内容**,否则双面同向的前提被破坏
57
- - 环转到背面时卡是"背对观众的正面"(看的是 back 层),所以内容始终可读——但也意味着
58
- 没有"翻面揭示"的余地。要做翻面必须放弃 backface-hidden 方案,另起一套
59
- - 深色柔光背景 + 石墨卡面 + 空气透视压暗是一套;换白底后压暗层与倒影都要重配
60
- (压暗改成向背景色混合,倒影透明度降到 5% 左右)
61
- - 字幕的"当前卡"取自分步层的步号,不取自真实方位角:匀速底在停靠期间会让环多走约 8.6°,
62
- 正前方卡略偏左是正常的;若改分步比例,要确认停靠时点亮窗(±26°)仍罩得住这段漂移
63
-
64
- ## 参考实现
65
- demos/ui-entrance/carousel-3d/
66
- (Carousel3D.tsx)
1
+ ---
2
+ name: carousel-3d
3
+ 一句话: 8 张卡排成圆环整环自转一圈(匀速底 + 每 45° 一次停靠的分步),每卡只绕 Y 公转、自身 billboard 朝外,正反两层同向贴图配 backface-visibility:hidden 保证任何时刻都正立不倒置,正前方卡被点亮、环下字幕随之换字,相机全程钉在浅俯角
4
+ 适用: 作品集/模板库/集成清单的循环展示;需要无缝 loop 的背景拍或落地页 hero
5
+ 时长: 约 5.6s(168f@30fps)
6
+ 能量: 中(可无限循环的稳态运动,每 45° 一次停靠给出节拍)
7
+ ---
8
+
9
+ ## 意图
10
+ 展示"一组东西"最省事的办法是排成一排横滑,但横滑有起点和终点。环形没有——它天然
11
+ 循环,观众看多久都不会觉得"放完了"。这张卡真正要解决的是环形 carousel 最容易翻车
12
+ 的点:卡片背面。方案是双面同向贴图,所以从环内看和从环外看是同一张正立的卡,环转一圈
13
+ 不会有任何一帧出现镜像或倒置。
14
+
15
+ ## 动效核心
16
+ (demo 版本:酸柠石墨暗场 video-shotcraft 镜头配方画廊,卡 340×460、半径 700px,1920×1080 原生坐标)
17
+ - 环上定位公式只有一行:`transform: rotateY(i*360/N) translateZ(RADIUS)`——先转到自己
18
+ 的方位角再沿新的 Z 轴推出半径。这一步同时完成了排布与 billboard:卡的法向天然朝外;
19
+ 转到正前方的卡沿法向多推出 44px(只平移不旋转),停靠时读作"被选中"
20
+ - 整环自转靠父层:`ring.transform = rotateY(-spin)`,卡自身的 transform 只有定位分量。
21
+ **卡永不绕 X 或 Z 转**,这是"永远正立"的根本保证
22
+ - 转角不是死匀速:`turn = 0.5·f/168 + 0.5·stepPart(f)`,`stepPart` 每 21f 一步(8f 停靠 + 13f smooth 换位)。
23
+ 匀速底让整环永远在走(loop 稳态),分步层每 45° 给一次"推一把—停靠";8 步 × 21f = 168f 正好一圈,
24
+ f=168 时 turn=1,首尾帧逐像素可接
25
+ - 双面同向贴图:front 与 back 用**同一份卡面**,back 额外加 `rotateY(180deg)`,
26
+ 两层都设 `backface-visibility:hidden`。于是环外看到 front、环内看到 back,两者内容
27
+ 朝向一致——如果只用一层,转到环背面时会看到镜像文字
28
+ - 正前方点亮:`hl = smooth(1 - |方位角|/26°)`,驱动荧光描边、图形色(石墨灰 → 荧光黄绿插值)与外推量;
29
+ 环下方字幕(mono 编号 + 72px 名称)在裁切窗里随分步层上滚换字,停靠时定格
30
+ - 相机固定,一帧都不动:`perspective: 2200px`,环容器 `translateZ(-RADIUS) rotateX(-9deg)`——
31
+ 正前方卡落在 z=0(按原生尺寸栅格化,文字不糊),所有运动都来自环的自转,这是"画廊"而不是"过山车"
32
+ - 地面:2.7 倍半径的反光盘 + 96 格刻度环(随环同转)`rotateX(90deg)` 躺平在卡脚下;再叠一份以地面为镜面
33
+ `scaleY(-1)` 的倒影环(叶子层 8% 透明度 + 渐隐 mask,透明度不能挂在 preserve-3d 容器上,否则整环被拍平)
34
+ - 空气透视:按卡的方位角 `(1-cos θ)/2` 给卡面叠一层底色(最后方 70%),环的前后关系一眼可读
35
+
36
+ ## 参数表
37
+ | 参数 | 典型值 | 调节手感 |
38
+ |------|--------|----------|
39
+ | 卡数 | N=8(方位角间隔 45°) | 8 张在 700px 半径上前后互不遮挡;>12 张卡会互相压边,需要同步加大 RADIUS |
40
+ | 半径 | RADIUS=700px(卡 340×460) | 半径/卡宽 ≈2 是疏密甜点;<1.5 倍时环背面的卡从正面卡的缝里挤出来,画面变乱 |
41
+ | 转速构成 | 50% 匀速 + 50% 分步(21f/步,停靠 8f) | 分步比例 >70% 停靠时整环几乎停住,loop 读出"卡顿";<30% 停靠感消失,又回到平的匀速 |
42
+ | 圈数 | 全片 1 圈(8 步) | 圈数与步数都必须是整数才能 loop;非整数则末帧跳变 |
43
+ | 透视 | `perspective: 2200px` | 相对 700 半径是较平的透视;调到 1200 以下近处卡会夸张放大,读作鱼眼 |
44
+ | 相机俯角 | `rotateX(-9deg)` | 只是"略微俯视",刚好露出地面盘与刻度环;>-20° 环会压扁成椭圆 |
45
+ | 点亮窗 | 方位角 ±26° | 窗太宽相邻两张同时半亮,主角不明确;太窄换位途中整环全灰 |
46
+ | 倒影 | 8% 透明度,62% 起渐隐 | >15% 倒影里的文字可读,会和下方字幕打架 |
47
+
48
+ ## 已知坑
49
+ - 稳态循环是这张卡的特性也是限制:**它没有开头也没有结尾**。分步停靠给了节拍,但当主镜用
50
+ 仍偏平,适合当背景层、loop 素材或与前景文字/相机运动叠加使用
51
+ - 每帧都重设了 8 张卡的 transform(`rotateY(i*45) translateZ(RADIUS + 44·hl)`)——旋转分量恒定,
52
+ 只有沿法向的外推随点亮变化。这让"卡自身不参与旋转"在代码里显式可见;不要把外推挂到旋转上
53
+ - `backface-visibility:hidden` 在部分 WebKit 下需要 `-webkit-` 前缀(代码里已双写)。
54
+ 漏掉前缀会看到两层 face 同时可见,卡片内容叠成一团
55
+ - 卡面是手搓的镜头配方卡占位(mono 编号 + 生成式图形 + 大数字 + 名称),落地要换成真实截图,
56
+ **且 front/back 必须换成同一份内容**,否则双面同向的前提被破坏
57
+ - 环转到背面时卡是"背对观众的正面"(看的是 back 层),所以内容始终可读——但也意味着
58
+ 没有"翻面揭示"的余地。要做翻面必须放弃 backface-hidden 方案,另起一套
59
+ - 深色柔光背景 + 石墨卡面 + 空气透视压暗是一套;换白底后压暗层与倒影都要重配
60
+ (压暗改成向背景色混合,倒影透明度降到 5% 左右)
61
+ - 字幕的"当前卡"取自分步层的步号,不取自真实方位角:匀速底在停靠期间会让环多走约 8.6°,
62
+ 正前方卡略偏左是正常的;若改分步比例,要确认停靠时点亮窗(±26°)仍罩得住这段漂移
63
+
64
+ ## 参考实现
65
+ demos/ui-entrance/carousel-3d/
66
+ (Carousel3D.tsx)
@@ -1,40 +1,40 @@
1
- ---
2
- name: cloner-depth-echo
3
- 一句话: 克隆纵队——主卡瞬间"复印"出 7 个半透明分身沿斜向纵深排开成队,停一拍后全体加速吸回本体合一+弹跳
4
- 适用: "多副本/多租户/规模感/批量处理"卖点;一镜讲完"一个=很多"
5
- 时长: 138f(约 4.6s)
6
- 能量: 中(陈列-收束型)
7
- ---
8
-
9
- ## 意图
10
- Spline/C4D Cloner 语汇的 UI 翻译:一张主卡"啪"地复印出 7 个克隆体
11
- 沿 Z 轴向后等距排开(间隔 250px、透明度 100%→28% 递减、越远越只剩轮廓),
12
- 错峰弹出成纵队;停 ~32f 让观众数得清"有很多个";然后全体 ease-in 加速吸回
13
- 本体合一,合体瞬间本体弹 1.06x 收束。demo 把"一个=很多"落到具体卖点:
14
- 一张 video-shotcraft 渲染卡(launch-film)×8 个镜头,合体时卡底 8 个镜头位同时点亮,标题落「One prompt. / Eight shots.」。与 depth-layer-moves 视差
15
- (不同内容分层)分工:这是**同一内容**的等距重影阵列,语义是规模
16
- 不是空间。
17
-
18
- ## 参数表
19
- | 参数 | 典型值 | 调节手感 |
20
- |------|--------|----------|
21
- | 纵深排布 | 真 3D 透视 perspective 1500,消失点放在左上(360,120);克隆体 translateZ = −250·idx,再叠 dx=−58·idx / dy=−6·idx | **命门**:纯 translateZ 且消失点在正中时克隆体全被本体挡住(不可感);把消失点挪到画面一角,后退本身就把纵队排向那一角 |
22
- | 克隆数/间隔 | 7 个 / 250px | 少于 5 读不出"队",多于 9 尾部糊成一团 |
23
- | 衰减 | 透明度 100%→28% 线性;填充褪掉只留强调色描边;越远附加 0→1.6px 景深虚化 | 越远越淡、越"只剩轮廓"=纵深证据;克隆体只留顶栏 + 折线 + 镜头号,别重复大读数(叠成一团乱码) |
24
- | 排开/吸回 | spring 错峰 2.2f/个(damping 15,一次轻过冲);吸回强 ease-in 10f 全体同步,按纵深速度加拖影模糊 | 排开要错峰(复印感),吸回要同步(收束感)——节奏不对称是设计 |
25
- | 停留 | 32f,期间相机极缓推近 2% + 纵队轻微视差漂移 | 停太短数不清"有很多个",完全静止又是死帧 |
26
- | 合体 | 主卡 sin 单脉冲 1.06x + 一次强调色描边光(14f 衰减);同帧镜头位全亮、计数器回弹 | 吸回无弹跳读作淡出;弹跳=质量证据 |
27
- | 计数 | 左下 260px「×N」,每弹出一个克隆滚一格(5f,出场格上移淡出 + 速度竖向虚化) | 计数让"规模"从画面变成数字;滚动格不要 overflow 裁切,会把泛光裁出方框 |
28
-
29
- ## 已知坑
30
- - demo 用手搓的 video-shotcraft 渲染卡(lime 暗场)调校——参数是调校起点非实战定稿,
31
- 首次实战须以真实素材回验
32
- - 克隆体必须从后往前渲染保证遮挡正确;透明度 ≤0.005 条件卸载
33
- - 同批 3D 渠道另两条(厚板转台淘汰、走廊改改再看)——纯陈列型
34
- 3D 运镜相性存疑,本卡过墙靠的是"排开-吸回"的叙事动作,
35
- 实战别退化成静态纵队陈列
36
- - 声音:排开一串细"啪"错峰,吸回一声上扬 whoosh,合体一声实"咚"
37
-
38
- ## 参考实现
39
- demos/ui-entrance/cloner-depth-echo/
40
- (ClonerDepthEcho.tsx)
1
+ ---
2
+ name: cloner-depth-echo
3
+ 一句话: 克隆纵队——主卡瞬间"复印"出 7 个半透明分身沿斜向纵深排开成队,停一拍后全体加速吸回本体合一+弹跳
4
+ 适用: "多副本/多租户/规模感/批量处理"卖点;一镜讲完"一个=很多"
5
+ 时长: 138f(约 4.6s)
6
+ 能量: 中(陈列-收束型)
7
+ ---
8
+
9
+ ## 意图
10
+ Spline/C4D Cloner 语汇的 UI 翻译:一张主卡"啪"地复印出 7 个克隆体
11
+ 沿 Z 轴向后等距排开(间隔 250px、透明度 100%→28% 递减、越远越只剩轮廓),
12
+ 错峰弹出成纵队;停 ~32f 让观众数得清"有很多个";然后全体 ease-in 加速吸回
13
+ 本体合一,合体瞬间本体弹 1.06x 收束。demo 把"一个=很多"落到具体卖点:
14
+ 一张 video-shotcraft 渲染卡(launch-film)×8 个镜头,合体时卡底 8 个镜头位同时点亮,标题落「One prompt. / Eight shots.」。与 depth-layer-moves 视差
15
+ (不同内容分层)分工:这是**同一内容**的等距重影阵列,语义是规模
16
+ 不是空间。
17
+
18
+ ## 参数表
19
+ | 参数 | 典型值 | 调节手感 |
20
+ |------|--------|----------|
21
+ | 纵深排布 | 真 3D 透视 perspective 1500,消失点放在左上(360,120);克隆体 translateZ = −250·idx,再叠 dx=−58·idx / dy=−6·idx | **命门**:纯 translateZ 且消失点在正中时克隆体全被本体挡住(不可感);把消失点挪到画面一角,后退本身就把纵队排向那一角 |
22
+ | 克隆数/间隔 | 7 个 / 250px | 少于 5 读不出"队",多于 9 尾部糊成一团 |
23
+ | 衰减 | 透明度 100%→28% 线性;填充褪掉只留强调色描边;越远附加 0→1.6px 景深虚化 | 越远越淡、越"只剩轮廓"=纵深证据;克隆体只留顶栏 + 折线 + 镜头号,别重复大读数(叠成一团乱码) |
24
+ | 排开/吸回 | spring 错峰 2.2f/个(damping 15,一次轻过冲);吸回强 ease-in 10f 全体同步,按纵深速度加拖影模糊 | 排开要错峰(复印感),吸回要同步(收束感)——节奏不对称是设计 |
25
+ | 停留 | 32f,期间相机极缓推近 2% + 纵队轻微视差漂移 | 停太短数不清"有很多个",完全静止又是死帧 |
26
+ | 合体 | 主卡 sin 单脉冲 1.06x + 一次强调色描边光(14f 衰减);同帧镜头位全亮、计数器回弹 | 吸回无弹跳读作淡出;弹跳=质量证据 |
27
+ | 计数 | 左下 260px「×N」,每弹出一个克隆滚一格(5f,出场格上移淡出 + 速度竖向虚化) | 计数让"规模"从画面变成数字;滚动格不要 overflow 裁切,会把泛光裁出方框 |
28
+
29
+ ## 已知坑
30
+ - demo 用手搓的 video-shotcraft 渲染卡(lime 暗场)调校——参数是调校起点非实战定稿,
31
+ 首次实战须以真实素材回验
32
+ - 克隆体必须从后往前渲染保证遮挡正确;透明度 ≤0.005 条件卸载
33
+ - 同批 3D 渠道另两条(厚板转台淘汰、走廊改改再看)——纯陈列型
34
+ 3D 运镜相性存疑,本卡过墙靠的是"排开-吸回"的叙事动作,
35
+ 实战别退化成静态纵队陈列
36
+ - 声音:排开一串细"啪"错峰,吸回一声上扬 whoosh,合体一声实"咚"
37
+
38
+ ## 参考实现
39
+ demos/ui-entrance/cloner-depth-echo/
40
+ (ClonerDepthEcho.tsx)
@@ -1,45 +1,45 @@
1
- ---
2
- name: deck-deal-flyin
3
- 一句话: 暗色石墨桌面上的实体牌堆特写环绕开局,灯从牌堆亮到旁边的页面板,一摞卡像发牌一样硬加速甩进网格,相机追着发牌升起后仰、落在整块满板的跑道式俯瞰上定格
4
- 适用: 展示"内容量大/源源不断汇入"的列表页与卡片墙;建立信息密度的第一印象
5
- 时长: 150f(约 5s:0–36 牌堆特写 + 预备,36–~101 发牌,108–150 满板 hold)
6
- 能量: 高(节奏爬升段主力,不放开场第一镜)
7
- ---
8
-
9
- ## 意图
10
- 先给悬念(这一摞是什么?),再给答案(是几十个项目,它们自己飞进页面各就各位)。观众要感受到"东西源源不断地涌进来",每张卡带着急迫感砸到位。
11
-
12
- ## 动效核心
13
- - 前半(pile-orbit-open,可选):所有卡叠成有物理高度的实体牌堆,放在页面板旁的暗色拉丝石墨桌面上,顶光只打牌堆,相机侧斜特写绕堆环绕;拉远时"灯"从牌堆处以柔边光圈把暗着的页面板照亮——页面板始终是摆在暗桌上的一块展板,四周暗场贯穿到尾帧
14
- - **预备拍(anticipation,借鉴迪士尼法则 2)**:首张出牌前给一拍段落级预备——牌堆整体微下压 + 顶卡向出牌反方向回拉,观众的眼睛先被引到牌堆再看发牌。预备只做段落级一次,**不逐卡加**(逐卡预备会拖垮 R2 的硬加速节拍)
15
- - 后半(deck-deal):26 张卡从牌堆按阅读序发向网格目标位,出牌间隔硬加速收缩;单卡飞行带 z 弧顶、过冲 settle、落地 press 回弹(settle/press 即法则 5 的 follow-through——快停配缓冲,砍掉读作硬冻结)
16
- - 相机追着发牌往板尾走(越来越快),同时升高、后仰、侧转,落在一张跑道式俯瞰:整块板沿对角线伸向远处、26 张卡全部在画,远端压暗做景深;满板后静止 hold(> 0.5s,只留 1.5% 极缓推近),左下升起标语 + mono 计数行(计数跟着落地张数跳)。收尾停顿期各层不同帧停稳——卡体先落定、阴影收敛滞后 ~3f、残影最后消散(拖拽层级,借鉴法则 5;全要素同帧冻结读作机械)
17
-
18
- ## 参数表
19
- | 参数 | 典型值 | 调节手感 |
20
- |------|--------|----------|
21
- | orbit 环绕 | 相机关键帧走单调三次 Hermite 样条逐帧展开(关键帧处速度连续,无顿挫)。帧 0→30,rotX 48/rotY −30/rotZ 9/zoom 1.9 绕到 rotX 42/rotY 24/rotZ −6/zoom 1.8,persp 1100 | 特写四件套缺一不可:侧面倾斜角+可感知高度+orbit+反差深色材质(Q7,用户逐项点名) |
22
- | 堆叠高度 | STACK_STEP=3px 物理层高 × 26 张 → 顶卡 z≈78px;姿态抖动 px/py 按 `(((k*7)%9)−4)*2` 确定性公式 ±8px、rotZ ±3° | 抖动必须确定性伪随机(硬规则:渲染必须可复现),真随机会渲染间抖动 |
23
- | 石墨桌面 | 4 层叠加:随拉远扩大的顶光 radial + 104deg 宽幅镜面高光带 + 确定性 feTurbulence 各向异性拉丝纹小图平铺(baseFrequency 0.0018×0.62,alpha 0.4)+ 115deg 冷灰渐变;平面向外扩 4000px、远处柔边隐进暗场。页面板(截图内容区 x 352–1568 + 纸面延长)开场被 0.88 暗层盖住,34→64f 以牌堆为圆心柔边光圈揭开;落进未照亮区域的卡用同一公式压暗 | 别再整层淡出金属换成全屏白纸——暗/亮反差是这镜的质感来源;拉丝纹在 0.5x 俯瞰下对比要压低,否则出摩尔纹 |
24
- | 预备拍 | 首发 cue 前 10f(26→36):牌堆整体下压 48px(约堆高六成)+ 顶卡向出牌反方向回拉 30px,缓动 easeOut,首发瞬间释放 | **幅度必须过肉眼阈值**:4px/2px 初版用户实测完全无感,放大 12 倍(48/30px)才裁决通过(判例 2026-07-09 进化轮 #2)——渲染后自查"不逐帧能否看出蓄力",看不出等于没做;帧预算从 orbit 尾段挪,不挤占发牌段 |
25
- | 发牌节拍 | 第 k 张 cue = 36 + 4k − 0.0792·k(k−1),间隔 4f 收缩到 0.2f | 均匀间隔立刻显得机械;匀加速不够狠也被否——要"hard-accelerating"级别(R2/B3) |
26
- | 卡量 | 10 真卡 + 16 extras = 26 张;网格向下扩 5 行、纸面延长 2036px | 卡不够多涌入感不成立——宁多勿少;extras 落进真实扩展格位,不悬浮(Q9) |
27
- | 单卡飞行 | deal 8f(bezier(0.3,0,0.2,1),z 弧顶 +110px sin、scale 峰值 1.06)+ settle 4f(bezier(0.3,0,0.25,1.15) 轻过冲)+ press 0.996→1 回弹 2f | 落地要弹必须 y1>1 的 bezier;settle+press 合计 6f ≈ 飞行 8f 的 30%——快停配足缓冲(法则 5 比例);落定后强制 identity transform 防斜板亚像素漂移 |
28
- | 收尾拖拽层级 | rest 段内分层停稳:卡体 press 回弹结束即锁定,落地阴影 `0 32px→0 2px` 收敛滞后卡体 2–4f,飞行残影 opacity 尾梢再拖 3–5f 消散 | 借鉴法则 5 的 drag hierarchy(根→主→次级错帧 2–4f);0.5s rest 静止判例不变——层级错帧发生在 rest 段头部,rest 末端全部锁死(模式已沉为 assets/lib/helpers/motion.ts lagged) |
29
- | 运动模糊(单卡) | 飞行中 5% 路径滞后 blur(6px) 残影,opacity 0.25·(1−t) | ghost 残影比真 motion blur 便宜且够用——单卡层面维持此方案 |
30
- | 运动模糊(相机) | 追逐 scroll 等 ≥30px/f 的快速运镜段用 `@remotion/motion-blur` 的 `<CameraMotionBlur shutterAngle={180} samples={10}>` 包镜;用 `<Sequence>` 把包裹范围切到快速段起点,慢速特写段(<10px/f)不包 | 30fps 下相机每帧跳 50–70px 会频闪,快摇拖影是电影摄像机的物理本能;shutterAngle 越大拖影越长(>270 发糊),samples 按渲染预算调(每 +1 约 +1 倍渲染时间);整镜全包会把慢速 orbit 段的 1px 级细纹理(拉丝金属)采样抹软——只包快速段;借鉴 Remotion 官方生态非用户判例(2026-07-11 进化轮 #8) |
31
- | 追逐 + 升起 | 锚点 f62 正视板顶(zoom 0.8,rotX 22)→ f86 板中(zoom 0.56,rotX 38,rotZ −10)→ f110 跑道俯瞰(zoom 0.5,rotX 52,rotY −6,rotZ −26,persp 3300,屏幕右移 300px 给左下标语让位)→ f150 zoom 0.508 | persp 要随后仰同步加大(1100→3300),否则近端越过相机平面穿帮;满板后静止是用户逐字要求(R2),hold 只许极缓推近 |
32
-
33
- ## 声音
34
- orbit 拉远+首批发牌钉 whoosh-big(模板片钉在 f308),发牌加速段钉 whoosh-fast(f340/356)。连发落位音防机枪感三招:双样本交替、音量阶梯递减、间隔跟随动画曲线加速——密到糊成一片时让声音淡出成一条 swoosh,不逐卡配音(S2)。
35
-
36
- ## 已知坑
37
- - 抽象 flood 式多轮不收敛,换"发牌"物理隐喻一轮通过(R2/B3)——群体运动先找物理隐喻再写代码
38
- - 卡纹理必须真实页面元素切片(Q1),手搓假卡一眼假;extras 复用真卡切片错位摆放
39
- - 全部同时飞读作爆炸,错峰递加速是灵魂;前半 orbit 若砍掉,发牌起点要另给"牌堆从哪来"的交代
40
- - anticipation/follow-through 手法借鉴自迪士尼 12 法则(pixel2motion skill 内置提炼版);预备拍幅度已有用户判例(2026-07-09:"OK能看出来了",此前两档小幅度均无感);拖拽层级错帧仍是默认建议——与 R2 判例冲突时(如用户要求更快更硬)判例优先
41
- - 教科书比例(预备 = 主动作 20–30%)在拉远机位下产出的像素位移过小——**先算像素再算比例**,宣传片观众看的是全景不是特写
42
- - `<Sequence>` 重定基帧号 + CameraMotionBlur 内部 Freeze 会让 PageCam 采样错帧(横向错模糊穿帮)——绝对帧编排的镜头给 PageCam 传 `frame` prop 还原绝对帧(lib 组件已支持)
43
-
44
- ## 参考实现
45
- demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx(原 template/src/aifl/live/SceneFlyIn.tsx 0–113 段)
1
+ ---
2
+ name: deck-deal-flyin
3
+ 一句话: 暗色石墨桌面上的实体牌堆特写环绕开局,灯从牌堆亮到旁边的页面板,一摞卡像发牌一样硬加速甩进网格,相机追着发牌升起后仰、落在整块满板的跑道式俯瞰上定格
4
+ 适用: 展示"内容量大/源源不断汇入"的列表页与卡片墙;建立信息密度的第一印象
5
+ 时长: 150f(约 5s:0–36 牌堆特写 + 预备,36–~101 发牌,108–150 满板 hold)
6
+ 能量: 高(节奏爬升段主力,不放开场第一镜)
7
+ ---
8
+
9
+ ## 意图
10
+ 先给悬念(这一摞是什么?),再给答案(是几十个项目,它们自己飞进页面各就各位)。观众要感受到"东西源源不断地涌进来",每张卡带着急迫感砸到位。
11
+
12
+ ## 动效核心
13
+ - 前半(pile-orbit-open,可选):所有卡叠成有物理高度的实体牌堆,放在页面板旁的暗色拉丝石墨桌面上,顶光只打牌堆,相机侧斜特写绕堆环绕;拉远时"灯"从牌堆处以柔边光圈把暗着的页面板照亮——页面板始终是摆在暗桌上的一块展板,四周暗场贯穿到尾帧
14
+ - **预备拍(anticipation,借鉴迪士尼法则 2)**:首张出牌前给一拍段落级预备——牌堆整体微下压 + 顶卡向出牌反方向回拉,观众的眼睛先被引到牌堆再看发牌。预备只做段落级一次,**不逐卡加**(逐卡预备会拖垮 R2 的硬加速节拍)
15
+ - 后半(deck-deal):26 张卡从牌堆按阅读序发向网格目标位,出牌间隔硬加速收缩;单卡飞行带 z 弧顶、过冲 settle、落地 press 回弹(settle/press 即法则 5 的 follow-through——快停配缓冲,砍掉读作硬冻结)
16
+ - 相机追着发牌往板尾走(越来越快),同时升高、后仰、侧转,落在一张跑道式俯瞰:整块板沿对角线伸向远处、26 张卡全部在画,远端压暗做景深;满板后静止 hold(> 0.5s,只留 1.5% 极缓推近),左下升起标语 + mono 计数行(计数跟着落地张数跳)。收尾停顿期各层不同帧停稳——卡体先落定、阴影收敛滞后 ~3f、残影最后消散(拖拽层级,借鉴法则 5;全要素同帧冻结读作机械)
17
+
18
+ ## 参数表
19
+ | 参数 | 典型值 | 调节手感 |
20
+ |------|--------|----------|
21
+ | orbit 环绕 | 相机关键帧走单调三次 Hermite 样条逐帧展开(关键帧处速度连续,无顿挫)。帧 0→30,rotX 48/rotY −30/rotZ 9/zoom 1.9 绕到 rotX 42/rotY 24/rotZ −6/zoom 1.8,persp 1100 | 特写四件套缺一不可:侧面倾斜角+可感知高度+orbit+反差深色材质(Q7,用户逐项点名) |
22
+ | 堆叠高度 | STACK_STEP=3px 物理层高 × 26 张 → 顶卡 z≈78px;姿态抖动 px/py 按 `(((k*7)%9)−4)*2` 确定性公式 ±8px、rotZ ±3° | 抖动必须确定性伪随机(硬规则:渲染必须可复现),真随机会渲染间抖动 |
23
+ | 石墨桌面 | 4 层叠加:随拉远扩大的顶光 radial + 104deg 宽幅镜面高光带 + 确定性 feTurbulence 各向异性拉丝纹小图平铺(baseFrequency 0.0018×0.62,alpha 0.4)+ 115deg 冷灰渐变;平面向外扩 4000px、远处柔边隐进暗场。页面板(截图内容区 x 352–1568 + 纸面延长)开场被 0.88 暗层盖住,34→64f 以牌堆为圆心柔边光圈揭开;落进未照亮区域的卡用同一公式压暗 | 别再整层淡出金属换成全屏白纸——暗/亮反差是这镜的质感来源;拉丝纹在 0.5x 俯瞰下对比要压低,否则出摩尔纹 |
24
+ | 预备拍 | 首发 cue 前 10f(26→36):牌堆整体下压 48px(约堆高六成)+ 顶卡向出牌反方向回拉 30px,缓动 easeOut,首发瞬间释放 | **幅度必须过肉眼阈值**:4px/2px 初版用户实测完全无感,放大 12 倍(48/30px)才裁决通过(判例 2026-07-09 进化轮 #2)——渲染后自查"不逐帧能否看出蓄力",看不出等于没做;帧预算从 orbit 尾段挪,不挤占发牌段 |
25
+ | 发牌节拍 | 第 k 张 cue = 36 + 4k − 0.0792·k(k−1),间隔 4f 收缩到 0.2f | 均匀间隔立刻显得机械;匀加速不够狠也被否——要"hard-accelerating"级别(R2/B3) |
26
+ | 卡量 | 10 真卡 + 16 extras = 26 张;网格向下扩 5 行、纸面延长 2036px | 卡不够多涌入感不成立——宁多勿少;extras 落进真实扩展格位,不悬浮(Q9) |
27
+ | 单卡飞行 | deal 8f(bezier(0.3,0,0.2,1),z 弧顶 +110px sin、scale 峰值 1.06)+ settle 4f(bezier(0.3,0,0.25,1.15) 轻过冲)+ press 0.996→1 回弹 2f | 落地要弹必须 y1>1 的 bezier;settle+press 合计 6f ≈ 飞行 8f 的 30%——快停配足缓冲(法则 5 比例);落定后强制 identity transform 防斜板亚像素漂移 |
28
+ | 收尾拖拽层级 | rest 段内分层停稳:卡体 press 回弹结束即锁定,落地阴影 `0 32px→0 2px` 收敛滞后卡体 2–4f,飞行残影 opacity 尾梢再拖 3–5f 消散 | 借鉴法则 5 的 drag hierarchy(根→主→次级错帧 2–4f);0.5s rest 静止判例不变——层级错帧发生在 rest 段头部,rest 末端全部锁死(模式已沉为 assets/lib/helpers/motion.ts lagged) |
29
+ | 运动模糊(单卡) | 飞行中 5% 路径滞后 blur(6px) 残影,opacity 0.25·(1−t) | ghost 残影比真 motion blur 便宜且够用——单卡层面维持此方案 |
30
+ | 运动模糊(相机) | 追逐 scroll 等 ≥30px/f 的快速运镜段用 `@remotion/motion-blur` 的 `<CameraMotionBlur shutterAngle={180} samples={10}>` 包镜;用 `<Sequence>` 把包裹范围切到快速段起点,慢速特写段(<10px/f)不包 | 30fps 下相机每帧跳 50–70px 会频闪,快摇拖影是电影摄像机的物理本能;shutterAngle 越大拖影越长(>270 发糊),samples 按渲染预算调(每 +1 约 +1 倍渲染时间);整镜全包会把慢速 orbit 段的 1px 级细纹理(拉丝金属)采样抹软——只包快速段;借鉴 Remotion 官方生态非用户判例(2026-07-11 进化轮 #8) |
31
+ | 追逐 + 升起 | 锚点 f62 正视板顶(zoom 0.8,rotX 22)→ f86 板中(zoom 0.56,rotX 38,rotZ −10)→ f110 跑道俯瞰(zoom 0.5,rotX 52,rotY −6,rotZ −26,persp 3300,屏幕右移 300px 给左下标语让位)→ f150 zoom 0.508 | persp 要随后仰同步加大(1100→3300),否则近端越过相机平面穿帮;满板后静止是用户逐字要求(R2),hold 只许极缓推近 |
32
+
33
+ ## 声音
34
+ orbit 拉远+首批发牌钉 whoosh-big(模板片钉在 f308),发牌加速段钉 whoosh-fast(f340/356)。连发落位音防机枪感三招:双样本交替、音量阶梯递减、间隔跟随动画曲线加速——密到糊成一片时让声音淡出成一条 swoosh,不逐卡配音(S2)。
35
+
36
+ ## 已知坑
37
+ - 抽象 flood 式多轮不收敛,换"发牌"物理隐喻一轮通过(R2/B3)——群体运动先找物理隐喻再写代码
38
+ - 卡纹理必须真实页面元素切片(Q1),手搓假卡一眼假;extras 复用真卡切片错位摆放
39
+ - 全部同时飞读作爆炸,错峰递加速是灵魂;前半 orbit 若砍掉,发牌起点要另给"牌堆从哪来"的交代
40
+ - anticipation/follow-through 手法借鉴自迪士尼 12 法则(pixel2motion skill 内置提炼版);预备拍幅度已有用户判例(2026-07-09:"OK能看出来了",此前两档小幅度均无感);拖拽层级错帧仍是默认建议——与 R2 判例冲突时(如用户要求更快更硬)判例优先
41
+ - 教科书比例(预备 = 主动作 20–30%)在拉远机位下产出的像素位移过小——**先算像素再算比例**,宣传片观众看的是全景不是特写
42
+ - `<Sequence>` 重定基帧号 + CameraMotionBlur 内部 Freeze 会让 PageCam 采样错帧(横向错模糊穿帮)——绝对帧编排的镜头给 PageCam 传 `frame` prop 还原绝对帧(lib 组件已支持)
43
+
44
+ ## 参考实现
45
+ demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx(原 template/src/aifl/live/SceneFlyIn.tsx 0–113 段)