繁体   English   中英

曼球如何渲染?

[英]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射线,并选择了一个靠近您的起点(例如接近剪切平面)。 您可以对此3D点进行迭代,但是如果不满足条件,则可以将点向前推进一小步,然后为该新点重新计算所有内容。 这意味着仅计算一些迭代来获得当前像素的结果是不够的-您可能需要对射线的每个测试点执行很多次,这会使计算速度变慢。

基本上,当您找到满足条件的第一个点并对该点进行迭代计数时,可以使用与2D情况相同的方式对其进行着色,但是3D空间为您提供了更多选择。 您可以跟踪此点和光源之间的线以检查其是否被遮挡,或尝试计算照明的normals (分形中没有典型的normals ,但您可以尝试伪造它)。

在这里,您可以发挥最大的创造力-尽管当前的计算机速度太慢,无法快速完成所有这些数学运算,但您可能会发现许多技巧。 例如,在您发布的图像中,我相信他们还跟踪了每个最终点的接近程度以获得ambient occlusion

根据我的somefunccondition您可以查看有关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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM