Motion · Ánh sáng & nhấn
Nền cực quang lật màu
Nền xám nhạt dâng lên một khối blur tím-cam mờ ảo từ phía dưới, rồi toàn bộ nền tối sầm xuống gần đen trong ~0.36s, blob nén thành ánh dư; chữ blur-out rồi blur-in đổi câu, có khoảng lặng ở giữa.
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
Điểm bước ngoặt trong tường thuật ("nhiều năm qua… → mọi thứ đã đổi khác"); nhịp chuyển từ dẫn dắt sang nhấn mạnh trong phim thương hiệu; chuyển đoạn giữa tông sáng và tông tối.
Ý đồ
Dùng "đảo nền" như một dấu nhấn câu: để cực quang dâng lên chậm rãi trong 62% đầu cho người xem quen với nền sáng, rồi nén cả khung hình về gần đen trong chưa đầy 0.4s — cú này giống "lật trang" hơn bất kỳ hiệu ứng zoom hay lóe trắng nào. Câu chữ phải đổi ngay sau cú đảo nền, có khoảng trống ở giữa, để người xem tiếp nhận thay đổi hình ảnh trước rồi mới đọc câu mới.
Thời lượng & năng lượng
- Thời lượng: Khoảng 5.2s (156f@30fps).
- Năng lượng: Từ thấp lên cao (2/3 đầu là ủ nhịp, khoảnh khắc tối sầm là điểm nhấn của cả đoạ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)
意图
把"底色反转"当成重音符号用:前 62% 让极光慢慢升起、观众适应浅底, 然后用不到 0.4s 把整个画面压到近黑——这一下比任何缩放/闪白都更像 "翻页"。文案的换句必须卡在反转之后,且中间留空档,让观众先接住画面 变化再读新句。
动效核心
- 三层
blur(60px)blob 从画框底部升起:主紫rgba(107,79,224,.85)
90%×85%、橙核 rgba(217,122,74,.9)、白色融边 rgba(255,255,255,.8)
- 升起
seg(0.04→0.62, outCubic):translateY 32%→−6%+scale 1→1.25 - 反转
flip = seg(0.63→0.70, inOutQuad)(归一化 0.07 ≈ 0.36s):
底色 mix([236,236,236] → [10,10,18]),blob opacity 1→0.4 压成余晖, 白色融边层 1−flip 直接收掉
- 橙核独立
translateX ±8%(2.2 周期/全片)横向慢漂,让 blob 内部
有相对运动而不是整块升降
- A 句逐词
blur 0→8px+ 淡出(stagger 0.04、各 0.10、inQuad);
B 句逐词 outQuint blur-in(stagger 0.06、各 0.11),落位后 0.16 内 由 DEEPP 紫收色到白
参数表
| 参数 | 典型值 | 调节手感 | |------|--------|----------| | blob 模糊/尺寸 | blur(60px),主层 90%×85%,容器 inset −10% | 模糊小于 40px 就看得出是圆,成了"色球"不是"光" | | 升起 | translateY 32%→−6% + scale 1→1.25,t 0.04→0.62 outCubic | 占掉 60% 时长是故意的:酝酿越长,反转越有分量 | | 反转时长 | t 0.63→0.70 inOutQuad ≈ 0.36s | 命门:拉到 1s 就不是重音而是渐变过场 | | 底色 | #ececec → #0a0a12(不是纯黑) | 纯黑会让余晖 blob 边缘出现色阶断层 | | blob 压暗 | opacity 1→0.4,白色融边层同步归零 | 不压暗 blob,暗场里紫橙会过曝糊成一团 | | 橙核漂移 | translateX ±8%,2.2 周期/全片 | 幅度到 15% 就看得出是"一个球在动" | | A 句 blur-out | 逐词 stagger 0.04、各 0.10、inQuad、blur→8px | inQuad 让消失是加速的,读作"被光吞掉" | | B 句 blur-in | 逐词 stagger 0.06、各 0.11 outQuint + 0.16 内紫→白 | 收色比入场晚一点,落定瞬间才转白,是"定稿"的信号 | | 换句空档 | A 收完 t≈0.64 → B 起 0.76(≈0.6s 无字) | cross-fade 会把两句糊在一起,空档才读出"翻篇" |
已知坑
- 白色融边层(blobC)只在浅底成立,反转时必须
1−flip收掉,
否则暗场里留一团灰雾
- DEEPP/PURPLE 是这个效果的本体光色,不是品牌色槽位;要换成项目色
必须 blob 三层 + B 句文字色整组一起换,只换文字色会和背景脱节
- 文案是中性占位("For many years" / "everything changed"),逐词
stagger 的节奏依赖词数与字长,换句要回调 0.04/0.06 两个间隔
- 底色用 JS 逐帧写
background(mix()出实色),不要用 CSS transition,
否则 seek 到任意帧时颜色不确定
参考实现
demos/effects/aurora-bloom-bg-flip/ (AuroraBloomBgFlip.tsx)
Mã nguồn tham chiếu (Remotion)
- demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.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/aurora-bloom-bg-flip.jsongit clone https://github.com/Vincentwei1021/video-shotcraft
# component: demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx
npx remotion render <CompositionId> out.mp4claude mcp add --transport http gimgs https://gimgs.net/mcp
# then: search_motion_templates / get_motion_template("aurora-bloom-bg-flip")Prompt
Use the video-shotcraft shot recipe "Nền cực quang lật màu" (Remotion composition, Apache-2.0) published on gimgs.net. Recipe JSON (prompt = timing/easing/parameter table/pitfalls, files = TSX source): https://gimgs.net/motion/aurora-bloom-bg-flip.json Raw TSX: https://gimgs.net/motion/aurora-bloom-bg-flip/template.html Repository: https://github.com/Vincentwei1021/video-shotcraft (component: demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx; imports demos/_fixtures and assets/lib) Spec: 1920x1080, 30 fps, 5.7s 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/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx =====
// aurora-bloom-bg-flip — Aurora Bloom 极光升腾底色反转(motion-lab 定稿转原生 Remotion)
// 浅灰底从底部升起紫橙柔焦 blob,随后整个底色 0.35s 内压暗到近黑、blob 压成余晖;
// 文案同步 blur-out → 换句 blur-in(强调色→白收色),换句间留空档不 cross-fade。
// 文案为中性占位;blob/文字的紫橙是这个效果本体的光色(DEEPP 常量),落地时可整组换成项目色。
// 设计坐标 480×270(DesignStage 等比放大),参数表数值以此坐标系标定。
import React from 'react';
import { DesignStage, E, lerp, seg, useT } from '../../_fixtures/Motion';
export const AURORA_BLOOM_BG_FLIP_DURATION = 156; // 5200ms @30fps
// RGB 三元组插值 → CSS 颜色(effect.js 文件级共享 mix,此处内联)
const mix = (a: number[], b: number[], k: number) =>
`rgb(${Math.round(a[0] + (b[0] - a[0]) * k)},${Math.round(a[1] + (b[1] - a[1]) * k)},${Math.round(a[2] + (b[2] - a[2]) * k)})`;
const DEEPP = [124, 92, 255]; // 效果本体光色(深紫)
const WHITE = [245, 245, 250];
const LIGHT = [236, 236, 236]; // 亮场底色
const DARK = [10, 10, 18]; // 暗场底色
// 占位文案(词数/字长贴近原片,逐词错相节奏依赖这个)
const WA = 'For many years'.split(' ');
const WB = 'everything changed'.split(' ');
const FONT = '600 26px -apple-system,system-ui,sans-serif';
export const AuroraBloomBgFlip: React.FC = () => {
const t = useT();
// blob 升起 + 放大
const rise = seg(t, 0.04, 0.62, E.outCubic);
const flip = seg(t, 0.63, 0.7, E.inOutQuad); // 快速压暗,故意只 ~0.35s
return (
<DesignStage bg={mix(LIGHT, DARK, flip)}>
{/* 柔焦 blob 组:整体 translateY 升起 + scale 放大,flip 后压成余晖 */}
<div
style={{
position: 'absolute',
inset: '-10%',
transform: `translateY(${lerp(rise, 32, -6)}%) scale(${lerp(rise, 1, 1.25)})`,
opacity: lerp(flip, 1, 0.4),
}}
>
{/* 紫色主 blob */}
<div
style={{
position: 'absolute',
borderRadius: '50%',
filter: 'blur(60px)',
left: '8%',
bottom: '-45%',
width: '90%',
height: '85%',
background: 'radial-gradient(circle,rgba(107,79,224,.85) 0%,rgba(107,79,224,0) 68%)',
}}
/>
{/* 橙色核心:横向慢漂 */}
<div
style={{
position: 'absolute',
borderRadius: '50%',
filter: 'blur(60px)',
left: '32%',
bottom: '-32%',
width: '44%',
height: '46%',
background: 'radial-gradient(circle,rgba(217,122,74,.9) 0%,rgba(217,122,74,0) 66%)',
transform: `translateX(${Math.sin(t * Math.PI * 2.2) * 8}%)`,
}}
/>
{/* 白色融边:暗场里收掉 */}
<div
style={{
position: 'absolute',
borderRadius: '50%',
filter: 'blur(60px)',
left: '-12%',
bottom: '-40%',
width: '64%',
height: '60%',
background: 'radial-gradient(circle,rgba(255,255,255,.8) 0%,rgba(255,255,255,0) 62%)',
opacity: 1 - flip,
}}
/>
</div>
{/* 文案行:flex 居中,两句各自绝对定位(同点居中,互不占位) */}
<div
style={{
position: 'absolute',
inset: 0,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
font: FONT,
}}
>
{/* 文案 A:blob 上升期逐词 blur-out */}
<div style={{ position: 'absolute' }}>
{WA.map((w, i) => {
const out = seg(t, 0.46 + i * 0.04, 0.56 + i * 0.04, E.inQuad);
return (
<span
key={i}
style={{
display: 'inline-block',
margin: '0 .18em',
color: '#1a1a1a',
opacity: 1 - out,
filter: `blur(${out * 8}px)`,
}}
>
{w}
</span>
);
})}
</div>
{/* 空档后文案 B:逐词 blur-in + 紫→白收色 */}
<div style={{ position: 'absolute' }}>
{WB.map((w, i) => {
const d0 = 0.76 + i * 0.06;
const a = seg(t, d0, d0 + 0.11, E.outQuint);
const c = seg(t, d0 + 0.1, d0 + 0.26, E.outQuad);
return (
<span
key={i}
style={{
display: 'inline-block',
margin: '0 .18em',
opacity: a,
filter: `blur(${(1 - a) * 8}px)`,
color: mix(DEEPP, WHITE, c),
}}
>
{w}
</span>
);
})}
</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/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.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.