[英]How is a mandelbulb rendered?
我不知道确切的数学公式,但我确实知道如何将2D分形转换为3D分形。 但是首先让我们看看如何进行2D分形:
计算一般的(2D)分形时,请选择一些像素坐标,然后使用[x,y] = somefunc(x,y)
类的函数对其进行变换[x,y] = somefunc(x,y)
然后检查结果是否满足某些条件。 如果不是,您会再次重申...
您的数字可能永远不会满足此条件,因此您要添加一些全局计数器,比方说每个像素100次迭代-如果在100次迭代后不满足该条件,则您将认为它永远不会停止。
如果从不满足条件,则假定当前像素在分形之外,如果满足条件,则存储执行此操作所需的迭代计数。
对于将迭代次数映射到颜色的每个像素都进行了计算,最常见的是,我看到outside
涂成黑色,并且迭代次数映射到某些自定义颜色。 您可以使用渐变,带,灰度或任何您想要的颜色。 您也可以循环使用这些颜色来伪造动画。
这里要注意的一件事是,当您开始计算某个像素然后经过一些迭代后,您将最终得到该像素的结果-在3D情况下,这将有所不同。
在3D情况下,大多数计算是相同的,只是更多。
您从一个像素开始,但是现在您计算了从眼睛到该像素的3D射线,并选择了一个靠近您的起点(例如接近剪切平面)。 您可以对此3D点进行迭代,但是如果不满足条件,则可以将点向前推进一小步,然后为该新点重新计算所有内容。 这意味着仅计算一些迭代来获得当前像素的结果是不够的-您可能需要对射线的每个测试点执行很多次,这会使计算速度变慢。
基本上,当您找到满足条件的第一个点并对该点进行迭代计数时,可以使用与2D情况相同的方式对其进行着色,但是3D空间为您提供了更多选择。 您可以跟踪此点和光源之间的线以检查其是否被遮挡,或尝试计算照明的normals
(分形中没有典型的normals
,但您可以尝试伪造它)。
在这里,您可以发挥最大的创造力-尽管当前的计算机速度太慢,无法快速完成所有这些数学运算,但您可能会发现许多技巧。 例如,在您发布的图像中,我相信他们还跟踪了每个最终点的接近程度以获得ambient occlusion
。
根据我的somefunc
和condition
您可以查看有关Mandelbrot和Julia集的Wiki页面。 他们似乎很简单,但是我不是一个人做,所以不会假装我是描述它的好人。
Mandelbulb的公式与Mandelbrot集的公式相似,但具有额外的维度。 首先,我将描述如何使用实数而不是对复数进行迭代来制作Mandelbrot集。
与其计算r = 2圈内的所有点c的零轨道z_new = z_old^2 + c
我们z_new = z_old^2 + c
使用e^(I theta)=cos(theta)+I sin(theta)
那么我们的公式是
X_new= r^2 cos(2 theta)
Y_new= r^2 sin(2 theta)
其中X_old=r cos(theta)
, y_old =r sin(theta)
为了将其三维化,我们将所有内容都写成球坐标
x_old= r sin(phi) cos(theta)
y_old= r sin(phi) sin(theta)
z_old= r cos(phi)
现在我们可以迭代
x_new=r^2 sin(phi) cos(2 theta)
y_new=r^2 sin(phi) cos(2 theta)
z_new=r^2 cos(2 phi)
之所以可行,是因为Mandelbrot方程中的平方函数被半径平方和旋转两倍角度所替代,并通过在z方向上添加相同的变换来将其占据一维。 上图是8号曼德尔布尔的幂,因此我们用8号幂代替平方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.