Motion · Intro
Chữ dãn cách kết tinh hiện hình
Chữ thương hiệu dãn cách rộng kết tinh với tất cả ký tự vẽ song song — mọi chữ cái bắt đầu nét cùng một khung hình, lớn dần liên tục như chữ viết tay, hoàn thành cùng một khung hình.
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
Cảnh vào của chữ thương hiệu cho phần mở/kết (chữ hoa dãn cách rộng kiểu SUPERHUMAN); tiêu đề chương; khung kết cần cảm giác tĩnh lặng, sang trọng.
Ý đồ
Chữ thương hiệu không nên mờ hiện cũng không nên gõ ra, mà phải "kết tinh": nét vẽ của mọi chữ cái bắt đầu lớn dần liên tục cùng một khoảnh khắc, như một bàn tay vô hình viết tất cả các chữ cùng lúc, hoàn thành cả từ đúng cùng một khung hình. Hai điểm chốt: liên tục (nét vẽ phải là một quá trình vẽ liên tục, không được che theo từng đoạn; bất kỳ khung hình giữa nào cũng phải trông như "đang vẽ dở"); đồng bộ (mọi chữ cái bắt đầu cùng khung hình, hoàn thành cùng khung hình — lệch nhịp từng chữ là ngữ nghĩa máy chữ, ở đây là cảm giác nghi thức thống nhất của cả từ).
Thời lượng & năng lượng
- Thời lượng: Giữ hình ~15f + vẽ nét ~50f + giữ hình cuối ≥30f; cả đoạn 3–4s
- Năng lượng: Thấp (cảm giác nghi thức tĩnh lặng, hoàn thành trong một hơi thở)
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)
意图
字标不是淡入也不是打字机,而是"结晶":全部字母的笔画同时 开始连续生长,像一只看不见的手同时写所有字母,同一瞬间齐收 成词。两个命门:连续(笔画必须是连续画出的过程,不许遮罩 分段——先半截再另半截会被读穿;任何中间帧都该像"写到一半"); 同步(所有字母同帧起笔、同帧完成——逐字错峰是打字机语义, 这里是整词一体的仪式感)。
动效核心
- 每个字符用骨架笔画 SVG path(单线条字形),pathLength 归一 +
strokeDashoffset 从 1→0 连续描画
- 全字符共享同一进度 p:同帧起笔、pathLength 归一保证不同笔画
长度的字母同帧齐收(不做 per-char delay/jitter)
- 字形比例:方正略宽(字面宽高比 ≈1.07,实测判例:竖长字形被
裁"太竖长");细笔画+大字距(letterSpacing ≈0.6em)
- 描画曲线:整体 ease-in-out,中段略快首尾略缓(起笔收笔的手感)
- 底景:氛围渐变/实拍空镜(暮色山景类),字标是画面唯一动作
参数表
| 参数 | 典型值 | 调节手感 | |------|--------|----------| | 描画时长 | ~50f(f16 起 f68 收 @30fps) | <30f 读不出"画"的过程;>80f 拖 | | 同步性 | 全字符同帧起收、零错峰 | 判例:逐字错峰版被裁"所有字母是在同一个时间完成书写" | | 连续性 | pathLength 连续生长、无分段跳变 | 判例:遮罩分段版被裁"应该是连续的笔画画出来" | | 字形 | 骨架单线、字面宽高比 ~1.07、笔画细 | 竖长(比 <0.8)被裁;粗笔画丢结晶感 | | 字距 | ~0.6em | 大字距是本卡身份;<0.3em 改用普通描画卡 | | 终态静置 | ≥30f | 结晶完成后必须让观众读一次整词 |
已知坑
- demo 在灰阶/占位素材上调校通过——参数是调校起点非实战定稿,
首次实战须以真实素材回验
- 与 draw-svg-trace 分工:那张是通用描画(图标/插画/单元素);
本卡命门是全字符同步的整词结晶仪式,且限品牌字标语境
- 与 type-assembly-moves 分工:那张是字块组装(位移拼合);
本卡笔画从无到有生长,字符不位移
- 骨架字形需手绘 path(现成字体轮廓是双线勾边,描画观感不同);
9 字形工作量 ≈1h,实战优先复用 demo 里的字形库
- 原片(superhuman-promo)底景是实拍暮色山景+水面倒影;demo 为
渐变近似,实战建议用实拍/AI 生成空镜
参考实现
demos/opening/letterspace-materialize/ (LetterspaceMaterialize.tsx) 原片出处:superhuman-promo.mp4 ≈4.5–6.5s
Mã nguồn tham chiếu (Remotion)
- demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/opening/letterspace-materialize/LetterspaceMaterialize.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/letterspace-materialize.jsongit clone https://github.com/Vincentwei1021/video-shotcraft
# component: demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx
npx remotion render <CompositionId> out.mp4claude mcp add --transport http gimgs https://gimgs.net/mcp
# then: search_motion_templates / get_motion_template("letterspace-materialize")Prompt
Use the video-shotcraft shot recipe "Chữ dãn cách kết tinh hiện hình" (Remotion composition, Apache-2.0) published on gimgs.net. Recipe JSON (prompt = timing/easing/parameter table/pitfalls, files = TSX source): https://gimgs.net/motion/letterspace-materialize.json Raw TSX: https://gimgs.net/motion/letterspace-materialize/template.html Repository: https://github.com/Vincentwei1021/video-shotcraft (component: demos/opening/letterspace-materialize/LetterspaceMaterialize.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/opening/letterspace-materialize/LetterspaceMaterialize.tsx =====
// letterspace-materialize v3 —— 按批次 11 用户意见修正(截图 superhuman,4 张):
// ① 字形比例改宽:v2 竖长(60x100),对照终态截图字高≈50/字宽≈58(宽高比≈1.15),
// v3 重绘全部骨架字形到 78x64 视框(字面 58x54),方正略宽 + 细笔画 + 大字距;
// ② 所有字母同时开始同时完成:去掉 v2 的逐字错峰(PER/jitter),全字符同一帧起笔、
// pathLength 归一保证不同笔画长度的字母在同一帧齐收(截图 2/3 的全行并行半截态)。
import React from 'react';
import { AbsoluteFill, interpolate, useCurrentFrame } from 'remotion';
// 78x64 视框内的方正略宽细骨架字形(子笔画顺序=描画顺序)
const GLYPHS: Record<string, string> = {
S: 'M 62 13 C 51 4, 18 3, 15 15 C 12 26, 29 29, 39 31 C 50 33, 66 37, 63 48 C 60 59, 21 61, 11 50',
U: 'M 12 5 L 12 40 C 12 59, 66 59, 66 40 L 66 5',
P: 'M 12 59 L 12 5 L 44 5 C 64 5, 64 32, 44 32 L 12 32',
E: 'M 62 5 L 12 5 L 12 59 L 62 59 M 12 31 L 56 31',
R: 'M 12 59 L 12 5 L 44 5 C 64 5, 64 31, 44 31 L 12 31 M 42 31 L 64 59',
H: 'M 12 5 L 12 59 M 66 5 L 66 59 M 12 31 L 66 31',
M: 'M 8 59 L 8 6 L 39 38 L 70 6 L 70 59',
A: 'M 7 59 L 39 5 L 71 59 M 17 41 L 61 41',
N: 'M 12 59 L 12 5 L 66 59 L 66 5',
};
const WORD = 'SUPERHUMAN';
const START = 16; // 全字符统一起画帧(无错峰)
const DUR = 52; // 全字符统一画完帧数(pathLength 归一→同帧齐收)
export const LetterspaceMaterialize: React.FC = () => {
const frame = useCurrentFrame();
// 全字符共享同一进度:同时开始、同时完成
const p = interpolate(frame, [START, START + DUR], [0, 1], {
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
});
// easeInOut:起笔缓→中段匀速→收笔缓(手写感)
const e = p < 0.5 ? 2 * p * p : 1 - Math.pow(-2 * p + 2, 2) / 2;
// 画完瞬间轻微提亮回落(结晶收束)——全字符同帧发生
const doneGlow = interpolate(frame, [START + DUR, START + DUR + 8], [1, 0], {
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
});
const glowAmt = p >= 1 ? doneGlow : p > 0.7 ? (p - 0.7) / 0.3 : 0;
const letters = WORD.split('').map((ch, li) => (
<svg key={li} width={78} height={64} viewBox="0 0 78 64"
style={{ overflow: 'visible', display: 'block' }}>
{p > 0 && (
<path
d={GLYPHS[ch]}
fill="none"
stroke="#f4f2f8"
strokeWidth={5.5}
strokeLinecap="round"
strokeLinejoin="round"
pathLength={1}
strokeDasharray={1}
strokeDashoffset={1 - e}
style={{
filter: `drop-shadow(0 0 ${6 + glowAmt * 10}px rgba(240,235,255,${0.35 + glowAmt * 0.35}))`,
}}
/>
)}
</svg>
));
return (
<AbsoluteFill style={{
background: 'linear-gradient(178deg, #2c2a55 0%, #3d3465 30%, #241f40 58%, #0e0c1e 100%)',
alignItems: 'center', justifyContent: 'center',
}}>
{/* 暮色地平线光带(山影/晚霞近似) */}
<div style={{
position: 'absolute', left: 0, right: 0, top: 470, height: 170,
background: 'linear-gradient(180deg, rgba(232,150,170,0) 0%, rgba(226,140,165,0.20) 45%, rgba(120,100,170,0.12) 75%, rgba(0,0,0,0) 100%)',
filter: 'blur(20px)',
}} />
<div style={{
position: 'absolute', right: 130, top: 330, width: 560, height: 200,
background: 'radial-gradient(ellipse at center, rgba(216,120,160,0.16) 0%, rgba(0,0,0,0) 70%)',
filter: 'blur(26px)',
}} />
{/* 大字距字标:全字符并行连续描画 */}
<div style={{ display: 'flex', gap: 34, alignItems: 'center' }}>
{letters}
</div>
</AbsoluteFill>
);
};
- 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/opening/letterspace-materialize/LetterspaceMaterialize.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

Chữ làm mặt nạ video
Chữ làm mặt nạ video — tiêu đề chữ siêu đậm để lộ hình sản phẩm lướt chậm bên trong, cuối đoạn chữ phóng to 26 lần tràn khung, hình bên trong tiếp quản toàn màn hình.

Nét chữ rời ghép thành chữ
Nét đứt thành chữ — tiêu đề tách thành hơn chục đoạn nét rời không liền nhau, sáng lên không theo thứ tự; 70% đầu không đọc được, đoạn cuối vào vị trí thì ý nghĩa "bật" thành hình.

Đèn spotlight rọi thẻ hero
Đèn spotlight quét qua trang khóa vào một thẻ, đẩy máy nghiêng 45° rồi thẻ bật lên lơ lửng, luồng sáng quét quanh viền hai vòng, rồi áp lại vị trí cũ.

Vòng quỹ đạo mở tiêu đề
Tám thẻ nội dung xoay quanh hình elip 700×375 với tốc độ đều trong khi tiêu đề giữa màn hình rõ nét dần rồi an vị.