仓库源文站点原文


layout: post title: 使用Blender渲染分子模型动画 categories:


好几年前, 我发过一篇Blender分子渲染习作, 练习渲染了几个已有的模型, 但没有仔细去追究如何具体建模. 那时候相关的资料还不是很多. 现在几年过去了, 等我再来查看这方面的资料时, 发现已经新增了不少工作:

饶是如此, 我仍希望自己能从头学习一下脚本建模方法, 而不是直接使用已有的模型或脚本. 这样做的坏处是自己要费心学习, 好处则在于自己实现了一个大致的框架后, 后面想做什么都比较方便, 不会受限于已有的工具. 为此, 暂定的目标就是: 给定分子结构的xyz文件, 可以是单帧的, 也可以是多帧的, 参照效果较好的已有渲染图, 实现渲染每一帧, 效果尽量接近, 并最后将多张渲染图片制作成MP4视频.

要想借助python建模, 首先要熟悉基本的python语法, 这方面的资料较多, 就不说了.

熟悉python后, 接下来就要学习下 Blender Python 的使用. 注意其版本, 因为不同版本的API会有变化. 建议使用新近的版本, 这样遇到问题时候比较容易找到答案.

一般性的资料:

一些示例:

具体问题:

大致而言, 使用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

上面的命令中

如果图片的名称没有使用连续数字, 或者没有规律, 那么可以将所有图片名称放到文本文件中(如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个插值点. 渲染成图片, 然后做成视频.

<video src="blender-traj.mp4" controls="controls" width="500" height="300"></video>

下面这段则是使用固定的分子构型, 展示了相机的360度移动, 每帧移动10度.

<video src="blender-rot.mp4" controls="controls" width="500" height="300"></video>

对一个场景, 变化或不变, 所用的相机既可以固定, 也可以移动. 具体如何运镜, 则是艺术的事了. 根据网上的说法, 至少有八种运镜方法: 推、拉、摇、移、跟、升、降、甩. 具体如何用Blender脚本实现, 还有待研究.