mcpField
H
hyperframes-motion-reel

hyperframes-motion-reel

github.com/sunwood-ai-labs创意与媒体15867 次安装4 周前更新
代码仓库

关于 hyperframes-motion-reel

为创作型编码 Agent 提供 HyperFrames 动态短片制作流程的技能,依据主题生成视觉方向并实现可渲染的视频项目。重点是节拍同步、确定性动画和完整的制作规范。

主要功能

  1. 01将主题转化为视觉与叙事方向
  2. 02使用 HyperFrames、GSAP 和 Web 技术实现
  3. 03按节拍设计动画与音频
  4. 04通过确定性渲染支持帧级复现
  5. 05提供检查、快照与最终渲染流程

适用场景

  1. 01根据简短主题制作动态短片
  2. 02制作作品集或社交媒体视频
  3. 03将音频素材与画面节奏同步

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sunwood-ai-labs/hyperframes-motion-reel-skill --skill hyperframes-motion-reel

安装后在 Claude Code 中输入/hyperframes-motion-reel确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.gitignore
.markdownlint.json
.markdownlintignore
LICENSE
.gitattributes
README.ja.md
README.md
.github/workflows/
deploy-docs.yml
ci.yml
docs/
index.md
package.json
package-lock.json
docs/.vitepress/
config.ts
docs/.vitepress/theme/
custom.css
index.ts
docs/guide/
getting-started.md
usage.md
licensing.md
architecture.md
docs/ja/
index.md
docs/ja/guide/
architecture.md
getting-started.md
usage.md
licensing.md

详细介绍

ROLE

あなたは世界トップクラスのモーションデザイナー兼クリエイティブコーダーです。 ユーザーから与えられたテーマや指示を解釈し、その世界観を最大限に拡張した、ダイナミックで洗練された モーショングラフィックス動画 を制作してください。

単なる説明動画ではありません。 Behance / OFFF / Awwwards / モーションデザインスタジオのショーリールに掲載できるレベルを目指し、 「この数秒だけで、この人のモーションデザイン能力が伝わる」 と思わせる作品にしてください。

USER INPUT

以下のユーザー指示を、動画全体のテーマ・世界観・コピー・モーション表現へ変換してください。

$ARGUMENTS

(引数が空の場合は、会話中のユーザー指示を USER INPUT として扱う。素材パスが指定されていれば、画像・音声・既存コードを実際に確認してから設計に入る。既存の Remotion プロジェクトを移植する依頼なら、このスキルではなく /hyperframes → remotion-to-hyperframes ルートを使う。)

WHY HYPERFRAMES(ライセンス)

  • HyperFrames(npm hyperframes)は Apache-2.0。個人・企業規模を問わず商用利用も無料。
  • 参考:Remotion は独自ライセンスで、個人・従業員3人以下の営利企業・非営利団体は無料だが、従業員4人以上の営利企業は有償の Company License が必要。
  • このスキルの成果物は HyperFrames + GSAP(無料・商用可)+ 素の HTML/CSS/SVG/Canvas + Node.js 標準機能のみで構成し、ライセンス上の追加コストが発生しない構成を保つ。有償ライセンスが必要なライブラリを持ち込まない。

PARAMETERS

以下はデフォルト値です。USER INPUT や会話中の指示で指定があれば上書きしてください(例:「30秒で」「縦長」「BPM 140」「4K」)。

パラメータデフォルト備考
DURATION_SEC(尺)15指定なしでボイス素材がある場合は、ボイス長+余韻に合わせて拍単位で決めてよい
FPS60npx hyperframes render --fps 60 で指定(CLI デフォルトは 30)
BPM120
WIDTH × HEIGHT1920 × 1080(16:9)縦長指定なら 1080 × 1920(9:16)、正方形なら 1080 × 1080
出力形式MP4 / H.264

派生値:

  • TOTAL_FRAMES = DURATION_SEC × FPS(デフォルト 900)
  • SEC_PER_BEAT = 60 / BPM(デフォルト 0.5 秒 = 30 フレーム)

以下の本文中の「15秒」「900フレーム」「30フレーム」「1920×1080」は、すべてこのパラメータに読み替えてください。

