实际上,我有几个与主题标题中给出的主题相关的问题。
我已经在我的应用程序中使用 Perlin 函数创建闪电,但我对我的实现并不完全满意。
以下问题基于初始和改进的 Perlin 噪声实现。
为了简化问题,我们假设我通过使用 1D Perlin 函数调制由 N 个节点组成的水平线的高度来创建一个简单的 2D 闪电。
据我了解,传递给 Perlin 函数的两个后续值必须至少相差一,否则生成的两个值将相同。这是因为在简单的 Perlin 实现中,Random 函数使用 int 参数,并且在改进的实现中,值被映射到 [0..255],然后用作包含值 [0..255] 的数组的索引。 ] 呈随机分布。是对的吗?
如何实现 Perlin 函数返回的第一个和最后一个偏移值(即节点 0 和 N-1)始终为 0(零)?现在我正在用我的 Perlin 函数调制正弦函数(0 .. Pi)来实现这一目标,但这并不是我真正想要的。只是将它们设置为零并不是我想要的,因为我想要一条末端没有锯齿的漂亮闪电路径。
如何改变 Perlin 函数(以便获得两条不同的路径,可以用作闪电的动画开始帧和结束帧)?我当然可以为每个节点值添加每个路径计算的固定随机偏移,或者使用不同设置的排列表来改进柏林噪声,但是有更好的选择吗?
-
这取决于您如何实现它并从中采样。使用多个八度音程有助于计算整数。
每个倍频程和额外的插值/采样提供了柏林噪声中的大部分噪声。理论上,您不需要使用不同的整数位置;您应该能够在任何点进行采样,并且它将与附近的值相似(但并不总是相同)。
-
我建议使用柏林作为乘数而不是简单的加法,并在闪电过程中使用曲线。例如,柏林在 [-1.5, 1.5] 范围内,闪电上有一条正态曲线(两端为 0,中间为 1),lightning + (perlin * curve)
将使你的端点保持静止。根据您实现柏林噪声发生器的方式,您可能需要类似的东西:
lightning.x += ((perlin(lightning.y, octaves) * 2.0) - 0.5) * curve(lightning.y);
if perlin
返回 [0,1] 或
lightning.x += (perlin(lightning.y, octaves) / 128.0) * curve(lightning.y);
如果它返回 [0, 255]。假设lightning.x
从给定值(也许是 0)开始,这将给出一条仍符合原始起点和终点的锯齿状线。
- 为闪电添加的每一个维度都为噪声添加一个维度。如果您要在一维(水平锯齿状)修改闪电,则需要一维柏林噪声。如果你想制作动画,你需要 2D。如果您想要在两个轴上呈锯齿状且具有动画效果的闪电,则需要 3D 噪声,等等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)