欢迎光临散文网 会员登陆 & 注册

【The 'Edge' of Inifinity】OpenGL 制作 Mandelbulb

2022-03-20 21:37 作者:Zweitestock  | 我要投稿

大家好,本篇文章将会向你介绍如何使用 OpenGL 制作三维分形 Mandelbulb。


效果预览

制作之前的准备

因为本文是基于 OpenGL 进行制作的,所以读者在进行制作之前需要了解一些 C++ 程序设计语言和现代 OpenGL 编程规范。读者可以在下面的网站学习 OpenGL:
https://learnopengl.com/Getting-started/OpenGL

然而,这些工作并不是必须的。制作 Mandelbulb 还有很多更加方便快捷的方法,比方说使用三维软件。在 Arnold 提供给 Maya 用户的用户手册中就提供了这一例子,使用 Arnold 官方提供的方法你可以得到更好的效果。读者可以在下面的地址中找到用 Maya 制作的方法:
https://docs.arnoldrenderer.com/display/A5AFMUG/How+to+Render+a+Mandelbulb

另外,还有专门的分形制作软件 Mandelbulb3D,读者只需要根据自己的喜好调整参数就可以了,这是最方便的方法。该软件网站:https://www.mandelbulb.com/

关于 Mandelbulb

如果你对 Mandelbrot 和 Mandelbulb 的历史背景感兴趣或者想有更加深入的了解,请参阅:
https://www.skytopia.com/project/fractal/mandelbulb.html#background

笔者只会对 Mandelbulb 进行一个浅显易懂的简单阐释。

让我们从稍微简单一些的 Mandelbrot Set 开始解释。你或许还记得数学上复数的概念,它就是基于复平面产生的,复平面上可以定义两条互相垂直的轴,分别对应复数的实部和虚部。为了观测 Mandelbrot Set,一个可行的办法就是将复数的实部和虚部当作二维坐标来进行计算。

这时候就可以引入我们的迭代公式了:
z_%7Bn%2B1%7D%20%3D%20z_n%20%2B%20c

如何理解这个式子呢?让我们从最简单 z = 0 的开始,c 是一个复数参数,那么
z_0%20%3D%200
z_1%20%3D%20z_0%5E2%20%2B%20c%20%3D%20c%0A
z_2%20%3D%20z_1%5E2%20%2B%20c%20%3D%20c%5E2%2Bc
......

不同的复数参数 c 可能使得这个序列发散到无穷,也可能收敛到有限的区域内,我们的任务就是找到能够使得序列收敛的复数 c 的集合,然后将其画下来就可以了。这就是这个号称 "上帝的指纹"的神奇图形的本质。

了解了 Mandelbrot,Mandelbulb 也是同样的原理,只是 Mandelbulb 是三维的,我们需要为我们的二维坐标增添一个维度,使用所谓的“ Triplex Number”,好在这在程序设计语言中很容易实现。

这时,我们的迭代公式也产生了一些微小的变化:
z_%7Bn%2B1%7D%20%3D%20z%5En%20%2B%20c

不过这并不可怕,因为在实际编码的过程中,我们可以自行设定 n 的值来产生不同的视觉效果,这赋予了我们更高的自由度。
不得不说的是, 在计算三维的 Mandelbulb 过程中,采用的三维矢量公式是在球坐标系下的而不是直角坐标系下的,这是由于不存在复数二维空间的三维模拟。关于球坐标系下的公式,读者可以参阅:
https://www.skytopia.com/project/fractal/2mandelbulb.html
上面详尽记载了公式,还提出了一些提高效率的方法,相信比起我的粗糙解释更让人清楚和信服。

伪代码

完整代码

完整的代码中添加了一些有用的 OpenGL 特性,还有可以自由操控的摄像机,可以方便观察,你可以在这里找到它:
https://github.com/Zwei-Reverberate/Generate-Mandelb


本文到此结束啦,感谢你的阅读



【The 'Edge' of Inifinity】OpenGL 制作 Mandelbulb的评论 (共 条)

分享到微博请遵守国家法律