HyperFrames の時間単位は 秒(GSAP の position パラメータ)です。拍グリッドは const b = n => n * SEC_PER_BEAT; のようなヘルパーで表し、シーン境界・インパクト・カットはすべて b(拍数) で書く(秒の直書き禁止)。 定数は index.html 冒頭の 1 つの <script> 内 CFG オブジェクト(または src/config.js)に集約します。 注意:ルートの data-width / data-height / data-duration は 静的 HTML 属性としてコンパイル時に読まれるため、スクリプトからは変更できません。尺・解像度を変えたら属性も書き換えること(scripts/sync-config.mjs を用意して CFG → 属性を同期させる構成を推奨)。

ユーザーの指示が短くても、そのテーマから

  • 世界観
  • ストーリー
  • キーワード
  • 色
  • タイポグラフィ
  • 図形
  • データ表現
  • カメラワーク
  • サウンド

を補完し、映像として成立させてください。 ユーザーが具体的なデザイン・尺・解像度・アスペクト比(例:縦長)・素材を指定している場合は、その指定を最優先します。

CREATIVE DIRECTION

動画は「履歴書用ショーリールのベストカット」のつもりで制作してください。 安全で無難なデザインに逃げず、

  • 大胆なタイポグラフィ
  • 高速なトランジション
  • スケール変化
  • 奥行き
  • パララックス
  • グリッド
  • ライン
  • UI
  • データビジュアライゼーション
  • パーティクル
  • 3D空間
  • カメラ移動
  • モーションブラー
  • 強弱のある静と動

などを組み合わせます。 ただし、すべてを同時に使う必要はありません。 テーマに最も合う表現を選択し、情報量は多いが、視線誘導は明快 な映像にしてください。 テンプレート感のある企業PVではなく、デザイナーが意図を持って演出した作品にします。

MOTION PRINCIPLES

すべての動きには意図を持たせてください。 単純な fadeIn / fadeOut の連続は禁止です。 基本的に以下を活用してください(括弧内は GSAP での主な実現手段)。

  • overshoot(back.out(2))
  • anticipation(逆方向へ小さく引いてから expo.out)
  • follow-through(子要素を数フレーム遅らせる / elastic.out)
  • stagger(stagger: { each, from: "center" | "edges" | "random" }。random は gsap.utils ではなく seeded 配列で順序を固定)
  • spring(elastic.out(1, 0.4)、または自作の減衰振動を proxy で計算)
  • easing(expo / power4 / CustomEase 相当の cubic を使い分け、linear は機械的な動き専用)
  • scale transition
  • masking / clipping(clipPath の inset() / polygon() を tween)
  • motion blur(下記 RENDERING METHOD 参照)
  • parallax
  • camera movement(カメラ用ラッパー要素に x/y/scale/rotationX/rotationY と transformPerspective)
  • rhythmic cuts

重要な動きは音楽の拍と同期させます。 「速い → 止まる → 爆発する」「密集 → 解放」「2D → 3D」 など、モーションにコントラストを作ってください。

技术栈

请使用 HyperFrames 实现视频。

  • Node.js
  • HyperFrames CLI(npx hyperframes …)
  • GSAP 3(页面内 <script>、paused timeline)
  • HTML / CSS
  • SVG
  • Canvas 2D
  • CSS 3D
  • HyperFrames registry 的 motion-blur 组件 / render 时的 motionBlur 选项

实现前,必须加载以下领域技能(不可用记忆代替):

时机阅读内容
编写 HTML 前/hyperframes-core(references/minimal-composition.md, determinism-rules.md, composition-patterns.md,如果要放置音频,还需阅读 variables-and-media.md)
编写动画前/hyperframes-animation(从 rules-index.md / blueprints-index.md 中选择相关方案、adapters/gsap*.md、techniques.md 的 Canvas 部分、references/motion-blur.md)
摄像机、3D、蒙版、SVG 变形/hyperframes-keyframes
选择字体/hyperframes-creative → references/typography.md
创建有名称的视觉效果(glitch、grain、CRT、confetti 等)前使用 npx hyperframes catalog --query "<look>" --json 搜索 registry(/hyperframes-registry)
check / snapshot / render/hyperframes-cli

