# Emotional camera moves

Four emotional camera moves — bullet-time freeze-orbit, dutch-roll to level, slow-push-in, and pull-back isolation; the camera makes the viewer "feel" rather than "see."

- Category: camera · Tags: shotcraft, remotion, camera
- Spec: 1920×1080 @ 30 fps · 5.06s (16:9)
- License: Apache-2.0 · Tier: free
- JSON: https://gimgs.net/motion/tension-camera-moves.json
- Kind: remotion
- Source (TSX): https://gimgs.net/motion/tension-camera-moves/template.html
- Repo: https://github.com/Vincentwei1021/video-shotcraft
- Credits: video-shotcraft (Vincent Wei) — https://github.com/Vincentwei1021/video-shotcraft
- Page: https://gimgs.net/motion/tension-camera-moves.html

## Params

_No params._

Default params (base64url for `?p=`): `e30`

## Prompt

## When to use

Camera language for emotional beats (awe/correction/pressure build/closure); complements space-camera-moves' "flashy big moves" — these four are small in motion, heavy in emotion

## Intention

space-camera-moves' three styles are highlight flair — "shooting the page as a 3D solid." These four are the opposite — the motion itself stays restrained, and all the force goes into emotional meaning: A says "this moment deserves to have time stopped for it" (an element mid-motion freezes, the camera orbits and inspects); B says "the problem is solved, the world has been righted" (a tilted, uneasy angle rolls back level on the beat); C says "something is about to happen" (an imperceptibly slow push-in builds tension, releasing with a hard cut at the peak); D says "in the end only this one thing remains" (pulling back as everything around dims layer by layer, one point left isolated to close the film). Each of the four occupies its own emotional slot — direct vocabulary for "what should the viewer feel here" at the storyboard stage.

## Duration & energy

- Duration: Single style 4–5s; at most 2 styles per film (each used ≤1 time)
- Energy: A high / B medium / C low-building / D low-closing

## Shot recipe (original Chinese — timing, easing, parameter table, known pitfalls)

## 意图
space-camera-moves 三式是"把页面当 3D 实体拍"的高光炫技；这四式相反——
动作本身克制，全部劲道在情绪语义上：A 说"这一刻值得停下时间看"
（运动中的元素被冻住、相机绕行审视）；B 说"问题解决了，世界被扶正"
（斜角悬着的难受感在节拍上滚回水平）；C 说"有什么要发生了"（慢到
不自觉的推近积压张力，顶点硬切释放）；D 说"最后只剩这一件事"
（后拉中周围逐层熄灭，孤悬一点收束全片）。四式各占一个情绪格，
是分镜阶段"这一段观众该感到什么"的直接词汇。

## 四式选型
| 式 | 做法 | 适用 |
|----|------|------|
| A bullet-time-freeze-orbit 冻结环绕 | 图表生长到一半全冻住，相机绕悬停的 UI 平面 rotateY 扫 55° 再回，时间恢复接着长完 | 核心数据/图表的加冕时刻；"值得停表看"的一格 |
| B dutch-roll-to-level 斜角滚正 | 痛点段整帧 -10° 斜角悬着（叠微漂移），解决方案一拍带单次过冲滚回水平 | 痛点→方案的翻转节拍；纠偏语义 |
| C slow-push-in 慢推压迫 | 4s 匀加速推近 1.00→1.14 + 暗角渐深，张力顶点无过渡硬切亮场 | 大数字/宣言前的蓄力；暗→亮的章节爆点 |
| D pull-back-isolation 拉远孤立 | 从发光主卡特写后拉，兄弟卡按距离错峰熄灭、背景沉黑，孤卡悬在暗场中央 | 结尾收束；"全片只为这一个数字"的谢幕 |

