Motion · Ritmo
Smear-frame afterimages
Afterimage smear — a card drags 4 crisp, countable clones while panning fast, merging into one on landing; an animated take on motion blur.
Fonte: video-shotcraft (Vincent Wei) ↗ · Apache-2.0 · Composição Remotion (React/TSX) — vídeo de prévia, sem player no navegador
When to use
For fast-moving elements when you want a "comic-strip sense of speed" rather than a "photographic blur"; pick either this or CameraMotionBlur, not both
Intention
The library's standard answer for fast-motion speed is CameraMotionBlur (a photographic metaphor: shutter drag, continuous blur). This card gives a second answer, the anime smear-frame tradition: the afterimage is discrete, crisp, and countable — full copies. The viewer can count 4 cards and read it as "so fast it left clones" rather than "so fast it blurred." The two have completely different temperaments: blur is live-action-grade texture, smears are comic-grade fun; pick one per move — stacking both reads as a render error. Smears also have a practical edge: content inside the afterimages stays legible, good for scenes where "the thing that's moving is itself the information."
Duration & energy
- Duration: Element-level technique (12f move + 8f converge-and-settle, riding on top of the move)
- Energy: Medium-high
Shot recipe (original Chinese — timing, easing, parameter table, known pitfalls)
意图
快速位移的速度感库内标准答案是 CameraMotionBlur(摄影隐喻:快门拖影, 连续的糊)。本卡给第二个答案,动漫演出的 smear frame 传统:残像是 离散、清晰、可数的完整副本——观众能数出 4 张卡,读作"快到留下 分身"而非"快到糊掉"。两者气质完全不同:blur 是实拍级质感,分身是 漫画级趣味;同一次位移二选一,叠用读作渲染错误。分身式还有一个 实用优势:残像里内容仍可辨,适合"移动的东西本身是信息"的场景。
动效核心
- 位置写成纯函数
posAt(f)(如 12f inOut cubic 到过冲点 + 6f 回弹);
第 k 个分身直接求 posAt(frame − k·2)——同一条插值换帧号求值, 天然帧独立可算(disney 延迟采样拖拽层级的同一模式;模式已沉为 assets/lib/helpers/motion.ts velocityAt/lagged)
- 分身 opacity 0.45/0.30/0.18/0.09 递减,是完整元素副本(不拉伸不变形)
- 速度门限:
v = posAt(f) − posAt(f−1),v>25px/f 才渲染分身,
用 [25,60] 线性渐入避免分身瞬间跳出——低速段无残像是"快才有分身" 的语义完整性
- 落位合拢:cv∈[0,1](3f),分身延迟乘 (1−cv) 收缩到 0 + opacity 压零
——分身们"追上"本体的一瞬即落位重音,配合 3% 过冲回弹
参数表
| 参数 | 典型值 | 调节手感 | |------|--------|----------| | 分身数/间隔 | 4 个 / 各差 2f | >5 个读作队伍;间隔 >3f 断成跳帧 | | 移动速度 | ~900px/12f(峰值 ~100px/f) | 慢移动不配分身(门限管住);快过 3f/程分身来不及被看见 | | 合拢窗口 | 落位前 3f 内收干 | 分身残留到落位后读作重影故障 | | 收尾 | 落位回弹后真静止 ≥20f | R1 |
已知坑
- demo 在灰阶/占位素材上调校通过——参数是调校起点非实战定稿,
首次实战须以真实素材回验
- 与 CameraMotionBlur 同一次位移互斥;同片不同镜头可以各用(一次
漫画式一次摄影式反而立体),但同类位移统一用一种(P4 一致性)
- 分身是"清晰完整副本"——加 blur、拉伸、变形都会滑向另一个手法
(轴向拉伸在词汇表另案),保持可数是本卡的身份
- 深底浅卡对比度下分身层次才读得开;同色系底上 0.09 那档会消失,
可减为 3 个分身重配 0.5/0.3/0.15
参考实现
demos/rhythm/smear-multiples/ (SmearMultiples.tsx)
Reference implementation (Remotion)
- demos/rhythm/smear-multiples/SmearMultiples.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/rhythm/smear-multiples/SmearMultiples.tsx
The component imports shared fixtures from demos/_fixtures and helpers from assets/lib in the repo; SKILL.md there documents the render workflow.
Tudo nesta página também é legível por máquina. Aponte seu agente para o JSON ou adicione o servidor MCP do gimgs e peça para buscar templates de motion.
- Baixe o JSON — contém a receita do plano (timing, easing, tabela de parâmetros, armadilhas) e o código TSX completo.
- Clone o repositório video-shotcraft; o componente importa fixtures de demos/_fixtures e helpers de assets/lib.
- Registre o componente como <Composition> em um projeto Remotion e renderize com `npx remotion render`, ou reimplemente a receita no seu próprio engine.
curl -s https://gimgs.net/motion/smear-multiples.jsongit clone https://github.com/Vincentwei1021/video-shotcraft
# component: demos/rhythm/smear-multiples/SmearMultiples.tsx
npx remotion render <CompositionId> out.mp4claude mcp add --transport http gimgs https://gimgs.net/mcp
# then: search_motion_templates / get_motion_template("smear-multiples")Prompt
Use the video-shotcraft shot recipe "Smear-frame afterimages" (Remotion composition, Apache-2.0) published on gimgs.net. Recipe JSON (prompt = timing/easing/parameter table/pitfalls, files = TSX source): https://gimgs.net/motion/smear-multiples.json Raw TSX: https://gimgs.net/motion/smear-multiples/template.html Repository: https://github.com/Vincentwei1021/video-shotcraft (component: demos/rhythm/smear-multiples/SmearMultiples.tsx; imports demos/_fixtures and assets/lib) Spec: 1920x1080, 30 fps, 4.39s 1. Read the JSON and follow its "prompt" section (when to use, intention, parameter table, known pitfalls). 2. Adapt it for: <describe what you want>. 3. Either clone the repo, register the component as a <Composition> in a Remotion project and run npx remotion render <CompositionId> out.mp4 — or re-implement the recipe in your own engine (HTML/WAAPI works: keep the same timing and easing).
// ===== demos/rhythm/smear-multiples/SmearMultiples.tsx =====
// 残像分身(smear-multiples)——smear frame 多重残像。
// 卡片高速横移时身后拖 4 个"可数"的半透明完整分身(各取当前帧减 k*2 帧
// 时刻的位置,同一条插值函数换帧号求值,天然帧确定),与运动模糊的连续糊
// 相区别。分身仅在本体速度 >25px/f 时可见(速度 = 相邻帧位置差)。
// 关键帧:0–25 左槽 hold → 25–37 横移 900px(inOut cubic,带 3% 过冲)→
// 35–38 分身延迟收缩至 0 合拢进本体 + opacity 归零 → 37–43 过冲回弹 → 43–130 全静止。
import React from 'react';
import { useCurrentFrame, interpolate, Easing } from 'remotion';
import { G, Card, TitleBlock } from '../../_fixtures/Fixtures';
const X0 = 240; // 左槽卡片左边缘
const X1 = 1140; // 右槽卡片左边缘(横移 900px)
const OVER = 27; // 3% 过冲
const Y = 380; // 卡片顶边(垂直居中 1080-320)
// 本体位置:25–37 高速横移到过冲点,37–43 回弹落座,之后恒定 → 帧确定
const posAt = (f: number): number =>
f < 37
? interpolate(f, [25, 37], [X0, X1 + OVER], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
easing: Easing.inOut(Easing.cubic),
})
: interpolate(f, [37, 43], [X1 + OVER, X1], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
easing: Easing.out(Easing.cubic),
});
const Slot: React.FC<{ x: number }> = ({ x }) => (
<div
style={{
position: 'absolute',
left: x - 20,
top: Y - 20,
width: 520,
height: 360,
border: `3px dashed ${G.bar}`,
borderRadius: 20,
boxSizing: 'border-box',
}}
/>
);
export const SmearMultiples: React.FC = () => {
const frame = useCurrentFrame();
const bodyX = posAt(frame);
// 本体速度 = 相邻帧位置差;>25px/f 才渲染分身
const speed = Math.abs(posAt(frame) - posAt(frame - 1));
const speedGate = interpolate(speed, [25, 60], [0, 1], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
});
// 落位合拢:35–38 三帧内分身延迟收缩到 0(位置滑向本体)+ 不透明度归零
const cv = interpolate(frame, [35, 38], [0, 1], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
easing: Easing.out(Easing.quad),
});
const convergeFade = frame >= 35 ? 1 - cv : 0;
const ghostOps = [0.45, 0.3, 0.18, 0.09];
return (
<div style={{ width: 1920, height: 1080, background: G.bg, position: 'relative', overflow: 'hidden' }}>
<div style={{ position: 'absolute', left: 120, top: 96 }}>
<TitleBlock text="SMEAR MULTIPLES" size={54} />
</div>
<Slot x={X0} />
<Slot x={X1} />
{/* 4 个分身:第 k 个取 frame - k*2 帧时刻的位置;合拢期延迟×(1-cv) 收缩到 0 */}
{ghostOps.map((baseOp, i) => {
const k = i + 1;
const gx = posAt(frame - k * 2 * (1 - cv));
const op = baseOp * Math.max(speedGate, convergeFade);
if (op <= 0.001) return null;
return (
<div key={k} style={{ position: 'absolute', left: gx, top: Y, opacity: op }}>
<Card w={480} h={320} seed={5} />
</div>
);
})}
<div style={{ position: 'absolute', left: bodyX, top: Y }}>
<Card w={480} h={320} seed={5} />
</div>
</div>
);
};
- Read the recipePrompt = when to use, intention, parameter table with typical values and how each one feels, known pitfalls. Treat values as calibrated starting points.
- Get the codetool: git
git clone https://github.com/Vincentwei1021/video-shotcraft && cd video-shotcraft && npm install - Register + rendertool: remotion
npx remotion render <CompositionId> out.mp4 # component: demos/rhythm/smear-multiples/SmearMultiples.tsx - Or re-implementPort the timing/easing from the recipe to HTML + WAAPI (gimgs motion contract) or any engine; keep the same segment windows and easing.
| param | type | default | description |
|---|---|---|---|
| — | |||
Mais nesta categoria

Trailer grammar: three beats
Three trailer-grammar moves — trailer-bumper, a fast-cut hook up front; card-footage-cadence, text cards interleaved with dialogue footage; smash-cut, a slam into stillness.

Speed ramp and freeze-annotate
Two frame-remap pacing moves — speed-ramp (fast → 0.2x gaze → fast) and freeze-annotate (flowing → freeze with a circled callout → unfreeze).

Spectrum-morph underline
Spectrum UI morph — the title underline splits into vertical bars that pulse like a spectrum for two bars, then closes back into a straight line; music visualization living inside the UI.

Sakuga timing shift
On-3s cuts to on-1s — an element moves in choppy 3-frame steps, then snaps to buttery frame-by-frame speed at the climax.