- 2024-04-03 17:13:16
好几年前, 我发过一篇Blender分子渲染习作, 练习渲染了几个已有的模型, 但没有仔细去追究如何具体建模. 那时候相关的资料还不是很多. 现在几年过去了, 等我再来查看这方面的资料时, 发现已经新增了不少工作:
饶是如此, 我仍希望自己能从头学习一下脚本建模方法, 而不是直接使用已有的模型或脚本. 这样做的坏处是自己要费心学习, 好处则在于自己实现了一个大致的框架后, 后面想做什么都比较方便, 不会受限于已有的工具. 为此, 暂定的目标就是: 给定分子结构的xyz文件, 可以是单帧的, 也可以是多帧的, 参照效果较好的已有渲染图, 实现渲染每一帧, 效果尽量接近, 并最后将多张渲染图片制作成MP4视频.
要想借助python建模, 首先要熟悉基本的python语法, 这方面的资料较多, 就不说了.
熟悉python后, 接下来就要学习下 Blender Python 的使用. 注意其版本, 因为不同版本的API会有变化. 建议使用新近的版本, 这样遇到问题时候比较容易找到答案.
一般性的资料:
- Blender学习笔记
- Blender Python 编程
- Blender Python开发入门
- Blender Python 简易参考
- 2.blender的基本操作与动画案例挑战
- Blender使用Python脚本的基本渲染操作
一些示例:
- Quickstart Blender Scripting Tutorial: The Plane and the Ball.
- Visualizing .xyz Structures in Blender, 中文版
- Create 3D objects and animations in Blender with Python API
- Blender 3D - 如何使用Python API在Blender中创建和渲染一个场景 源码
具体问题:
- Assign a material to an object in Blender using Python
- How to add/remove links to existing or new nodes using Python?
- Blender 3D: tutorials, articles, tips, notes
- 探究OpenGL中的坐标变换
大致而言, 使用python建模的步骤:
- 清理场景
- 创建材质
- 添加背景, 灯光, 相机, 物体
- 设置相机位置
- 渲染图片
脚本写好后, 执行 blender -P FILE.py
即可. 如果不希望打开Blender界面, 可以背后执行 blender -P FILE.py -b
.
Blender也可以直接制作动画, 但我目前还不是很懂, 所以我就直接渲染出图片, 然后借助FFmpeg制作成视频.
FFmpeg默认输出的视频在Windows下可能无法播放, 为此可以使用下面的选项:
ffmpeg -r 12 -i FILENAME%d.png -pix_fmt yuv420p -c:v libx264 OUT.mp4
上面的命令中
-r 12
表示帧率12, 也就是生成的视频每秒播放12张图片, 具体数字可以根据自己的需要调整.%d
表示图片名称的最后为连续编号的数字, 如FILENAME1.png
,FILENAME2.png
, …,FILENAME9.png
,FILENAME10.png
, …,FILENAME20.png
等.-pix_fmt yuv420p -c:v libx264
两个选项指定像素格式和视频格式, 只有使用这种组合时才能使用Windows自带的播放器播放, 否则要使用特定的解码器.
如果图片的名称没有使用连续数字, 或者没有规律, 那么可以将所有图片名称放到文本文件中(如list.txt
), 每个名称一行, 并在每行前面加上file
, 类似
file zz-0.png
file zz-10.png
file zz-20.png
file zz-30.png
...更多
file zz-340.png
file zz-350.png
这种情况下, 使用时添加拼接选项-f concat
即可:
ffmpeg -r 12 -f concat -i list.txt -pix_fmt yuv420p -c:v libx264 OUT.mp4
具体可参考ffmpeg # -f concat -i mylist.txt, 或FFmpeg中文文档
示例
首先是一条轨迹的视频, 轨迹为测试分子的二面角旋转, 使用前前篇博文中的测地插值方法生成. 给出两个二面角对应的构型, 使用默认的方法生成17个插值点. 渲染成图片, 然后做成视频.
下面这段则是使用固定的分子构型, 展示了相机的360度移动, 每帧移动10度.
对一个场景, 变化或不变, 所用的相机既可以固定, 也可以移动. 具体如何运镜, 则是艺术的事了. 根据网上的说法, 至少有八种运镜方法: 推、拉、摇、移、跟、升、降、甩. 具体如何用Blender脚本实现, 还有待研究.