Motion · Kết
Logo thu nhỏ ráp thành lockup
Vòng tròn neon cắt hở khổng lồ nhanh chóng thu về thành một chữ O trắng đặc nhỏ ở giữa kèm vượt ngưỡng rồi phanh lại, icon dịch trái nhường chỗ, các chữ cái lần lượt trượt vào hoàn thành lockup, khẩu hiệu kết thúc.
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
Đóng dấu thương hiệu ở đoạn kết: thu gọn từ năng lượng hình học toàn màn hình về lockup chuẩn "icon + chữ thương hiệu + khẩu hiệu".
Ý đồ
Động tác "đóng dấu" ở đoạn kết: vòng neon toàn màn hình mang theo năng lượng sụp về thành một icon nhỏ, liền lại phần hở, chuyển thành trắng thuần (từ trạng thái trình diễn sang trạng thái chuẩn), rồi lần lượt vào đúng vị trí theo quy chuẩn lockup thương hiệu — icon nhường chỗ, chữ thương hiệu vào cảnh, khẩu hiệu chốt hạ. Điều khán giả thấy là thương hiệu "đứng vững" sau chuyển động.
Thời lượng & năng lượng
- Thời lượng: Khoảng 4.4s (132f@30fps; thu gọn 0.1–1.2s · nhường chỗ 1.5–2.1s · chữ cái 2–2.7s · khẩu hiệu 3.2–3.7s)
- Năng lượng: Trung bình (đoạn thu gọn có lực va chạm, tổng thể là nhịp ổn định lắng xuống)
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)
意图
片尾的"盖章"动作:满屏的霓虹大环携能量坍缩成一枚小图标,愈合缺口、转为纯白(从演出态到标准态),然后按品牌 lockup 的规范一步步落位——图标让位、字标进场、标语押尾。观众看到的是品牌从动态里"站定"。
动效核心
- 收束主曲线:scale 5.4→1(t=0.02–0.28,inOutCubic),t=0.26–0.37 叠
sin(π)*0.06的过冲刹车——到位瞬间胀 6% 再回落,"急停带惯性" - 缺口愈合与变色和收束同轨(t=0.10–0.28):霓虹辉光层淡出、描边从 #dfe9ff 过半切 #fff、实心白 O 淡入——三层交叉在缩小过程中完成,落位时已是干净白标
- t=0.34–0.47 图标整体 translateX(−68px) 左移让位(inOutCubic),为字标腾出中轴右侧
- 五字母按
0.46 + i*0.035stagger 滑入:opacity 0→1 + translateX 8px→0,各 0.10 时长 outCubic - 标语(强调色
ACCENT,13px 宽字距)t=0.72–0.84 整行淡入,不逐字——层级低于字标一档
参数表
| 参数 | 典型值 | 调节手感 | |------|--------|----------| | 收束幅度 | scale 5.4→1 | 起始倍率决定"从多满收到多小";<3 冲击力不足,>7 初始态糊出画 | | 刹车过冲 | +6%,sin 包络 0.26–0.37 | 砍掉读作硬冻结;>10% 变果冻 | | 愈合窗口 | 0.10–0.28(与收束同步) | 愈合必须在落位前完成——落位后还在变色读作"没准备好" | | 左移让位 | −68px,0.34–0.47 | 与字母首入(0.46)几乎无缝衔接,拉开间隔会有"空等"感 | | 字母 stagger | 0.035/字,各 0.10 时长 | 5 字母合计约 0.28;字更多时按 (0.7-0.46)/n 反算间隔保证 0.7 前进完 | | 标语入场 | 0.72–0.84 整行淡入 | 有意不逐字:标语是注脚不是主角;ACCENT 常量换项目色 |
已知坑
WORDMARK(5 字母)与标语BUILD. SHIP. REPEAT.(20 字符)都是占位;换品牌词时字母 stagger 节奏依赖字数,标语保持近似字符数否则宽字距排版会溢出或过疏- 图标是 SVG 双弧切口环(抽象几何 mark),替换为真实品牌 logo 时保留"演出态→标准态"两层结构:一层带效果(辉光/彩色),一层纯净态,用同一条 heal 曲线交叉
- 左移量 −68px 与字标宽度耦合(row 定位在
50%-40px)——字数变化时两处一起调,让 lockup 整体在画面居中 - 收尾后无循环回位设计,作 outro 最后一镜使用;需要循环时在 t=1 后接 1s 静帧
参考实现
demos/outro/logo-shrink-wordmark-lockup/ (LogoShrinkWordmarkLockup.tsx)
Mã nguồn tham chiếu (Remotion)
- demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.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/logo-shrink-wordmark-lockup.jsongit clone https://github.com/Vincentwei1021/video-shotcraft
# component: demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx
npx remotion render <CompositionId> out.mp4claude mcp add --transport http gimgs https://gimgs.net/mcp
# then: search_motion_templates / get_motion_template("logo-shrink-wordmark-lockup")Prompt
Use the video-shotcraft shot recipe "Logo thu nhỏ ráp thành lockup" (Remotion composition, Apache-2.0) published on gimgs.net. Recipe JSON (prompt = timing/easing/parameter table/pitfalls, files = TSX source): https://gimgs.net/motion/logo-shrink-wordmark-lockup.json Raw TSX: https://gimgs.net/motion/logo-shrink-wordmark-lockup/template.html Repository: https://github.com/Vincentwei1021/video-shotcraft (component: demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx; imports demos/_fixtures and assets/lib) Spec: 1920x1080, 30 fps, 4.9s 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/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx =====
// logo-shrink-wordmark-lockup — Shrink & Lockup 图标收束落位(motion-lab 定稿转原生 Remotion)
// 霓虹切口大环 easeInOut 快速缩成中央实心小白 O(抽象几何 mark,末尾轻微过冲刹车),
// 随后图标左移让位,五个字母从左到右逐个 opacity+8px 滑入完成 lockup,
// 强调色标语延迟整行淡入收尾。设计坐标 480×270(DesignStage 等比放大)。
import React from 'react';
import { DesignStage, E, lerp, seg, useT } from '../../_fixtures/Motion';
export const LOGO_SHRINK_WORDMARK_LOCKUP_DURATION = 132; // 4400ms @30fps
const ACCENT = '#e0342c';
const WORDMARK = 'BRAND';
const ICON = 30; // 图标基准尺寸(px)
const SHIFT = -68; // 图标 lockup 左位偏移
// 圆弧 path(角度制,顺时针 sweep)
const arcPath = (cx: number, cy: number, r: number, a0: number, a1: number) => {
const p = (a: number) => [cx + r * Math.cos((a * Math.PI) / 180), cy + r * Math.sin((a * Math.PI) / 180)];
const [x0, y0] = p(a0);
const [x1, y1] = p(a1);
const large = Math.abs(a1 - a0) > 180 ? 1 : 0;
return `M${x0.toFixed(2)},${y0.toFixed(2)} A${r},${r} 0 ${large} 1 ${x1.toFixed(2)},${y1.toFixed(2)}`;
};
// 双弧组:a0-a1 与其对角(+180°)两段圆弧 —— 带缺口的切口环
const Arcs: React.FC<{ a0: number; a1: number; col: string; w: number; blur: number; opacity: number; stroke?: string }> = ({
a0,
a1,
col,
w,
blur,
opacity,
stroke,
}) => (
<g opacity={opacity}>
{[
[a0, a1],
[a0 + 180, a1 + 180],
].map(([b0, b1], i) => (
<path
key={i}
d={arcPath(15, 15, 10.5, b0, b1)}
fill="none"
stroke={stroke ?? col}
strokeWidth={w}
strokeLinecap="round"
style={blur ? { filter: `blur(${blur}px)` } : undefined}
/>
))}
</g>
);
export const LogoShrinkWordmarkLockup: React.FC = () => {
const t = useT();
// 收束:scale 5.4→1(easeInOut),末尾轻微 1.05 过冲刹车
const k = seg(t, 0.02, 0.28, E.inOutCubic);
const brake = Math.sin(seg(t, 0.26, 0.37) * Math.PI) * 0.06;
const s = lerp(k, 5.4, 1) * (1 + brake);
// 左移让位:落位后 t 0.34-0.47
const shift = seg(t, 0.34, 0.47, E.inOutCubic) * SHIFT;
// 霓虹缺口态 → 实心白 O 交叉淡化(随收束进行)
const heal = seg(t, 0.10, 0.28, E.inOutQuad);
// 底色标定:原样片 mp4(yuv420p,无色彩元数据)把 #05060a 解码回 rgb(3,5,9),
// 深底上 2/255 的恒差会拖垮平坦区 SSIM,这里钉到解码值;其余数值与 effect.js 一致
return (
<DesignStage bg="#030509">
<div style={{ position: 'absolute', inset: 0, overflow: 'hidden' }}>
{/* 图标:SVG 双弧切口环 —— 抽象几何 mark,非任何具体品牌 logo(收束时缺口愈合、霓虹转纯白) */}
<div
style={{
position: 'absolute',
left: '50%',
top: '50%',
width: ICON,
height: ICON,
margin: `${-ICON / 2}px 0 0 ${-ICON / 2}px`,
transform: `translateX(${shift}px) scale(${s})`,
}}
>
<svg
viewBox="0 0 30 30"
style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', overflow: 'visible' }}
>
{/* 霓虹晕(带缺口) */}
<Arcs a0={-32} a1={122} col="rgba(110,90,255,.6)" w={6.5} blur={2.5} opacity={1 - heal} />
{/* 霓虹芯:heal 过半后转纯白 */}
<Arcs
a0={-32}
a1={122}
col="#dfe9ff"
w={3.4}
blur={0}
opacity={1 - heal * 0.75}
stroke={heal > 0.5 ? '#fff' : '#dfe9ff'}
/>
{/* 愈合后的实心白 O */}
<circle cx={15} cy={15} r={10.5} fill="none" stroke="#fff" strokeWidth={5.5} opacity={heal} />
</svg>
</div>
{/* 字母行(图标右侧):从左到右 stagger,opacity 0→1 + translateX 8px→0 */}
<div
style={{
position: 'absolute',
left: 'calc(50% - 40px)',
top: '50%',
height: ICON,
marginTop: -ICON / 2,
display: 'flex',
alignItems: 'center',
gap: 2,
}}
>
{[...WORDMARK].map((ch, i) => {
const lk = seg(t, 0.46 + i * 0.035, 0.46 + i * 0.035 + 0.10, E.outCubic);
return (
<span
key={i}
style={{
color: '#f2f5fa',
font: "800 27px/1 -apple-system,'Helvetica Neue',sans-serif",
letterSpacing: 2,
opacity: lk,
transform: `translateX(${lerp(lk, 8, 0)}px)`,
}}
>
{ch}
</span>
);
})}
</div>
{/* 强调色标语(占位文案):延迟整行淡入 */}
<div
style={{
position: 'absolute',
left: 0,
right: 0,
top: 'calc(50% + 34px)',
textAlign: 'center',
color: ACCENT,
font: '600 13px/1 -apple-system,sans-serif',
letterSpacing: 5,
opacity: seg(t, 0.72, 0.84, E.outQuad),
}}
>
BUILD. SHIP. REPEAT.
</div>
</div>
</DesignStage>
);
};
- 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/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.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

UI biến hình thành logo thương hiệu
Hai kiểu UI biến thành logo — icon-flip-bloom icon lật phẳng trục Y nở thành hình hoa mark + wordmark vào từng chữ, và input-morph-assemble ô nhập liệu co lại thành viên nang, ba hạt hình học tụ thành một cánh logo.

Kết phim kiểu phép trừ
Kết phim kiểu phép trừ — bấm Publish xong, toàn bộ UI trình soạn bốc hơi từng lớp lệch nhịp từ ngoài vào trong, chỉ còn lại nút vừa bấm trượt vào tâm màn hình phóng to, rồi mờ đi trao lại cho chữ hiệu định vị.

Outro ảnh nhóm ra mắt
Mọi yếu tố trong phim bay vào từ mọi hướng vây quanh wordmark chụp ảnh nhóm, dàn dựng như cảnh chốt của một sự kiện ra mắt.

Ba hàng đèn neon chạy chữ
Ba hàng đèn neon chạy chữ ngược chiều (BETTER/FASTER/STRONGER) cuộn vô tận, lần lượt sáng theo pha rồi mờ dần.