Motion · Ánh sáng & nhấn
Nét vẽ sôi động
Nét vẽ sôi động — trong lúc giữ hình, viền chữ/nét vẽ hơi lay động mỗi 3 khung hình như đang được vẽ lại tay từng khung, giữ cho hình tĩnh vẫn "sống" và thở đều.
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
Đoạn giữ hình dài cho thẻ tiêu đề/phần tử viền nét (lựa chọn nâng cấp hàng đầu cho thẻ chữ nền đen); thủ pháp chất liệu, bám vào một cảnh khác.
Ý đồ
Tiền lệ trong thư viện yêu cầu "tĩnh thật" sau khi ổn định, nhưng thẻ tiêu đề dài đóng băng hoàn toàn sẽ đọc thành "phim bị đơ". Thẻ này cho một trạng thái thứ ba: tĩnh mà vẫn sống — viền nét được "vẽ lại" mỗi 3 khung hình, vị trí và nội dung hoàn toàn không đổi, chỉ có mép nét đang thở cực nhẹ, một quy ước hàng thế kỷ của khung giữ hình trong hoạt hình vẽ tay. Khác với kỹ thuật trôi dạt đã bị loại: sự khác biệt nằm ở khả năng cảm nhận được — trôi dạt là dịch chuyển tổng thể mắt thường không đọc ra, sôi động là biến dạng viền kèm bước nhảy rõ nhìn thấy được. Trong thẩm mỹ giấy mực, đây chính là nguồn gốc trực tiếp của "cảm giác thủ công".
Thời lượng & năng lượng
- Thời lượng: Ký sinh — đoạn sôi động kéo dài theo độ dài giữ hình của cảnh chủ, không có thời lượng riêng
- Năng lượng: Thấp (mức nhiễu nền)
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)
意图
库内 R 系判例要求落定后"真静止",但长字卡(3s+ 的黑场字卡、片尾) 完全冻结会读作"片子卡了"。本卡给第三种状态:活着的静止——轮廓 每 3 帧被"重描"一次,位置内容全然不动,只有线条边缘在极轻微地呼吸, 手绘动画 hold 帧的百年惯例。与 noise-drift(被否决)的区别正是可感性: 漂移是整体 1–3px 位移(肉眼读不出),沸腾是轮廓形变+阶梯跳变(每次 换 seed 都是一次可见的"重描")。纸墨审美里这是"手工感"的直接来源。
动效核心
- SVG filter:feTurbulence(fractalNoise, baseFrequency 0.015,
numOctaves 2) + feDisplacementMap scale=8(原案 3–6 不可感, 已加码)作用于文字/描边层
- seed = Math.floor(f/3) 阶梯换——每 3 帧跳一次新形变,
10fps 的手翻书质感;逐帧换 seed 读作电噪不是手绘
- 摘罩命门(feTurbulence 判例):沸腾段之外 filter 与 SVG defs
根本不渲染(条件挂载),不是 opacity 到 0——否则永不真静止
- 结构靠对比:demo 用 静止 35f → 沸腾 70f → 摘罩静止 35f 三段
自证可感;实战沸腾段直接铺满宿主 hold
参数表
| 参数 | 典型值 | 调节手感 | |------|--------|----------| | displacement scale | 8(大字标题);小字/细线 5–6 | >12 读作故障扭曲;<4 不可感 | | seed 节拍 | floor(f/3),即每 3 帧重描 | /2 太贼、/4 以上读作卡顿跳帧 | | baseFrequency | 0.015(形变尺度约字高级) | 0.05+ 变成毛边噪点,不是"重描" | | 适用对象 | 大标题、描边框、手绘圈注 | 实心小元素(图标/头像)沸腾读作模糊 | | 与 R 系关系 | 沸腾段视作合法 hold;宿主镜头收尾若需绝对静止则提前 ≥15f 摘罩 | 摘罩瞬间轮廓归位本身就是一次收束 |
已知坑
- demo 在灰阶/占位素材上调校通过——参数是调校起点非实战定稿,
首次实战须以真实素材回验
- 全片同时沸腾的元素 ≤1 组——标题在沸腾、卡片框也在沸腾,观众
找不到该看哪(P4)
- 与 speed-lines/集中线的"沸腾"(impact-feedback C 式每 2 帧换形态)
同族不同职:那是冲击帧的高能沸腾,这是 hold 帧的底噪沸腾,能量 档位差两级,别互换参数
- SVG filter 对大面积层有渲染开销;1920 全幅文字层可接受,整页
截图套 boil 渲染时间翻倍且语义不对(页面不是手绘物)
- paper-title-card/黑场字卡(shot-transitions D 式)是本卡首选宿主,
组合时字卡的打字机/压印入场完成后再起沸腾
参考实现
demos/effects/line-boil/ (LineBoil.tsx)
Mã nguồn tham chiếu (Remotion)
- demos/effects/line-boil/LineBoil.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/effects/line-boil/LineBoil.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/line-boil.jsongit clone https://github.com/Vincentwei1021/video-shotcraft
# component: demos/effects/line-boil/LineBoil.tsx
npx remotion render <CompositionId> out.mp4claude mcp add --transport http gimgs https://gimgs.net/mcp
# then: search_motion_templates / get_motion_template("line-boil")Prompt
Use the video-shotcraft shot recipe "Nét vẽ sôi động" (Remotion composition, Apache-2.0) published on gimgs.net. Recipe JSON (prompt = timing/easing/parameter table/pitfalls, files = TSX source): https://gimgs.net/motion/line-boil.json Raw TSX: https://gimgs.net/motion/line-boil/template.html Repository: https://github.com/Vincentwei1021/video-shotcraft (component: demos/effects/line-boil/LineBoil.tsx; imports demos/_fixtures and assets/lib) Spec: 1920x1080, 30 fps, 4.72s 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/effects/line-boil/LineBoil.tsx =====
// 线条沸腾(line-boil)——手绘动画 line boil 质感:静止线稿在"沸腾段"
// 边缘逐帧微颤,像手绘逐帧描线的抖动。SVG filter feTurbulence(baseFrequency
// 0.015, numOctaves 2, seed = Math.floor(f/3) 每 3 帧阶梯换) + feDisplacementMap
// scale=8(原案 3–6 已按可感性加码)作用于大标题 "ALIVE" 与描边卡整层。
// 结构靠"对比"可感:先静止(干净版)→ 沸腾 → 摘罩回静止;判例:feTurbulence
// 收尾必须整个 filter 移除(沸腾段外根本不渲染 filter 与 SVG def),
// 105f 起逐帧完全相同,真静止 ≥35f。
// 关键帧:0–35 完全静止(boil off) → 35–105 沸腾(boil on, seed 每 3 帧一换)
// → 105 摘罩 → 105–140 真静止(boil off)。
import React, { useId } from 'react';
import { useCurrentFrame, interpolate } from 'remotion';
import { G, TitleBlock } from '../../_fixtures/Fixtures';
const BOIL_START = 35;
const BOIL_END = 105;
const BOIL_SCALE = 8; // 原案 3–6 已按可感性加码;QA 看不出再加到 12
const CornerTag: React.FC<{ text: string; opacity: number }> = ({ text, opacity }) => (
<div
style={{
position: 'absolute',
right: 72,
bottom: 56,
padding: '10px 22px',
border: `3px solid ${G.ink}`,
borderRadius: 999,
color: G.ink,
background: G.bg,
fontFamily: 'Helvetica, Arial, sans-serif',
fontWeight: 700,
fontSize: 30,
letterSpacing: 2,
opacity,
}}
>
{text}
</div>
);
export const LineBoil: React.FC = () => {
const f = useCurrentFrame();
// 滤镜 ID 按实例生成,多实例同场不串引(useId 的 «:» 在 url() 里非法,需清洗)
const boilId = `boil-${useId().replace(/[^a-zA-Z0-9]/g, '')}`;
const boiling = f >= BOIL_START && f < BOIL_END;
// seed 每 3 帧阶梯换 → 8~10Hz 的手绘颤动感;帧确定,无随机源
const seed = Math.floor(f / 3);
// 角标:boil on 只在沸腾段淡入淡出;boil off 与之互补。
// 全部过渡在 105f 前完成 → 105–140 逐帧完全相同
const onOp = interpolate(f, [35, 40, 100, 105], [0, 1, 1, 0], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
});
const offOp = 1 - onOp;
return (
<div style={{ width: 1920, height: 1080, background: G.bg, position: 'relative', overflow: 'hidden' }}>
{/* 沸腾段才渲染 filter 定义——摘罩即整个 SVG def 消失,收尾天然真静止 */}
{boiling && (
<svg width={0} height={0} style={{ position: 'absolute' }}>
<defs>
<filter id={boilId} x="-15%" y="-15%" width="130%" height="130%">
<feTurbulence
type="fractalNoise"
baseFrequency={0.015}
numOctaves={2}
seed={seed}
result="noise"
/>
<feDisplacementMap
in="SourceGraphic"
in2="noise"
scale={BOIL_SCALE}
xChannelSelector="R"
yChannelSelector="G"
/>
</filter>
</defs>
</svg>
)}
{/* 手法名标签:不入滤镜层,作为静止参照物 */}
<div style={{ position: 'absolute', left: 120, top: 96 }}>
<TitleBlock text="LINE BOIL" size={54} />
</div>
{/* 被沸腾的整层:大标题 + 描边卡 */}
<div
style={{
position: 'absolute',
inset: 0,
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
gap: 56,
filter: boiling ? `url(#${boilId})` : undefined,
}}
>
<div
style={{
fontFamily: 'Helvetica, Arial, sans-serif',
fontWeight: 800,
fontSize: 170,
color: G.ink,
letterSpacing: 4,
lineHeight: 1,
}}
>
ALIVE
</div>
{/* 描边卡:透明底 3px ink 描边 520×300 圆角框 + 几条灰线 */}
<div
style={{
width: 520,
height: 300,
border: `3px solid ${G.ink}`,
borderRadius: 20,
boxSizing: 'border-box',
padding: '36px 40px',
display: 'flex',
flexDirection: 'column',
gap: 26,
}}
>
<div style={{ height: 16, width: '62%', background: G.mid, borderRadius: 8 }} />
<div style={{ height: 12, width: '88%', background: G.bar, borderRadius: 6 }} />
<div style={{ height: 12, width: '74%', background: G.bar, borderRadius: 6 }} />
<div style={{ height: 12, width: '81%', background: G.bar, borderRadius: 6 }} />
<div style={{ marginTop: 'auto', display: 'flex', gap: 12, alignItems: 'center' }}>
<div style={{ width: 30, height: 30, borderRadius: 15, border: `3px solid ${G.ink}`, boxSizing: 'border-box' }} />
<div style={{ height: 12, width: 120, background: G.mid, borderRadius: 6 }} />
</div>
</div>
</div>
{/* 状态角标:沸腾段 boil on,静止段 boil off */}
<CornerTag text="boil on" opacity={onOp} />
<CornerTag text="boil off" opacity={offOp} />
</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/effects/line-boil/LineBoil.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

Đèn rọi hiện hình trên nền tối
Ba kiểu đèn rọi hiện hình trên nền tối — A quét thức-ngủ (đèn tới thì sáng, đèn đi thì tối), B quét ngang rìa viền (ánh tím bám mép UI thấm vào + đèn quét phải đều), C hiện hình đều từ góc (đèn hình tròn nở đều từ góc sáng cả màn hình); ánh sáng chính là lời kể trên nền đen.

Đập vào cảnh năng lượng cao
Ba kiểu đập vào cảnh năng lượng cao: dừng phối cảnh kiểu Kanada, đập rơi tỷ số, hoặc lan chấn động sang thẻ lân cận.

Vệt sáng quét lắp ráp bay vào
Vệt sáng quét từ trên xuống lưới nền tối trống, tới đâu thành phần vùng đó bay vào khớp vị trí — quét xong là lắp ráp xong.

Vệt sáng quét chú thích tiêu điểm
Một vệt sáng quét từ trên xuống dưới trang, khoanh khung ngắm kiểu máy ảnh vào từng vùng nó đi qua rồi gắn chú thích chữ mono.