【问题标题】:Perlin noise gradient functionPerlin 噪声梯度函数
【发布时间】:2012-05-24 01:03:30
【问题描述】:

我希望将 3D Perlin 噪声算法调整到更低的维度,但我在使用梯度函数时遇到了问题,因为我不完全理解其中的推理。

原始的 Perlin 梯度函数有四个参数:一个hash 和一个三维坐标(x, y, z)。该函数的结果是根据hash mod 16的值返回的,如下所示。

  • 0: x + y
  • 1: -x + y
  • 2: x - y
  • 3: -x - y
  • 4: x + z
  • 5: -x + z
  • 6: x - z
  • 7: -x - z
  • 8: y + z
  • 9: -y + z
  • 10: y - z
  • 11: -y - z
  • 12: y + x
  • 13: -y + z
  • 14: y - x
  • 15: -y - z

011 的返回值构成了一种模式,因为每个组合都表示一次。然而,最后四个是重复的。为什么选择它们来拟合最后四个返回值?具有两个 (x, y) 和一个 (x) 维度的类似案例是什么?

【问题讨论】:

  • 我仍然不明白这个渐变函数的用途,即使是 2D。我只是在 4 个近向量上使用点积的东西,我看不出这个渐变是干什么用的。
  • @jokoon 七年前我在玩地形生成,这个功能就在手边。不确定您所说的“点产品”是什么意思。
  • 我迟到了,但它们是一回事,你计算伪随机梯度向量和你的点积。 The paper Perlin wrote explains it。实际链接并没有失效,但我直接链接到存档以防万一。优化的梯度函数掩盖了这一事实,因为您将乘以 -1/+1/0,这是没有意义的,您只需在需要的地方否定原始向量的部分,并省略将乘以 0 的部分。以这种方式编写它也消除了存储这 12 个向量的需要。
  • 谢谢亚米瑞!这似乎是它的真正心脏。请随时发布此评论作为答案。

标签: perlin-noise


【解决方案1】:

...迟到总比没有好? ;-)

“改进噪声”实现中的 grad 函数计算向量 x、y、z 和伪随机梯度向量之间的点积。

在这个实现中,梯度向量是从 12 个选项中选择的。 他们放弃了选择的统一性并将数字 12 添加到 15,因为 hash & 15hash % 12 更快

对于 2D perlin 噪声,我只使用了 4 个梯度向量,没有任何类似这样的明显问题:

return ((hash & 1) ? x : -x) + ((hash & 2) ? y : -y);

【讨论】:

  • 感谢您的回答!我总是非常感谢那些奋力拯救被遗忘的旧问题的英雄们。
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2011-09-20
  • 2013-10-14
  • 2021-06-30
相关资源
最近更新 更多