【问题标题】:Parametric Random Function For 2D Noise Generation用于生成 2D 噪声的参数随机函数
【发布时间】:2011-12-06 11:59:57
【问题描述】:

我正在尝试生成无限的随机地形。每次给定相同的种子时,地形应该生成相同的。

我尝试使用 Java 的 Random 函数,使用地形网格上给定节点的 x 和 y 坐标的各种函数创建种子。如x*y+x+y+seed、20*x+30*y等

这种方法的问题是我总是在生成的数字中看到清晰的模式。

所以基本上我想要的是: f(x,y) = 随机数

如果上述函数可以包含某种种子,这将是有帮助的,使其成为: f(x,y,seed) = 随机数

我需要为每个 x,y 组合生成多个数字,但是一旦我拥有上述功能,就应该很容易推导出其他数字。这些将用于决定地形的高度,以及将出现哪些特征(建筑物、树木)。

请不要提及 Perlin Noise 或其他此类方法。我的问题不是让噪音看起来不错,而是得到可靠的“随机”噪音。

谢谢, 杰米。

【问题讨论】:

  • 您在 java.util.Random 生成的数字中看到了清晰的模式?想详细说明这些模式是什么?
  • 地形中有图案,水平和垂直都有重复。
  • 您能否上传这些模式的示例以及生成它们的代码?我对它很感兴趣;这也是我的爱好之一。 (曾经是我在我曾经工作过的一家研究公司做的事情。)

标签: java function random 2d procedural


【解决方案1】:

您正在寻找散列函数。尝试其中一种:

http://www.concentric.net/~ttwang/tech/inthash.htm

以下是示例用法:

int hash32shift(int key)
{
  key = ~key + (key << 15); // key = (key << 15) - key - 1;
  key = key ^ (key >>> 12);
  key = key + (key << 2);
  key = key ^ (key >>> 4);
  key = key * 2057; // key = (key + (key << 3)) + (key << 11);
  key = key ^ (key >>> 16);
  return key;
}

int noise(int x, int y, int seed)
{
    return hash32shift(seed+hash32shift(x+hash32shift(y)));
}

而且,它看起来像这样:

【讨论】:

  • 我一回到家就试试这个,非常感谢。在我将其粘贴之前,我将不得不研究 Java 运算符,“>>>”的存在让我大吃一惊,哈哈。
  • 我将它与 Random 函数结合使用,所以现在每个节点都有一系列随机数可供使用。 :D 只是为了避免一些混乱,我认为重复可能部分(但不完全)是由于我编写的一个错误的字典查找函数。然而,这只能解释一些对称性,而不是重复。
猜你喜欢
  • 1970-01-01
  • 2012-01-08
  • 2020-03-25
  • 2011-03-20
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
相关资源
最近更新 更多