2016-09-03 32 views
0

我从来没有理解过像mandelbulb这样的东西可以从数学数据中产生。对我来说唯一有意义的方法是使用体素,这显然不是在这里链接的图像中使用的。所以如果有人能向我解释这一点,请做。mandelbulb如何呈现?

enter image description here

+0

的确是好奇的形象!它是用某种转换函数完成的。Mandelbrot图像已经具有三个维度:x-y平面和z-高度(迭代)。虽然我的猜测是这是类似Julia集合的转变,而不是Mandelbrot。 –

回答

2

我不知道确切的数学,但我知道如何从2D分到达3D之一。但首先让我们看看如何做二维分形:

当计算一般(二维)分形时,您可以选取一些像素坐标并使用函数(如[x,y] = somefunc(x,y))对其进行变换,并检查结果是否符合某些条件。如果它不是你再次重申,并再次...

你的数字可能永远不会满足这个条件,所以你添加一些全局计数器,让我们说100个迭代每个像素 - 如果它不符合100次迭代后的条件你认为它永远不会停止。

如果从未满足条件,则假定当前像素在分形之外,如果满足条件,则存储这样做所需的迭代次数。

将所有这些计算出来的每个像素都映射到颜色的迭代次数后,我经常看到outside绘制为黑色,迭代计数映射到某种自定义颜色。你可以使用渐变,乐队,灰度或任何你想要的。你也可以循环这些颜色来伪造动画。

这里要注意的一点是,当你开始计算一些像素,然后经过一些迭代后,最终会得到该像素的结果 - 这在3D情况下会有所不同。

3D

在3D情况下,大部分的计算是一样的,只是多了很多人。

您从一些像素开始,但是现在您可以计算从您的眼睛到该像素的3D光线,并选择靠近您的某个起始点(如近剪裁平面)。你对这个3D点做了你的迭代,但是如果你不符合条件,你只需稍微提前一点就可以重新计算这个新点。这意味着计算一些迭代以获得当前像素的结果是不够的 - 您可能需要为光线上的每个测试点执行很多次,这会使计算速度变慢。

基本上,当您找到满足您的条件的第一个点并为此点计算迭代次数时,可以按照与2D案例中相同的方式对它着色,但3D空间会为您提供更多选项。你可以追踪这个点和灯光之间的线,以检查它是否有阴影,或者尝试计算光照的正常值(分形中没有典型的normals,但你可能试图伪造它)。

这是一个您可以最有创意的地方 - 尽管目前的电脑速度太慢,无法快速完成所有这些数学运算,您可能会发现很多技巧可以帮助您。例如,在您发布的图片中,我相信他们也会跟踪每个最终点的一些接近程度,以获得ambient occlusion

并根据我的somefunccondition,您可以查看关于Mandelbrot和Julia集的维基页面。他们似乎很简单,但我没有自己做,所以不会假装我是描述它的好人。