如何以编程方式生成类似于这些的形状?

时间:2013-09-06 02:58:00

标签: c++ graphics graphics2d

我需要帮助。我一直在绞尽脑汁,但我似乎无法找到任何好的代码示例,说明如何以编程方式生成类似于这些的形状(lightbursts,glimmers,sunrays等)。

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

我真的需要帮助。任何人都可以使用可能帮我生成类似内容的代码来解决一些例子吗?

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

2 个答案:

答案 0 :(得分:2)

这些都看起来像是中心的光明中心,在移出时,褪色(渐渐变暗)和扩散(变得更加分散)。

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

可能会有更多运气

效果的一个主要方面是扩散。模拟扩散的最简单方法是在光线跟踪器上构建完整的光线跟踪器,即沿旋转轴应用线性高斯模糊(甚至是简单的平均模糊)。例如,r = 3处的扩散点,θ= 0.5可以是r = 3,θ= 0.4和r = 3,θ= 0.6之间的未扩散点的平均值。如果模糊功能的“窗口”与r一起缩放,您将获得最佳效果。也就是说,r越大,平均窗口越大,或高斯模糊的西格玛越大。

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

总结如下:

  1. 首先,计算未分散的分布:

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

    • 通过嘈杂的滤波函数p(theta)乘以褪色光球 - 但也许只能超过给定半径的点(中间有白色球)

  2. 然后,用一个径向增长的模糊窗口驱散一切

  3. 或许可以为所有东西添加白噪声。

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

答案 1 :(得分:0)

我首先定义一个函数f(theta,distance),它给出了θ旋转角度和距离中心距离的光强度。您可以使用像sin这样的周期性函数来改变爆发的细微程度。

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