Motion · Intro
Letterspace materialize
A wide-tracking wordmark crystallizes with all characters drawn in parallel — every letter starts its stroke on the same frame, growing continuously like handwriting, finishing the word on the same frame.
Source: video-shotcraft (Vincent Wei) ↗ · Apache-2.0 · Remotion composition (React/TSX) — preview video, no in-browser player
When to use
A brand wordmark entrance for an opener/closer (all-caps wide tracking in the SUPERHUMAN style); chapter titling; a closing frame that needs a quiet, premium feel.
Intention
A wordmark shouldn't fade in or type in — it should "crystallize": every letter's stroke begins growing continuously at the same instant, as if an invisible hand were writing all the letters at once, finishing the word on the exact same frame. Two crux points: continuity (the strokes must be a continuously drawn process, no masking in segments — every intermediate frame should look like "mid-stroke"); synchrony (all letters start on the same frame and finish on the same frame — staggering letter by letter is typewriter semantics; this is a whole-word, unified ritual feel).
Duration & energy
- Duration: Hold ~15f + drawing ~50f + final hold ≥30f; whole segment 3–4s
- Energy: Low (a quiet ritual feel, completed in one breath)
Shot recipe (original Chinese — timing, easing, parameter table, known pitfalls)
意图
字标不是淡入也不是打字机,而是"结晶":全部字母的笔画同时 开始连续生长,像一只看不见的手同时写所有字母,同一瞬间齐收 成词。两个命门:连续(笔画必须是连续画出的过程,不许遮罩 分段——先半截再另半截会被读穿;任何中间帧都该像"写到一半"); 同步(所有字母同帧起笔、同帧完成——逐字错峰是打字机语义, 这里是整词一体的仪式感)。
动效核心
- 每个字符用骨架笔画 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
Reference implementation (Remotion)
- demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx
The component imports shared fixtures from demos/_fixtures and helpers from assets/lib in the repo; SKILL.md there documents the render workflow.
Everything on this page is also machine-readable. Point your agent at the JSON, or add the gimgs MCP server and ask it to search motion templates.
- Fetch the JSON — it holds the shot recipe (timing, easing, parameter table, pitfalls) and the full TSX source.
- Clone the video-shotcraft repo; the component imports shared fixtures from demos/_fixtures and helpers from assets/lib.
- Register the component as a <Composition> in a Remotion project and render with `npx remotion render`, or re-implement the recipe in your own engine.
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 "Letterspace materialize" (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 |
|---|---|---|---|
| — | |||
More in this category

Text-as-video mask
Text as video mask — extra-bold title letters reveal slowly panning product footage through them; at the end the letterforms scale up 26x and overflow, and the inner footage takes over the full screen.

Broken-stroke title reveal
Broken strokes into letters — a title breaks into a dozen-plus disconnected stroke segments that light up out of order; 70% unreadable, then the last segment lands and the meaning snaps into place.

Spotlight hero card reveal
A spotlight sweeps the page and locks onto one card; it pushes in at 45°, the card lifts and hovers, a light beam circles its outline twice, then it settles back in place.

Orbit ring title opening
Eight content cards orbit a 700×375 ellipse at constant speed while a centered title resolves into focus and settles.