c++ - 使用 Perlin 噪音来制造闪电?

标签 c++ perlin-noise

实际上,我有几个与主题标题中给出的主题相关的问题。

我已经在我的应用程序中使用 Perlin 函数来创建闪电,但我对我的实现并不完全满意。

以下问题基于初始和改进的 Perlin 噪声实现。

为了简化问题,假设我正在创建一个简单的 2D 闪电,方法是使用 1D Perlin 函数调制由这些节点处的 N 个节点组成的水平线的高度。

  1. 据我所知,传递给 Perlin 函数的两个后续值必须至少相差一个,否则生成的两个值将相同。这是因为在简单的 Perlin 实现中,Random 函数使用一个 int 参数,在改进的实现中,值被映射到 [0..255],然后用作包含值 [0..255] 的数组的索引] 随机分布。是吗?

  2. 如何使 Perlin 函数返回的第一个和最后一个偏移值(即节点 0 和 N-1)始终为 0(零)?现在我正在用我的 Perlin 函数调制一个正弦函数 (0 .. Pi) 来实现这一点,但这并不是我真正想要的。仅仅将它们设置为零并不是我想要的,因为我想要一条末端没有锯齿的漂亮闪电路径。

  3. 如何改变 Perlin 函数(这样我就可以得到两条不同的路径,我可以将它们用作闪电的动画开始帧和结束帧)?我当然可以在每个路径计算中为每个节点值添加一个固定的随机偏移量,或者使用不同设置的置换表来改进 Perlin 噪声,但是有更好的选择吗?

最佳答案

  1. 这取决于您如何实现它并从中取样。使用多个 Octave 有助于对整数进行相当多的计算。

    Octave 音程和为每个完成的额外插值/采样提供了柏林噪音中的大部分噪音。理论上,您不需要使用不同的整数位置;您应该能够在任何时候进行采样,并且它与附近的值相似(但并不总是相同)。

  2. 我建议使用 perlin 作为乘数而不是简单的加法,并在闪电过程中使用曲线。例如,在 [-1.5, 1.5] 范围内设置 perlin 和闪电上的正态曲线(两端为 0,中间为 1),lightning + (perlin * curve) 将使您的端点依旧。根据您实现 perlin 噪声发生器的方式,您可能需要类似以下内容:

    lightning.x += ((perlin(lightning.y, octaves) * 2.0) - 0.5) * curve(lightning.y);

    如果 perlin 返回 [0,1] 或

    lightning.x += (perlin(lightning.y, octaves)/128.0) * curve(lightning.y);

    如果它返回 [0, 255]。假设 lightning.x 以给定值开始,也许是 0,这将给出一条仍然符合原始起点和终点的锯齿线。

  3. 为闪电添加的每个维度都为噪声添加一个维度。如果您在一维(水平锯齿状)中修改闪电,则需要 1D 柏林噪声。如果你想动画它,你需要 2D。如果您想要在两个轴上呈锯齿状且具有动画效果的闪电,则需要 3D 噪波,等等。

关于c++ - 使用 Perlin 噪音来制造闪电?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7277387/

相关文章:

c++ - 有什么方法可以欺骗 std::make_shared 使用默认初始化吗?

javascript - 将经典的 Perlin Noise 移植到 JavaScript : Getting periodic pattern. 为什么? (JsFiddle 示例)

iphone - iOS平台云的光生成算法

c++ - 插值噪声中的伪影

c++ -/usr/bin/ld : crtbegin. o: 没有那个文件: 没有那个文件或目录

c++ - 创建对象的拷贝以进行多重比较是一种好习惯吗?

c++ - 使用 DEFINE_string 是什么意思

python - Python噪声库中的柏林噪声

c++ 抽象类有问题