## 参数表
| 参数 | 典型值 | 调节手感 |
|------|--------|----------|
| A 双时钟 | 内容动画用 `effFrame = f<F1 ? f : f<F2 ? F1 : F1+(f-F2)` 驱动，相机用真实 f 驱动 | 命门：冻结期内容必须肉眼可见地完全静止，相机却在动——两个时钟各管各的 |
| A 环绕 | perspective 1600 下 rotateY 0→55°→0（两段 inOut cubic，顶点悬停 ~10f）+ scale 1→1.12→1 | 55° 是"绕到侧面看"的下限；>70° 面板变纸片穿帮 |
| B 斜置 | rotate -10° + ±0.8° 长周期正弦漂移 + 2px 纵漂；scale 1.15 防露边 | 漂移是"悬着难受"的活感，纯静止斜角读作构图错误 |
| B 滚正 | 14f ease-out 冲过 0 到 +1.2° → 10f 收回 0（单次过冲不振荡）；scale 同步 1.15→1.08 | 过冲即"扶正的手劲"；振荡两次以上读作弹簧玩具 |
| C 推近 | `scale [0,120f]→[1.00,1.14] Easing.in(quad)` + 暗角 opacity 0→0.5 同曲线 | 加速曲线是本体——匀速推读作普通 zoom；幅度 >1.2 变成普通推镜头 |
| C 硬切 | 顶点帧零过渡直切下一景；暗景 A→亮景 B 反差要大 | 切的一拍才是释放；加任何过渡等于把弓拉满又慢慢松掉 |
| D 后拉 | scale 2.2→0.62 / 110f Easing.out(cubic)，origin 锁主卡中心 | 前 20f 主卡仍占满画面，开场即特写不需要另加 hold |
| D 熄灭 | 兄弟卡按 hypot 距离排序，帧 30 起每 8f 一张，16f 内 opacity→0 + brightness→0.3；背景 60–110f 沉入 #141414 | 由近到远熄灭 = "世界向外塌暗"；乱序熄灭读作故障 |
| D 光晕 | 主卡双层白 box-shadow 60–100f 淡入 | 光晕是"只剩它"的视觉证词，与沉黑同步才成立 |
| 收尾 | 四式动作完毕真静止 ≥30f | R1；D 式是全片句号，静止给足 40f+ |

## 已知坑
- demo 在灰阶/占位素材上调校通过——参数是调校起点非实战定稿，
  首次实战须以真实素材回验
- C 式"前 2 秒不可察"是设计意图不是缺陷——裁决/验收看完整播放，抽帧
  diff 前段变化极小属正常（已确认成立）
- A 式与 speed-ramp-freeze/impact-feedback 同为时间操纵，同一镜头别叠用
  （帧 remap 互相打架）；A 的冻结是"停给你看"+相机动，speed-ramp 的
  定格是"停下来标注"——选语义不选形似
- B 式斜角只压"痛点"段——全片常态斜角是 MV 语言，产品片里读作镜头没扶稳
- C 式硬切后的亮景必须信息完整可读（它承接全部积压的注意力）；
  切进另一个铺垫段等于白蓄力
- D 式放结尾时后接 outro-group-photo-launch 会打架（一收一放），二选一

## 参考实现
demos/camera/tension-camera-moves/
（BulletTimeFreezeOrbit.tsx / DutchRollToLevel.tsx / PullBackIsolation.tsx / SlowPushIn.tsx）

## Reference implementation (Remotion)

- demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx
- demos/camera/tension-camera-moves/DutchRollToLevel.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/camera/tension-camera-moves/DutchRollToLevel.tsx
- demos/camera/tension-camera-moves/PullBackIsolation.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/camera/tension-camera-moves/PullBackIsolation.tsx
- demos/camera/tension-camera-moves/SlowPushIn.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/camera/tension-camera-moves/SlowPushIn.tsx

The component imports shared fixtures from `demos/_fixtures` and helpers from `assets/lib` in the repo; SKILL.md there documents the render workflow.


## Flow

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/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx, demos/camera/tension-camera-moves/DutchRollToLevel.tsx, demos/camera/tension-camera-moves/PullBackIsolation.tsx, demos/camera/tension-camera-moves/SlowPushIn.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.

## Render

Clone https://github.com/Vincentwei1021/video-shotcraft (npm install). The component lives under demos/{category}/{name}/ and imports shared fixtures from demos/_fixtures and helpers from assets/lib. Copy it (with those imports) into a Remotion project, register a <Composition> with the template's width/height/fps/duration in Root.tsx, then `npx remotion render <CompositionId> out.mp4`. SKILL.md in the repo documents the full Claude Code / Codex workflow. The prompt below is the shot recipe (timing, easing, parameter table, pitfalls) — enough to re-implement the shot in HTML/WAAPI or another engine if you prefer.

## Contract

React/Remotion composition (TSX) from the open-source video-shotcraft library (Apache-2.0). It is not a browser-playable template: clone the repo, register the component in a Remotion project and render with `npx remotion render`. The recipe (prompt) describes timing, easing and parameters so you can also re-implement the shot in any engine.
