【问题标题】:How is a mandelbulb rendered?曼德尔灯泡是如何渲染的?
【发布时间】:2016-09-03 18:47:25
【问题描述】:

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

【问题讨论】:

  • 真是奇怪的图像!它是通过某种变换功能完成的。 Mandelbrot 图像已经具有三个维度:x-y 平面和 z-高度(迭代)。虽然我的猜测是类似的 Julia 集的转换,而不是 Mandelbrot。
  • 我猜这可以用 raymarching SDF 来完成

标签: 3d fractals mandelbrot


【解决方案1】:

我不知道确切的数学,但我知道如何将 2D 分形转换为 3D 分形。但首先让我们看看如何制作 2D 分形:

在计算一般 (2D) 分形时,您选择一些像素坐标并使用函数转换它们,例如 [x,y] = somefunc(x,y),并检查结果是否满足某些条件。如果没有,你再重复一遍,一遍又一遍......

您的数字可能永远不会满足此条件,因此您添加一些全局计数器,假设每个像素 100 次迭代 - 如果在 100 次迭代后它不满足条件,您认为它永远不会并停止。

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

为每个像素计算所有这些后,将迭代次数映射到颜色,我经常看到outside 被涂成黑色,迭代次数映射到一些自定义颜色。您可以使用渐变、波段、灰度或任何您想要的。你也可以循环这些颜色来伪造动画。

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

3D

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

您从某个像素开始,但现在您计算从您的眼睛到该像素的 3D 射线,并选择靠近您的某个起点(如近剪裁平面)。您对这个 3D 点进行迭代,但如果您不满足条件,则将您的点推进一小步,并为这个新点重新计算所有内容。这意味着计算一些迭代来获得当前像素的结果是不够的 - 您可能需要为沿射线的每个测试点执行很多次,这会使您的计算速度变慢。

基本上,当您找到满足条件的第一个点并对该点进行迭代计数时,您可以像在 2D 情况下一样为它着色,但 3D 空间为您提供了更多选择。您可以跟踪该点和灯光之间的线以检查它是否被遮蔽,或者尝试计算灯光的法线(分形中没有典型的normals,但您可以尝试伪造它)。

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

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

【讨论】:

    【解决方案2】:

    Mandelbulb 的公式类似于 Mandelbrot 集的公式,但多了一个维度。首先,我将描述如何使用实数而不是对复数进行迭代来创建 Mandelbrot 集。

    而不是计算 r=2 圆内所有点 c 的零轨道z_new = z_old^2 + c 我们使用e^(I theta)=cos(theta)+I sin(theta) 将公式分解为 x 和 y 分量

    那么我们的公式就是

    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 方向上添加相同的变换来完成一维。上图是 Mandelbulb 的 8 次方,所以我们用 8 次方代替平方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多