3d 曼德勒灯泡是如何渲染的?

3d 曼德勒灯泡是如何渲染的?,3d,fractals,mandelbrot,3d,Fractals,Mandelbrot,我从来都不明白如何从数学数据中生成像曼德勒灯泡这样的东西。对我来说唯一有意义的方法是使用体素,这显然不是链接在这里的图像中使用的。所以如果有人能向我解释,请解释 我不知道确切的数学,但我知道如何从二维分形到三维分形。但首先让我们看看如何进行二维分形: 当计算一般(2D)分形时,您选择一些像素坐标并使用函数进行变换,如[x,y]=somefunc(x,y),然后检查结果是否满足某些条件。如果你不重复一遍,再重复一遍 你的数字可能永远不会满足这个条件,所以你添加了一些全局计数器,比如说每像素100次

我从来都不明白如何从数学数据中生成像曼德勒灯泡这样的东西。对我来说唯一有意义的方法是使用体素,这显然不是链接在这里的图像中使用的。所以如果有人能向我解释,请解释


我不知道确切的数学,但我知道如何从二维分形到三维分形。但首先让我们看看如何进行二维分形:

当计算一般(2D)分形时,您选择一些像素坐标并使用函数进行变换,如
[x,y]=somefunc(x,y)
,然后检查结果是否满足某些条件。如果你不重复一遍,再重复一遍

你的数字可能永远不会满足这个条件,所以你添加了一些全局计数器,比如说每像素100次迭代-如果在100次迭代后它不满足这个条件,你假设它永远不会停止

如果从未满足该条件,则假定当前像素在分形之外,如果满足该条件,则存储执行此操作所需的迭代计数

将迭代次数映射到颜色的每个像素都计算出所有这些,我经常看到
外部
绘制为黑色,迭代次数映射到某个自定义颜色。您可以使用渐变、条带、灰度或任何您想要的。您还可以将这些颜色循环为假动画

这里需要注意的一点是,当你开始计算某个像素时,经过一些迭代之后,你会得到该像素的结果——这在3D情况下会有所不同

三维 在3D情况下,大多数计算都是相同的,只是更多

从某个像素开始,但现在计算从眼睛到该像素的3D光线,并拾取靠近您的某个起点(如近剪裁平面)。对该三维点进行迭代,但如果不满足条件,则将点向前推进一小步,然后重新计算该新点的所有内容。这意味着仅仅计算一些迭代来获得当前像素的结果是不够的——对于光线上的每个测试点,您可能需要多次这样做,这会使您的计算速度大大降低

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

这是一个你最有创造力的地方——尽管现在的计算机速度太慢,无法快速完成所有这些数学运算,但你可能会发现很多技巧可以帮助你。例如,在您发布的图像中,我相信他们还跟踪了每个端点的接近程度,以获得环境遮挡


根据我的
somefunc
condition
,您可以查看有关Mandelbrot和Julia集的Wiki页面。它们看起来很简单,但我不是自己做的,所以我不会假装我是描述它的好人。

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

当计算一般(2D)分形时,您选择一些像素坐标并使用函数进行变换,如
[x,y]=somefunc(x,y)
,然后检查结果是否满足某些条件。如果你不重复一遍,再重复一遍

你的数字可能永远不会满足这个条件,所以你添加了一些全局计数器,比如说每像素100次迭代-如果在100次迭代后它不满足这个条件,你假设它永远不会停止

如果从未满足该条件,则假定当前像素在分形之外,如果满足该条件,则存储执行此操作所需的迭代计数

将迭代次数映射到颜色的每个像素都计算出所有这些,我经常看到
外部
绘制为黑色,迭代次数映射到某个自定义颜色。您可以使用渐变、条带、灰度或任何您想要的。您还可以将这些颜色循环为假动画

这里需要注意的一点是,当你开始计算某个像素时,经过一些迭代之后,你会得到该像素的结果——这在3D情况下会有所不同

三维 在3D情况下,大多数计算都是相同的,只是更多

从某个像素开始,但现在计算从眼睛到该像素的3D光线,并拾取靠近您的某个起点(如近剪裁平面)。对该三维点进行迭代,但如果不满足条件,则将点向前推进一小步,然后重新计算该新点的所有内容。这意味着仅仅计算一些迭代来获得当前像素的结果是不够的——对于光线上的每个测试点,您可能需要多次这样做,这会使您的计算速度大大降低

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

这是一个你最有创造力的地方——尽管现在的计算机速度太慢,无法快速完成所有这些数学运算,但你可能会发现很多技巧可以帮助你。例如,在您发布的图像中,我相信他们还跟踪了每个端点的接近程度,以获得环境遮挡

根据我的
somefunc
condition
,您可以查看有关Mandelbrot和Julia集的Wiki页面。它们看起来很简单,但我不是自己做的,所以我不会假装我是描述它的好人。

X_new= r^2 cos(2 theta)

Y_new= r^2 sin(2 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)