Communitygithub.com

三维视频工作室

用 Remotion 和 three.js 在你自己的电脑上,把产品转台、标志揭示和短三维镜头渲成 MP4。

三维视频工作室 是什么?

每个镜头都是代码。技能先检查静帧,再在本地输出 9:16、16:9 或 1:1 的视频。覆盖产品旋转、挤出标题、广告空镜、循环品牌片段和简单室内。它做的是渲染好的三维成片,不是剪已有素材,也不是做可交互的三维网页。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/OnlyG4BB0/video-3d-studio/tree/HEAD

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Video 3D Studio

将每个镜头构建为代码,检查其静态帧,然后在用户机器上渲染为 MP4。以用户自己的语言和简单术语进行交流。许多提出此类需求的人从未编写过代码。

1. 准备项目

首先查找现有项目:包含 tools/render.mjs 和 src/kit/ 的文件夹。如果有,则向其中添加一个新场景。

否则,检查 node --version(需要 18 或更新版本),然后在用户当前文件夹中创建一个项目,以拍摄对象命名:

node <this-skill-folder>/scripts/new-project.mjs video-<subject>

告诉用户这需要几分钟时间,并占用约 1 GB 的磁盘空间,并且首次渲染还会下载一个 130 MB 的无头浏览器。之后的每个命令都要在项目文件夹内运行。

2. 确定镜头

确定格式、时长、主题、氛围、颜色、确切文字以及任何 Logo 或模型文件。只询问那些会改变结果且没有合理默认值的参数。默认设置:社交媒体使用 9:16,其他情况使用 16:9,时长 5 到 8 秒,帧率 30 fps。

在构建之前,为自己写一个简短的计划,因为只有一个清晰想法的镜头比包含多个想法的镜头效果更好:

  • 主体: 观众应该关注的一件事
  • 相机: 镜头和一次移动
  • 灯光: 光的来源及其揭示的内容
  • 节拍: 主要事件发生的时刻,以秒为单位

用户提供的文件放在项目的 public/ 文件夹中。

3. 从最接近的场景构建

需求主要关于从哪里开始参数
一个物体或产品src/scenes/ProductOrbit.tsxmodelFile, color, backdrop
一个词或短标题src/scenes/KineticTitle.tsxtext, fontFile, color, backdrop
一个 Logosrc/scenes/LogoReveal.tsxlogoFile, tagline, color, glow, backdrop
一个房间、场所或氛围src/scenes/MorningRoom.tsxwall, accent
抽象、流动或着色器驱动的内容src/scenes/LiquidForm.tsxlook

如果需求只更改这些设置,则使用 --set 传递它们,保持代码不变。否则,将场景复制到一个新文件中,在 src/Root.tsx 中注册它,并修改副本,以便保留示例供参考。

在编写场景代码之前,请阅读 references/toolkit.md,其中列出了工具包提供的内容。关于镜头、灯光、材质和时机的决策,请阅读 references/craft.md。

如果没有模型文件,请使用工具包中的组件构建对象:useLathe 用于任何圆形物体,useRoundedBox 用于任何方形物体,useExtrudedSvg 用于平面轮廓,并将它们组合在一起。小的细节,如接缝、环状纹理、防滑纹路、印刷文字和略微圆润的边缘,是使简单模型看起来可信的关键,因此要为每个对象添加一些这样的细节,并使用工具包中的表面贴图。在光滑形状上使用纯色看起来总是像一个占位符。

保持渲染正确的要点

Remotion 会乱序并在多个浏览器标签页中同时渲染帧,因此一帧不能依赖于前一帧:

  • 使用 useShot() 计算所有变化的内容。useState、useFrame 动画、Math.random() 和 Date 会导致闪烁或跳动,因此请使用 wobble 和 scatter 来生成随机性。
  • 仅通过 usePublicFile 或基于它构建的 Hook 从 public/ 加载资源。渲染不得依赖于网络。
  • 将 3D 内容保持在 <Stage> 内部。它控制渲染管线,因此不要添加第二个渲染循环或在别处设置色调映射。
  • 每一帧都会被多次绘制并平均,这正是软阴影、真实焦外模糊和清晰边缘的来源。任何应在帧内模糊的内容都应放在 useEachSample 中。
  • 将小文字放在 <Stage> 上方的普通 AbsoluteFill 中,就像 LogoReveal 所做的那样。这样比小尺寸的 3D 文字更清晰。

4. 渲染前检查静态帧

npm run check
node tools/stills.mjs <Shot> --set format=vertical --count 5

打开命令列出的每个图像并查看它们。你无法观看视频,因此静态帧是你看到镜头的方式。为了判断运动,请求节拍附近紧密排列的帧,例如 --frames 20,24,28,32。

检查以下内容:

  • 主体在画面的起始帧、结束帧和运动中间帧都保持在画面内,且边缘清晰。
  • 在 9:16 格式下,没有重要内容位于顶部 14% 或底部 20% 的区域,因为手机应用会在那里放置按钮。
  • 高光保留细节,画面不泛白或发灰。
  • 文字拼写正确,并且在应该可读的时间之前每个字母都已出现。
  • 没有物体漂浮、相互穿透或投出有明显阶梯状锯齿的阴影。

当出现问题时,一次只更改一个设置并再次检查,以便能够确定是什么修复了问题。references/troubleshooting.md 列出了常见的症状和修复方法。

然后,使用相同的 --set 值逐帧检查闪烁和跳动:

node tools/check-motion.mjs <Shot> --set format=vertical

静态帧仅采样少数几个瞬间,因此持续几帧的闪烁可能会漏检。平坦的光滑表面是常见原因,因为它们可以同时反射强光。如果命令报告了 CHECK,请查看它命名的帧并在渲染前修复它们,除非这种突然变化是预期的,例如故意的剪辑。

5. 渲染

node tools/render.mjs <Shot> --set format=vertical --out out/<name>.mp4

使用 --quality draft 进行半分辨率测试。在全质量下,5 到 8 秒的镜头在桌面显卡上需要 36 到 88 秒。如果没有显卡,工具会降级到每帧 4 遍渲染,效果粗糙得多且速度更慢,因此要告知用户,并在后台运行长时间渲染。

将 MP4 的路径、其格式和时长以及渲染耗时告知用户。明确说明你检查了静态帧和帧间变化,但并未观看视频播放。

6. 处理修改意见

完全按照用户的要求应用修改,保持其他所有内容不变,这样像“更暖的灯光”这样的要求就不会同时改变构图。再次检查静态帧,然后重新渲染。

需要坦诚相告的限制

  • 没有真正的运动模糊,因此非常快速的移动看起来可能会有阶梯感。保持适中的移动速度,或尝试 --set fps=60。
  • 光照不是完全的路径追踪。阴影和天空遮挡是柔和且准确的,但光线不会自行反弹,因此室内场景需要添加补光。
  • Remotion 有其自己的许可:个人和不超过 3 人的公司免费,而更大的公司需要从 remotion.dev 购买付费许可。如果用户似乎为公司工作,请提及这一点。

相关技能