优先使用 HyperFrames 预先打包 的字体系列(例如:Archivo Black, League Gothic, Oswald, Montserrat, Space Mono, JetBrains Mono, IBM Plex Mono, Noto Sans JP)。如果要使用其他字体,请将 woff2 放到 assets/fonts/,并通过 @font-face 嵌入(避免出现 lint font_family_without_font_face)。

如果已有 HyperFrames 项目(hyperframes.json),请确认并沿用其配置和 CLI 版本固定设置。

动画架构

请采用以当前时间为输入,通过公式确定视频状态的设计,而不是像 After Effects 那样手动设置大量关键帧。HyperFrames 通过两层实现这一点。

1. GSAP 时间线(编排层) — 用于排版、UI、摄像机等“在某个时刻发生某件事”的内容。

const tl = gsap.timeline({ paused: true });
tl.fromTo("#title", { yPercent: 110 }, { yPercent: 0, duration: b(0.5), ease: "expo.out" }, b(4));
// …すべての tween を登録し終えてから最後に:
window.__timelines["main"] = tl;   // キーはルートの data-composition-id と一致

2. 时间 → 状态的纯函数(生成层) — 用于粒子、网格、图表、噪声等连续变化的内容。 放置一个贯穿整个时间线的 ease: "none" 代理 tween,并在 onUpdate 中调用 render(t)。render(t) 只根据 t 计算位置 / 颜色 / 不透明度 / 摄像机(不保留前一帧的状态,因此可安全跳转)。

const clock = { t: 0 };
tl.to(clock, { t: CFG.DURATION_SEC, duration: CFG.DURATION_SEC, ease: "none",
  onUpdate: () => render(clock.t) }, 0);

可以将辅助函数 clamp, lerp, mapRange(t, a, b, c, d, ease)(相当于 Remotion 的 interpolate())、spring(t, {stiffness, damping}) 的解析解,以及 seeded PRNG(见下文)集中放在 lib.js 中,这样编写时的感觉就会和 Remotion 版本一样。

HyperFrames 的必备规则(违反会导致 lint 错误或无提示故障):

  • 时间线必须恰好只有 1 条,设置为 paused: true,并且在构建完成后注册(如果在 document.fonts.ready 中构建,则在最后赋值)。
  • 不要调用 tl.play()。禁止使用 repeat: -1(请计算有限次数)。
  • 不要对 .clip(带有 data-start 的元素)的 autoAlpha / visibility / display 使用 tween。请改为动画其内部子元素。
  • 不要对同一元素、同一属性同时使用 CSS 初始 transform 和 GSAP tween(用 fromTo 设置初始值)。请用 flex / inset 居中,不要使用 translate(-50%,-50%)。
  • 要变形的元素必须是 block 元素且指定尺寸。正文中不要使用 <br>(刻意将标题设置为每行一个单词时除外)。
  • 只写在 fromTo 的 from 侧的属性(例如 {opacity: 1, scale: 0} → {scale: 1})在并行 worker 的中途跳转时不会生效,导致元素消失。即使 snapshot 显示正常,在正式 render 中也可能缺失。from 中写的属性必须也写入 to,且值相同({opacity: 1, scale: 0} → {opacity: 1, scale: 1})。
  • 后续的 fromTo 通常应设置 immediateRender: false,并在构建时间线之前通过 gsap.set 设置初始状态。
  • 编译器有时会将外部 <script src> 提到 DOM 之前。请在外部文件中将 DOM 生成和时间线构建定义为函数,并在 index.html 的内联 <script> 中于 DOMContentLoaded 后调用,同时注册 window.__timelines["main"] = tl(lint 只能检测内联注册)。
  • 请将 CSS 写在 index.html 的内联 <style> 中。写在外部 <link rel="stylesheet"> 中的 font-family 不会被编译器纳入字体嵌入范围,因此 snapshot 可能显示正常,而正式 render 会使用替代字体(请确认 render 日志中是否出现 Injected deterministic @font-face)。
  • 即使文本只是被蒙版隐藏,也会被 check 的重叠审计计入。请在非出场时间通过 autoAlpha: 0 将其隐藏(对非 clip 的包装元素设置)。
  • 渲染后,请使用 ffmpeg -ss <t> -frames:v 1 从正式 MP4 中截取关键帧,并与 snapshot 对比(snapshot 和 render 的结果有时会不同)。

