前言的前言:

如果你的技能点选择了 Python,恭喜,现在 Python 赶上了 AI 热潮。

而如果恰好还想做 Creative Programming,苦于漫天教程大多集中在 Processing、Unity、OpenFrameworks、vvvv 等平台,真青年不要慌,Python 大法依然香,往下看。

前言:

【编程德鲁伊】系列是我的横向编程练习笔记,每期围绕一个主题(数学物理电子图形声音...),用几种程序语言分别实现。战法牧贼同时修,能抗能打能奶能开溜。

编程德鲁伊 - 数学篇 - 傅里叶级数可视化

Blender + Python 实现

本章做傅里叶级数可视化,已经分别练习了 JavaScript (React) 版:


这一节又轮到 Python 了。

Playground 选择

在上一章三角函数主题里(Python三角函数可视化),Python 的开发环境或者 Playground ,我用的是 Jupyter Notebook 。它是一个 Web 版的在线 Python 开发环境,可以基本做到实时编程,边写边看运行结果,还可以代码和文档混编。

这样会相对容易一些,不用考虑如何搭建合理的本地 Python 环境、如何可视化图形渲染等问题。先把注意力集中在 Python 代码编写上,直接在浏览器里就可编写并查看运行结果。

Jupyter 虽好,但仍不够野,如果想做更丰富的可视化效果,而非仅仅把公式曲线画出来,那用 Jupyter 来跑 Python 就稍有点限制。

我需要一个不用太操心图形渲染底层实现,并且渲染效果又强悍粗暴的 Python 运行环境。

Blender 和 TouchDesigner 是两款符合此条件的软件。

Blender

Blender 是一款开源的 3D 内容创作软件,核心功能可以类比 3D Max、Maya 等,体积短小精湛却又功能粗暴,横跨多操作系统,详细介绍见其官网:

https://www.blender.org/

Blender 的生态基于 Python 而建,插件、扩展、高级定制功能等,都可以用 Python 来编写。(其实也可以做实时交互的游戏,这一点有点像 Unity,当然 Blender 更偏重 3D 内容的制作。)

TouchDesigner

TouchDesigner 是一款图形化编程工具,可以类比其他连连看工具如 MaxMSP 、 vvvv 等。

TouchDesigner 的扩展脚本语言,也是 Python。

对我来说,目前用 MaxMSP 玩玩连连看就够了,等何时 TouchDesigner 火了我再来蹭热点。

所以本次我用 Blender 作为 Python 编程练习的运行环境。

Hello World

首先在 Blender 官网下载 2.80 版的安装文件,Mac、Windows、Linux都支持。

2.80 版起,Blender 有了巨大的更新,究竟有多大,我也不太清楚,因为我上一次用 Blender 是十多年前了,当时还是 2.4x 版,用 Python 试了试参数化建筑生成。

反正 2.80 版我当新软件用就对了。

2.80 版安装后启动:

它的功能很多,建模、贴图、动画、渲染等都有,反正我跟十多年前一样仍然不太会用,推荐查阅官方教程。

本文直接切到 Scripting 来跑 Python。

在 Scripting 里有一个 Console,开箱即用,直接在里面输入 Python 代码即可。百年传统,hello world:

仅在 Console 里写是很不方便的,点选图中的 Text,这实际上是一个代码文本编辑器,点击新建(New)开始玩耍:

继续用 hello world 试试:

print ("hello world from Text Editor")

输入代码,点击 Run Script 后,可以发现左侧的自带Console区域里,并没有打印 "hello world from Text Editor" 字样。

对 Blender Windows 版,直接在 help 菜单里开启系统 Console 即可。

对 Mac 版,要先开系统 Terminal/终端(如果已打开 Blender 可以先关闭),在 Terminal 里打开 Blender:打开 Terminal 或终端

在应用程序里右键点击 Blender(.app),选择 “Show Package Contents” 或“查看包内容”

找到 Contents->MacOS->Blender

将 'Blender' 拖拽到 Terminal 窗口中

回车

开启系统 Terminal 后,重新在 Blender Scripting 的 Text 中输入

print ("hello world from Text Editor")

然后 Run Script,便可在 Terminal 中看到打印的信息:

Grease Pencil

Grease Pencil 是 Blender 2.80 版的新功能,它是一种特殊的 Blender object,允许你在 3D 空间里绘制 2D 图形,制作传统 2D 动画,剪切,动效,甚至制作故事版等。An example of a Grease Pencil object in the 3D environment

前边说过,Blender 是深度结合 Python 的软件,基本上所有软件操作,都有对应的 Python API 供使用。

铺垫了那么多,现在终于可以总结为:

在 Blender 里用 Python 调用 Grease Pencil API 进行 2D 图形绘制。

有点像在 Processing 和 P5js 里用代码画图的形式,但同时可以使用 Blender 强大的软件功能,比如直接使用功能菜单,去修改代码所画物体的贴图、材质等等,这一点上,又有点像 Unity 的操作。

Grease Pencil 要展开的话这篇就越跑越远了,把参考资源列在这里:

如封装一个 draw_line 函数,用来从两点之间画线:

进而画圆、画曲线等:

然后借助 Blender 本身看家的 3D 功能,给画的物体上材质:

甚至还可以结合 Blender 的 Animation 功能:

傅里叶级数

终于回到正题了……

再回顾一下傅里叶级数的简化公式:

用 Python 编写公式逻辑,以及调用 Blender Grease Pencil API 进行绘制渲染:

完整代码可见后文。

最终效果:

还记得么,Grease Pencil 其实是在 3D 空间里画 2D 图形:

参考资源

Talk is cheap. Show me the code!

作者,buy me a coffee!

您的鼓励是我乱码的动力。