c# - Unity中的Perlin函数产生小范围的相同数字
问题描述
我正在使用 Unity 的 Mathf.PerlinNoise() 函数来产生我的柏林噪声。函数的输出总是介于 0.45f 和 0.55f 之间,即使 perlin 函数应该输出从 0 到 1 的值。
您可能认为这是因为我输入了相似的值,但事实并非如此。我改变了输入,比如改变比例、改变偏移量,当然还有不同的 x 和 y,但它们似乎都产生了相同的值。
public static float terrainNoise(int x, int y, int seed, float scale, int offset)
{
System.Random prng = new System.Random(seed);
float seedOffsetX = prng.Next(-100000, 100000);
float seedOffsetY = prng.Next(-100000, 100000);
float sampleX = ((x / LookUpData.chunkWidth) * scale) + 0.01f;
float sampleY = ((y / LookUpData.chunkHeight) * scale) + 0.01f;
float value = Mathf.PerlinNoise(sampleX + offset + seedOffsetX, sampleY + offset + seedOffsetY);
Mathf.Clamp(value, 0, 1);
return value;
}
解决方案
我看到的几件事:
- 确保 chunkWidth 和 chunkHeight 是浮点数,或者你做
* (scale / LookupData.chunkWidth)
. 这就是我看到的可能导致您的错误的原因。它仅从几个位置采样,因为它通过整数除法被捕捉到网格。 - 最终,我会放弃 Unity Mathf.PerlinNoise。它不仅不可播种,而且还是 Perlin 噪声,而不是更新的、不太明显的网格对齐功能。上面是 Perlin,下面是两个 Simplex。OpenSimplex2 是我创建/使用/推荐的,但它肯定不是唯一的选择。请注意,范围是 -1 到 1 而不是 0 到 1,因此
value = value * 0.5f + 0.5f
如果直接替换它,您可能需要这样做。
推荐阅读
- python - 用相同数据集的先前值替换掩码数据
- ramda.js - 使用 ramda.js 替换键的值
- amazon-web-services - aws S3 存储桶:从浏览器上传 POST 文件时出现内部服务器错误 500
- sql - 通过辅助表进行 WITH RECURSIVE SELECT
- rust - 应该首选将字符串文字转换为字符串
- css - 在 css webpack 中为图像添加哈希
- kubernetes - 如何从具有特定标签的命名空间中获取 pod?
- javascript - 如何在不刷新窗口的情况下重新启动计时器并刷新重要统计数据?
- python - Python 多处理架构
- docker - 将 docker 参数添加到 gcloud 构建提交