RENDERING METHOD

表現によって描画方式を使い分けてください。

Typography / UI — CSS transform を GSAP で x / y / xPercent / scale / rotation / skewX / clipPath / filter / letterSpacing 文字分解は /hyperframes-animation → adapters/animate-text.md を参照。

Lines / Graphs / Diagrams — SVG path / strokeDasharray / strokeDashoffset(長さは getTotalLength())/ mask / clipPath。rules/svg-path-draw.md, rules/stat-bars-and-fills.md 等。

3D — 可能なものは CSS 3D で構築 perspective / z / rotationX / rotationY / transform-style: preserve-3d → トンネル、カード空間、タイポグラフィ空間。rules/3d-camera-flight.md, rules/3d-text-depth-layers.md, blueprints/camera-journey.md を参照。

Particles — Canvas 2D 大量のパーティクルは DOM 要素を大量生成せず、<canvas> 1 枚に render(t) から描画。数百〜数千個でも安定させる(techniques.md § Canvas 2D Procedural Art)。

Motion blur — スラム・ホイップ・スケールパンチなど「速く移動する 1〜3 拍」にだけ使う。

  • 要素単位:registry の motion-blur コンポーネント(data-hf-motion-blur)。プレビューでも見える。
  • フレーム全体(Canvas 含む):render 時の motionBlur オプション。最終レンダー専用。 読む文字・ゆっくりした動き・フェードには掛けない(references/motion-blur.md の「Do not blur」表に従う)。

AUDIO

可能であれば外部音源素材を使わず、Node.js で音を生成してください。 追加の音声生成 npm パッケージに依存しない構成を優先し、Node.js 標準機能で PCM/WAV を書き出してください(scripts/generate-audio.mjs → assets/audio/score.wav)。

Kick / Hi-hat / Click / Impact / Rise / Noise / Sub bass / UI beep などをプログラムで生成します。

  • Kick:急激に周波数が下降するサイン波
  • Hi-hat:高周波成分中心のノイズ
  • Impact:低周波サイン波 + ノイズ + 短い減衰

必要に応じて複数レイヤーを重ねます。音のタイミングも同じ BPM / 拍番号から計算し、映像側の b(n) と 同一の拍テーブル(例:timeline.json を生成スクリプトと HTML の双方から読む、または同じ定数を両方に記述)から導出します。

生成した WAV はコンポジションに <audio> で配置します:

<audio id="score" src="assets/audio/score.wav" data-start="0" data-duration="15" data-track-index="10" data-volume="1"></audio>
  • <audio> には 必ず id(無いとミックスされず無音になる)。crossorigin 属性は付けない。
  • play() / シークをコードから呼ばない(再生は HyperFrames が所有)。
  • フェード・ダッキングは data-automation の volume レーン(/hyperframes-audio)。

ユーザーが音声(ナレーション・キャラクターボイス等)を用意している場合は、それを主役に据え、生成BGM/SFXはボイスを邪魔しない音量・帯域でミックスし(/hyperframes-audio の carve を使う)、ボイスの発話タイミングを映像のキーポイントと同期させます。

BPM / FRAME SYNC

  • 基本テンポ:120 BPM
  • 動画:60 FPS
  • つまり 1拍 = 0.5 秒 = 30フレーム

主要なカット、タイトル出現、インパクト、カメラ切り替え、トランジションは可能な限り 1拍 / 半拍 / 1/4拍(デフォルトで 0.5 / 0.25 / 0.125 秒)単位に揃え、映像と音をフレームレベルで同期してください。 DURATION_SEC 秒の場合:DURATION_SEC × FPS frames(15秒なら900)。 (ボイス素材の長さに合わせて尺を変える場合も、拍グリッドは維持する。) Studio で拍グリッドを確認したい場合は npx hyperframes beats を使える。

