Motion · Nhịp & montage
Ảnh bóng lặp kiểu smear
Ảnh bóng smear — thẻ để lại 4 bản sao bán trong suốt rõ, đếm được khi lướt ngang nhanh, gộp lại làm một lúc dừng; phương án dựng hình thay cho motion blur.
Nguồn: video-shotcraft (Vincent Wei) ↗ · Apache-2.0 · Composition Remotion (React/TSX) — có video preview, không có player trong trình duyệt
Khi nào dùng
Dùng khi đoạn dịch chuyển nhanh cần "cảm giác tốc độ kiểu truyện tranh" thay vì "mờ kiểu chụp ảnh"; chọn một trong hai với CameraMotionBlur
Ý đồ
Đáp án chuẩn trong thư viện cho tốc độ khi di chuyển nhanh là CameraMotionBlur (ẩn dụ máy ảnh: vệt trập, mờ liên tục). Thẻ này đưa ra đáp án thứ hai, truyền thống smear frame của hoạt hình: ảnh bóng là bản sao rời rạc, rõ nét, đếm được — khán giả đếm được 4 thẻ, đọc thành "nhanh đến mức để lại phân thân" chứ không phải "nhanh đến mức nhòe". Hai chất khác hẳn nhau: blur mang chất quay thực, phân thân mang chất vui hoạt hình; một lần dịch chuyển chỉ chọn một, dùng chồng đọc thành lỗi dựng hình. Kiểu phân thân còn có lợi thế thực tế: nội dung trong ảnh bóng vẫn đọc được, hợp với cảnh "thứ đang di chuyển chính là thông tin".
Thời lượng & năng lượng
- Thời lượng: Kỹ thuật cấp phần tử (di chuyển 12f + gộp bật lại 8f, bám theo động tác dịch chuyển)
- Năng lượng: Trung bình cao
Công thức cảnh quay (bản gốc tiếng Trung — timing, easing, bảng tham số, lỗi hay gặp)
意图
快速位移的速度感库内标准答案是 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)
Mã nguồn tham chiếu (Remotion)
- demos/rhythm/smear-multiples/SmearMultiples.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/rhythm/smear-multiples/SmearMultiples.tsx
Component import fixture chung từ demos/_fixtures và helper từ assets/lib của repo; xem SKILL.md trong repo để biết quy trình render.
Mọi thứ trên trang này đều có bản máy đọc. Đưa agent link JSON, hoặc thêm MCP server gimgs rồi bảo nó tìm motion template.
- Tải JSON — trong đó có công thức cảnh quay (timing, easing, bảng tham số, lỗi hay gặp) và toàn bộ source TSX.
- Clone repo video-shotcraft; component import fixture chung từ demos/_fixtures và helper từ assets/lib.
- Đăng ký component thành <Composition> trong project Remotion rồi render bằng `npx remotion render`, hoặc dựng lại công thức bằng engine của bạn.
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 "Ảnh bóng lặp kiểu smear" (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 |
|---|---|---|---|
| — | |||
Cùng danh mục

Ngữ pháp trailer: ba nhịp
Ba thủ pháp ngữ pháp trailer — trailer-bumper cắt nhanh móc câu mở đầu, card-footage-cadence xen thẻ chữ với cảnh đối thoại, smash-cut đập cắt vào tĩnh lặng.

Đổi tốc độ và đóng băng chú thích
Hai thủ pháp nhịp điệu remap số khung hình phi tuyến — speed-ramp (nhanh → 0.2x nhìn kỹ → nhanh) và freeze-annotate (chảy → đóng băng khoanh chú thích → tan băng).

Gạch chân hóa phổ tần
UI hóa phổ tần — gạch chân tiêu đề tách thành dải cột dọc nhảy theo phổ tần suốt hai nhịp, rồi thu lại thành đường thẳng; hình ảnh hóa nhạc sống trong UI.

Chuyển nhịp kiểu sakuga
Từ một-đập-ba sang một-đập-một — yếu tố di chuyển giật cục mỗi 3 khung hình một bước, rồi bật sang mượt từng khung hình ở cao trào.