mcpField
Z
zach-d-films

zach-d-films

github.com/artemnovitckii创意与媒体59658 次安装1 周前更新
代码仓库

关于 zach-d-films

zach-d-films 是用于制作风格化程序化 3D 短视频的 Claude Code 技能,提供可复用的镜头引擎和制作流程,将脚本与配音转为成片。

主要功能

  1. 01程序化 3D 场景与角色
  2. 02可复用道具和动画辅助工具
  3. 03字幕与镜头时序流程
  4. 04静帧预览和视频渲染

适用场景

  1. 01制作解释常见误解的短视频
  2. 02用慢动作和特效呈现冲击
  3. 03将脚本和配音制作为竖屏短片

安装

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

$npx skills add https://github.com/artemnovitckii/claude-animation-skills --skill zach-d-films

安装后在 Claude Code 中输入/zach-d-films确认已加载。

包含的文件

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

engine/
captions.py
index.html
render.mjs
engine/src/
anim.js
human.js
main.js
materials.js
props.js
shots.js
textures.js

详细介绍

/zach-d-films

┌──────────────────────┐
│      blue sky        │  procedural 3D people and props, soft shadows
│    ◕‿◕   ⛨           │  depth of field, bloom, light grain
│   /▓▓▓\  ⟶  •        │  slow-motion impacts, sparks, a red force ripple
│     ▓▓               │
│     arrows           │  1-3 word captions, white bold, lower third
└──────────────────────┘

附带一个完整示例:engine/ 是一部完成的 29.5 s 短片《古代盔甲能挡住子弹吗?》(9 个镜头:开枪、子弹慢动作击中背心后变扁、剑砍锁子甲、钉头锤击中板甲并泛起红色波纹、弓箭手、射出的箭和一声尖叫、一颗子弹穿过两个靶架)。它不包含配音,因此你需要自己提供配音。本项目与 Zack D. Films 无关;“这种风格”指的是这种形式:提出问题、纠正误解、用一个“But”转折、逐步展示案例,最后揭晓结果。

首次使用

Claude Code 加载此技能时显示的“Base directory”就是该技能的文件夹。

SKILL_DIR="<base directory of this skill>"
KIT=$(python3 -c 'import os,sys;print(os.path.realpath(os.path.join(sys.argv[1],"..","..","kit")))' "$SKILL_DIR")
[ -d "$KIT/node_modules/playwright" ] || bash "$KIT/setup.sh"
[ -x "$KIT/.venv/bin/python" ] && [ -d "$KIT/models" ] || bash "$KIT/setup.sh" --voice   # word timings + free voice, ~1 GB once
PY="$KIT/.venv/bin/python"

需要 ffmpeg、Node 和 Python 3.9+。它在无头 Chrome 中使用 WebGL 渲染:在 Mac 上每帧约需 0.2 到 0.5 s,一部短片需要几分钟。若设备没有可用的 GPU,请设置 GL=swiftshader(速度会慢很多)。

引擎

文件内容
src/shots.js剪辑内容。 CAPTIONS([start, text, end?])、FADES(淡入黑场)、DURATION、每个镜头对应的一个函数,以及 SHOTS 列表({start, end, build})。镜头的 build({makeStage}) 会返回 {scene, camera, update(t)};update 接收镜头内的时间,并可返回 {dof, bloom, exposure}。
src/human.jsmakeHuman(outfit):可摆姿势的卡通人物('vest'、'chainmail'、'plate'、'knight'、'archer')。使用 setPose({joint: [x, y, z]}) 设置 pelvis spine chest neck head lSh lEl lWr rSh rEl rWr lHip lKn lAn rHip rKn rAn(以及 drop),setMouth(0..1) 设置嘴部,lerpPose(a, b, t) 进行姿势插值,standArmor(kind) 设置盔甲展示架。
src/props.jspistol、gunArm、bullet(带有变扁形变)、sword、shield、mace、arrow、bow、stand、glowSprite、sparks、streak、rippleOverlay(红色冲击波纹)。
src/anim.jskf 关键帧、缓动函数、range、cam(fov)、place(camera, pos, look)、shake、ikArm(双骨骼手臂 IK,让手可以抓取物体)。
src/textures.js、src/materials.js使用 Canvas 制作的钢铁刮痕、锁子甲环、木材、织物、皮肤纹理,以及基于这些纹理构建的材质。
src/main.js渲染器、天空、光照、景深、泛光、色彩分级,以及 window.renderAt(t)。

