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.

1920×108016:930 fps4.39s · 132 quadrosremotionLicença: Apache-2.0#shotcraft#remotion#intro#opening#typography#outro

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

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.

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.

  1. Baixe o JSON — contém a receita do plano (timing, easing, tabela de parâmetros, armadilhas) e o código TSX completo.
  2. Clone o repositório video-shotcraft; o componente importa fixtures de demos/_fixtures e helpers de assets/lib.
  3. 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/letterspace-materialize.json
git clone https://github.com/Vincentwei1021/video-shotcraft
# component: demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx
npx remotion render <CompositionId> out.mp4
claude 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).

JSON · Markdown · llms.txt

3,320 chars · Apache-2.0Abrir template bruto ↗
// ===== 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>
  );
};


  1. Read the recipe
    Prompt = when to use, intention, parameter table with typical values and how each one feels, known pitfalls. Treat values as calibrated starting points.
  2. Get the code
    tool: git
    git clone https://github.com/Vincentwei1021/video-shotcraft && cd video-shotcraft && npm install
  3. Register + render
    tool: remotion
    npx remotion render <CompositionId> out.mp4 # component: demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx
  4. Or re-implement
    Port the timing/easing from the recipe to HTML + WAAPI (gimgs motion contract) or any engine; keep the same segment windows and easing.
paramtypedefaultdescription
—

Mais nesta categoria