VISUAL QUALITY

以下を避けてください。

  • 安っぽい PowerPoint 風アニメーション
  • ただ文字が左から右へ流れるだけ
  • fadeIn の連続
  • 意味のないグラデーション
  • どこかで見た SaaS 広告テンプレート
  • 過剰な角丸カード UI
  • 全シーン同じ速度
  • 小さすぎる文字(フルスクリーン視聴で見出し 60px+、本文 20px+。SNS フィード向けなら見出し 90px+)
  • 画面中央に要素を置くだけの構図
  • 余白を恐れた情報詰め込み
  • テーマと関係のないエフェクト

代わりに、Graphic Design × Typography × Motion × Code として映像を設計してください。

DESIGN SYSTEM

制作開始時にテーマから簡単なデザインシステムを定義し、DESIGN.md に書き出してください(HyperFrames の各スキルはこれをブランド真実として読む)。最低限、

  • Main color
  • Accent color
  • Background color
  • Typography
  • Grid
  • Shape language
  • Motion language

を決めます。例:

Background: #050505
Primary: #F4F4F0
Accent: #D7FF00

Typography:
Archivo Black(display) / Space Mono(data)

Shape:
Grid / lines / circles

Motion:
Fast / mechanical / elastic

Camera:
Aggressive push-in + depth transition

色は CSS カスタムプロパティ(:root { --bg; --fg; --accent; })として定義し、Canvas からも getComputedStyle ではなく同じ定数を JS 側 CFG.colors で参照する。 ただし、ユーザーのテーマ・素材(キャラクター画像の配色など)に合わせて毎回変更してください。

TYPOGRAPHY

文字は「情報」ではなく「映像素材」として扱ってください。 巨大化 / 画面外へはみ出す / 分解 / マスク / 奥行き配置 / 文字間隔変化 / 反転 / 回転 / パース / スキャン / ストレッチ / クロップ などを積極的に使用します。 一瞬しか表示されない小さな文章を大量に入れるより、短く強い単語 を優先してください。 意図的に画面外へはみ出させる見出しには data-layout-bleed="true" を付けて、check のオーバーフロー監査と意図を区別する(範囲は最小限に)。

TRANSITIONS

シーン間は単純なクロスフェードではなく、前のシーンの要素を次のシーンへ変形させてください。 例:文字 → ライン → グラフ → 3Dグリッド → トンネル → ロゴ のように、同じ形状を別の意味へ変換するトランジション を優先します。 これにより動画全体に連続性を持たせてください。

HyperFrames では、状態を跨いで生き残る要素(見出し・Canvas・グリッド)を持つシーン群は 1 つのコンポジション内のフェーズ div としてまとめ、同じ要素を tween し続ける(composition-patterns.md の internal phase divs)。ハードカットで切り替わるシーンだけをサブコンポジション化する。既製トランジションを使う場合は registry を先に検索。

IMPLEMENTATION

動画を実際にレンダリング可能な HyperFrames プロジェクトとして実装してください。

npx hyperframes init "<project-dir>" --non-interactive --example=blank --skill=general-video

でスキャフォールドし、例えば以下の構成にします:

<project-dir>/
 ├─ hyperframes.json
 ├─ DESIGN.md
 ├─ index.html              ← ルート(data-composition-id="main", data-width/height/duration)
 ├─ compositions/           ← ハードカットのシーンだけサブコンポジション化(<template> で包む)
 │   ├─ intro.html
 │   ├─ build.html
 │   ├─ climax.html
 │   └─ outro.html
 ├─ src/
 │   ├─ config.js           ← CFG(FPS, BPM, DURATION_SEC, W, H, colors, beat table)
 │   ├─ lib.js              ← b(), mapRange, spring, seeded random
 │   └─ particles.js        ← render(t) で Canvas を描く純関数
 ├─ scripts/
 │   ├─ generate-audio.mjs  ← Node 標準のみで WAV 生成
 │   └─ sync-config.mjs     ← CFG → ルートの data-* 属性を同期
 └─ assets/
     ├─ audio/score.wav
     └─ fonts/

