Claude驱动的Blender电影级短片制作
一段10秒第一人称穿越机视角的夜间城市飞行动作背后的完整工作流:一个故事板、真实的物理路径、一个转折点(第一个主角效果不理想)、夜间照明、基于运动的音效、3.5小时渲染,以及白模搭建揭示。以下每个步骤都是scripts/目录中实际用于该片段的脚本;其中的名称(Drone Empty、Street Asphalt、Building_1...)来自该场景——请根据你的场景重命名。
0. 准备工作
- Blender 4.4+(本流程使用5.2版本)、支持Cycles的GPU、已加入PATH的Python 3和
ffmpeg(音效步骤还需numpy、scipy)。 - 实时桥接(Claude驱动已打开的Blender,你观看):在Blender的文本编辑器中运行
tools/bridge.py(监听127.0.0.1:9876)。然后在终端中运行:python tools/send.py scripts/06_night.py或python tools/send.py -c "print(bpy.data.filepath)"。 - 设置
FILM_ROOT指向你的项目文件夹(默认为~/blender-film):scene/、render/、audio/、research/将创建在该目录下。tools/lib.py会被每个脚本加载(辅助函数:coll()、save()、snap()...)。 - 在副本上工作。 在重播或重新运行任何编辑材质的脚本之前,请复制.blend文件——如果运行中途崩溃,几个步骤不是幂等的(一旦重新运行,会留下孤立的节点连接)。
1. 先做故事板
在接触Blender之前,请Claude生成一个10秒的故事板:带有时间安排的镜头列表、每个镜头的摄像机、主角位置、观众感受。将其转换为一张图片(使用任何图像模型),并保持打开——后续每个决定都将对照它检查。
2. 城市
使用你拥有的城市资产包(建筑、道路、道具)或免费的CC0资产(Poly Haven)。让Claude从俯视图平面沿+X方向布置一条大道加一个十字路口(保持主角路径通畅无道具遮挡),然后进行装饰:汽车(停靠/行驶/停止)、路灯、树木、消防栓。将所有外部资产烘焙到.blend文件中。
3. 基于物理的运动,而非手动关键帧曲线
scripts/01_swing_sim.py模拟移动(重力、空气阻力、不可拉伸的绳索、根据故事板设置的空间锚点)并搜索锚点时间,直到路径穿过街道。02_path_empty.py将其转换为路径曲线加上一个沿路径跟随的空物体,其偏移量按帧计算(真实速度,非线性)。主角作为空物体的子级,摄像机跟随自己的路径(03_camera.py,加上03b_camera_noise.py实现细微抖动)。
4. 主角——以及何时转捩
第一个主角是一个使用Mixamo动画片段绑定的蜘蛛侠。它失败了:动作捕捉是在地面上录制的,所以在空中它像木偶一样悬挂,姿势僵硬,而且在画面中很小。如果带肢体的角色看起来不对劲,就更换主角——保留城市、摄像机和路径。 向Claude询问替代方案(我们得到了:鹰、超级跑车、手工修复、穿越机)。
穿越机之所以可行,是因为没有任何东西会显得僵硬。04_drone_attitude.py使其像真实四轴飞行器一样飞行:
- 姿态源自物理:推力轴=加速度+重力,机头沿速度方向——加速时前倾,急转弯时大角度倾斜,刹车时机头上仰;
- 在弹道段切断油门——叠加特技动作:动力筋斗、横滚、后空翻;
- 刹车后悬停,然后缓慢偏航朝向镜头;旋转的桨叶+品红/青色LED灯条。
5. 写实化处理(05_realism.py)
那些直到缺失时才会被注意的微小细节:AgX曝光(无调色)、薄雾体积、纹理重复破损的沥青路面、车轮轨迹、每条车道上的油滴线、修补块、磨损的标线,以及每面墙脚下的污垢和微弱的冲刷痕迹。
6. 真正像夜晚的夜间照明(06_night.py)
规则:夜晚天空不照亮场景——实际光源照亮场景。 带有城市辉光的暗渐变天空、LED路灯、亮灯的窗户、汽车头灯/尾灯、红色交通信号灯、带有微弱自发光效果的蓝色调雾、带水坑的潮湿路面。
- 首次尝试失败(到处都是橙色雾,发光块而非窗户)。
- 解决方法:建筑纹理已经知道玻璃的位置——玻璃是光滑的,墙壁是粗糙的。使用粗糙度贴图作为窗户遮罩(
roughness < 0.3),然后为每个窗户单元随机设置灯光:暖色、冷色、关闭。
7. 像真实摄影师一样的摄像机(07_shakify_cams.py)
将所有镜头摄像机的程序化噪波替换为Shakify(免费插件,使用真实录制的摄像机运动)。添加近景镜头:一个距潮湿路面约0.45米高的街道级摄像机,穿越机向镜头俯冲并在镜头前停下。08_lens_look.py:灯光周围的光晕、轻微的桶形畸变和色散——无调色,画面效果来自照明本身。
8. 基于运动设计的音效
免费的CC0录音(BigSoundBank:穿越机、夜间城市、湿滑道路上的交通、喇叭声、远处的警笛声、风声、水坑上的雨声、空调声)。11_motion_data.py将每帧的动画数据(穿越机距离/径向速度/偏航方向/油门、附近车辆)读取到audio/motion.json;12_build_sfx.py根据该数据进行混音:
- 油门→电机转速→音高;径向速度→多普勒效应(经过镜头时音高下降);偏航方向→等功率声像定位;
- 距离增益+空气吸收、急加油门时的螺旋桨爆音、低空飞过湿路面时的水花声、仅在屋顶镜头出现的屋顶空调声、汽车经过时的最近距离点声音、街道峡谷混响;
- 制作两个版本(宁静的夜晚/嘈杂的城市),凭听觉选择。宁静版本胜出:让主角成为焦点。响度-14 LUFS。
9. 通宵渲染——安全进行
09_render_opt.py:移除隐藏的重复几何体(树木资产携带了额外副本),对远离所有镜头摄像机的任何物体使用较轻的LOD,GPU降噪。没有可见变化。- 首先以最终质量渲染六张测试静帧并检查。
10_render_edit.py仅渲染最终剪辑使用的帧(镜头列表=摄像机+帧范围),可续传,并将进度写入render/status.json;tools/render_window.ps1(Windows)显示干净的进度面板:百分比、剩余时间、最后完成的帧。- 渲染完成后:检查每一帧是否存在、没有黑帧/损坏帧(逐帧亮度检测,仅在计划剪辑处跳变)、音效与已批准的混音相符、响度符合YouTube要求。只有通过所有检查后才编码输出+(如果你要求的话)关闭电脑。
10. 白模搭建揭示(证明它是真实的3D)
13_aerial_cam.py在街道上方添加一个高视角摄像机。在场景的新副本上,14_clay_build.py将所有材质变为白色粘土,冻结摄像机+交通在一个帧上,并隐藏每个物体直到其出现时刻,然后使其从天空坠落:首先是汽车,然后是离摄像机最近的建筑,接着是远处的城市,最后是路灯和消防栓(约500个物体)。每个下落都加速并在落地时有轻微的弹跳。tools/clay_assemble.sh:夜间|硬切|白模搭建|一个0.25秒的擦拭|夜间,相同的摄像机,相同的帧。白模与夜间并排的静帧是很好的缩略图。
耗费时间的教训
- 如果窗口规格不正确,屏幕录制会捕获黑屏——在离开前检查第一个录制帧。
- 视口录制:材质预览需要关闭运动模糊并取消连接体积,否则会涂抹;Cycles视口需要降噪器。
blender -b中的相对输出路径解析到驱动器根目录——始终使用绝对路径。- 在任何长时间GPU工作前询问;先以低质量测试,最后再使用最终质量。
许可证:MIT。仅由Abdullah Formuli维护。不接受外部贡献。