1

我需要帮助。我一直在绞尽脑汁,但似乎找不到任何好的代码示例来说明如何以编程方式生成与这些类似的形状(光爆、微光、阳光等)。

http://www.richardrosenman.com/storage/lightburst.jpg

我在这里真的需要帮助。任何人都可以用一些代码示例来帮助我产生类似的东西吗?

我正在使用类似于 C++ 的语言。

4

2 回答 2

2

这些看起来都像一个中心明亮的光中心,并且在移出时,既会褪色(变得更暗)又会扩散(变得更加分散)。

要淡入淡出,您需要通过r(距离)的函数从最大强度缩放光。从物理上讲,这类似于1/r,或者1/r^2但在您的情况下,您可能会更幸运地使用指数e^(-r)甚至线性淡入淡出1 - a*r

效果的一个主要方面是扩散。除了构建完整的光线追踪器之外,模拟扩散的最简单方法是沿旋转轴应用线性高斯模糊(甚至是简单的平均模糊)。例如,r = 3, theta = 0.5 处的扩散点可能是 r = 3, theta = 0.4 和 r = 3, theta = 0.6 之间的未扩散点的平均值。如果模糊功能的“窗口”按比例缩放,您将获得最佳效果r。也就是说,r越大,平均窗口越大,或者高斯模糊的 sigma 越大。

最后,看起来像在扩散之前,光束被θ变的传输函数旋转地“过滤掉”。也就是说,“逃离”过滤器的光束量是角度的函数。这个函数似乎有些随机化,但具有明显的结构(即,明暗带,而不是简单的白噪声)。这是Perlin Noise的完美候选,它生成具有结构的随机数据。您可以自定义此结构在 perlin 噪声算法中的精细程度;这确实是您展示的三张图片的不同之处。

总而言之:

  1. 首先,计算非分散分布:

    • 开始一个衰落的光球,f(r,theta) = 1/r(或其他一些衰落)

    • 将衰减的光球乘以嘈杂的过滤函数 p(theta)——但可能只适用于超过给定半径的点(让那个白球在中间)

  2. 然后,使用径向增长的模糊窗口分散所有内容

  3. 也许为所有内容添加白噪声颗粒。

我认为这只是生成这些的一种方法;可能还有其他人,但这可能是一个好的开始。

于 2013-09-06T03:17:07.610 回答
0

我将从定义一个函数 f(theta,distance) 开始,它为您提供在 theta 旋转度和距中心该距离处的光强度。您可能可以使用诸如 sin 之类的周期性函数来改变脉冲的细度。

另一个更酷的选择是研究一些物理学,并弄清楚当你看到明亮的灯光时这种效应是如何发生在你的眼睛上的……然后在代码中复制现实世界的数学。

于 2013-09-06T03:03:05.240 回答