步骤

  1. 脚本。 使用用户提供的脚本,或按以下格式撰写:“如果你……”钩子、“有些人认为……”、“但”转折、逐步展开的示例、作用机制,以及回应钩子的结尾。每秒约 2.5 个词(30 秒约 70 到 90 个词)。核查事实。
  2. 项目。 将引擎复制到新文件夹(<project> 必须尚不存在),并链接共享软件包:
    cp -R "$SKILL_DIR/engine" <project> && ln -s "$KIT/node_modules" <project>/node_modules
    
    将脚本写入 <project>/script.json,格式为句子列表。
  3. 配音。 最好使用用户自己的录音;用 ffmpeg -i <take> -ac 1 -ar 44100 <project>/audio/vo.wav 转换。否则,在项目目录中使用免费的 Kokoro 音色:"$PY" "$SKILL_DIR/../stick-figure/engine/tools/tts_kokoro.py" [voice] [speed](默认值为 am_michael 1.12;也可用 af_heart、am_adam、bm_george),生成 audio/vo_kokoro.wav;将其复制到 audio/vo.wav。仅用于浏览器预览时,还要将其另存为 audio.m4a(main.js 会播放该文件)。
  4. 字幕。 "$PY" "$KIT/words.py" audio/vo.wav script.json 会生成 audio/vo.words.json(配音文件名加上 .words.json)。然后运行 python3 captions.py audio/vo.words.json,它会打印 CAPTIONS 和 DURATION,将这两项粘贴到 src/shots.js 中对应的位置。围绕“但”的转折设置 FADES(示例在 6.2 秒时淡暗),或设为 []。
  5. 镜头。 每隔 2 到 4 秒规划一个镜头(30 秒的视频规划 8 到 10 个,10 秒的视频规划 3 个),在字幕节拍处切镜头,作用机制的镜头最长。复制最接近的示例,为每个镜头编写一个函数,修改道具、姿势和相机设置,并在 SHOTS 中列出镜头的开始和结束时间(删除未使用的示例函数)。
    • update(t) 必须仅依赖 t:渲染可能从镜头中途开始。示例镜头 7 会在帧间保留状态,需要变通处理,因此不要照搬这种模式。
    • shots.js 中的实用辅助函数:standPose、STAND、handsOnHips、surfaceHit(投射物与网格相交的位置)。props.js 中的辅助函数:box、shadow。rippleOverlay 需要附着在一个网格上;若目标由多个部分组成,为其添加一个不可见圆盘(关闭阴影)。
    • 新道具应在 props.js 中编写为返回 THREE.Group 的小型函数。sparks 是发光点,因此碎片或灰尘需要使用独立的网格。
    • 9:16 画面较窄(fov 为 34 时宽约 19°)。为让投射物留在画面内,镜头应跟随在它后面。
    • 人物面部和关键道具应避开字幕区域(1280 高度中约 y=950 到 1030 的位置),并远离画面边缘。
  6. 静帧。 在项目目录中运行:node render.mjs stills 1.5,6.8,14 stills。完整渲染前检查每个镜头。
  7. 渲染。 运行 node render.mjs video silent.mp4 30(每帧约 0.2 到 0.5 秒),然后添加配音、调整音量并缩放至 1080x1920:
    ffmpeg -i silent.mp4 -i audio/vo.wav -map 0:v -map 1:a -vf scale=1080:1920:flags=lanczos -c:v libx264 -crf 17 -pix_fmt yuv420p -af "apad,loudnorm=I=-14:TP=-1.5" -c:a aac -b:a 192k -shortest <name>.mp4
    
  8. 交付 mp4 文件路径。

如需实时预览,可通过 python3 -m http.server 8000 提供项目服务并打开 index.html(点击即可播放 audio.m4a),也可打开 index.html?t=14.5 查看单帧。

风格

  • 明亮的蓝色摄影棚天空、柔和的日光,以及看起来像金属的金属材质。卡通人物由简单形状构成,面部表情丰富;人物比例应与道具协调。
  • 撞击时使用慢动作,配合短暂的镜头抖动、火花,以及炽热物体上的泛光。红色涟漪表现力的扩散。
  • 根据字幕节拍快速切镜头;在“但”的转折处淡入黑场一次。字幕为白色粗体,每条 1 到 3 个词。

评论

支持 Markdown