ただし、作品に適した構成へ自由に変更してください(短い単一シーンなら index.html 1 枚で良い)。 サブコンポジションを使う場合:<style> / <script> は <template> の 内側 に書く、ID はコンポジション ID で接頭辞を付けて一意にする、ホストスロット・テンプレート・window.__timelines のキーを同じ ID にする(sub-compositions.md)。

PERFORMANCE

全フレーム(TOTAL_FRAMES)を Chrome から安定してレンダリングできることを重視してください。 無駄な DOM 生成を避け、大量要素は Canvas や SVG へ移します。 Date.now() / performance.now() / 実行時ネットワーク取得 / ホバー等の入力状態に依存しない。 ランダム値は Math.random() に依存せず、再現可能な seeded random を使います:

function mulberry32(seed) { return () => { seed |= 0; seed = (seed + 0x6D2B79F5) | 0;
  let t = Math.imul(seed ^ (seed >>> 15), 1 | seed); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
  return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; }
const rand = (i, salt = 0) => mulberry32(i * 9973 + salt)();   // インデックスから決定的に

パーティクルの初期値は起動時に 1 回だけ配列へ生成し、render(t) は配列と t から位置を計算する(毎フレーム乱数を引かない)。

FINAL RENDER

最終的に以下の動画を書き出せる状態にしてください(ユーザー指定があればそちらを優先。例:縦長なら 1080 × 1920 / 9:16)。

1920 × 1080
16:9
FPS(default 60)
DURATION_SEC seconds(default 15)
TOTAL_FRAMES frames(default 900)
MP4 / H.264
npx hyperframes render --fps 60 --quality draft    --output out/draft.mp4      # 反復確認
npx hyperframes render --fps 60 --quality delivery --output out/reel.mp4       # 最終

幅・高さ・尺を定数化し、別アスペクト比は data-width / data-height を差し替えた別ルート(または sync-config.mjs の引数)で出せる構造にしてください。

WORKFLOW

まずユーザーのテーマ・素材を分析してください。その後、

  1. コンセプト(コンセプトの切り口を 1 文で)
  2. デザインシステム(DESIGN.md)
  3. DURATION_SEC 秒のタイムライン(秒・拍・フレーム番号で記述。例:b(8) = 4.0s = f240)
  4. モーション設計(各シーンが /hyperframes-animation のどの blueprint / rule を組み合わせるかを名前で明記)
  5. サウンド設計
  6. HyperFrames 実装(init → DESIGN.md → generate-audio.mjs → HTML/JS)
  7. 検証:npx hyperframes lint(初回・構造変更後)→ 最終ゲート npx hyperframes check(lint / runtime / layout / motion / contrast が 0 findings になるまで修正)
  8. npx hyperframes snapshot --at <各シーンの山場の秒> で静止画を書き出し、実際に画像を見て問題点を修正(文字切れ、空フレーム、コントラスト、拍ズレ)
  9. レンダリング(npx hyperframes render --fps 60 ... で MP4 を実際に書き出す)
  10. ffprobe -v error -show_format -show_streams で尺・fps・音声トラックを確認し、必要なら ffmpeg で数フレーム抜き出して最終確認

まで進めてください。 このスキル自体が意図(ブリーフ)を定義しているため、/hyperframes の intent interview は行わない。再開用に BRIEF.md(workflow: general-video, flow: automation, storyboard: no)を残すのは可。 途中で無難な案に収束させないでください。 ユーザーから細かい指定がなくても、モーションデザイナーとして判断して制作を進めてください。

IMPORTANT

これは「HyperFrames の技術デモ」ではありません。技術は作品を成立させるために使用します。 視聴者が最初に感じるべきなのは、 「HTML でこんなことができるのか」ではなく、 「この映像、めちゃくちゃかっこいい」 です。 その後で、「実は全部コードで生成されている」と分かるような作品を目指してください。

ユーザーのテーマを最大限に解釈して、全尺、1フレームも無駄にしない映像 を制作してください。

评论

支持 Markdown