同样,我的Perlin Noise产生了一个问题。我已经阅读了多篇有关其工作原理的文章。我用以下代码实现了它:
package PerlinNoise;
import java.util.Random;
public class PerlinNoise {
private long seed;
private Random rand;
private float f;
public PerlinNoise(long seed, float f) {
this.seed = seed;
this.f = f;
rand = new Random();
}
//interpolates generated noise
public float getInterpolatedNoise(float x, float y) {
float a = (int) Math.floor((double) x / f);
float A = a + 1;
float b = (int) Math.floor((double) y / f); //<-- define the points around the point
float B = b + 1;
return cosineInterpolate(
cosineInterpolate((float) getNoise(a, b), (float) getNoise(A, b), (float) (x - a * f) / f),
cosineInterpolate((float) getNoise(a, B), (float) getNoise(A, B), (float) (x - a * f) / f),
(float) (y - b * f) / f); //<-- interpolates everything
}
//cosine interpolation
private float cosineInterpolate(float a, float b, float x) {
float f = (float) ((1f - Math.cos(x * Math.PI)) * .5f);
return a * (1f - f) + b * f;
}
//generates random noise value between -1.0 and 1.0
private float getNoise(float x, float y) {
if(y < 0) {
rand.setSeed((long) (332423 * (Math.sin(Math.cos(x) * x) + Math.cos(Math.sin(y) * y) + Math.tan(seed))));
}else{
rand.setSeed((long) (432423 * (Math.sin(x) + Math.cos(y) + Math.tan(seed))));
}
float n = (float)(((float)rand.nextInt(255) - (float)rand.nextInt(255)) / 255.0f);
return n;
}
这是我将所有八度加在一起的时候:
//performs perlin noise function
public static float[][] getPerlinNoise(int octaves, long seed) {
float[][] noise = new float[Main.csX][Main.csY];
for(int z = 0; z < octaves; z++) {
float f = (float)Math.pow(2, z);
PerlinNoise oct = new PerlinNoise(seed, f);
for(int y = 0; y < Main.csY; y++) {
for(int x = 0; x < Main.csX; x++) {
noise[x][y] = (noise[x][y] + oct.getInterpolatedNoise(x * f, y * f)) * (float)Math.pow(p, z); //<- pumps out numbers between -1.0 and 1.0
}
}
}
return noise;
}
对不起,那里的巨大代码转储。这些代码在我运行时都可以正常运行,但是我不会受到Perlin的干扰。我刚得到这个:
这比其他任何东西都更模糊,混合噪音。即使添加更多八度和/或增加持久性,我也会得到非常相似的结果。我使用this文章作为构建代码的参考(也是this一个)。因此,如果任何人对为什么它不起作用有任何想法,请发表评论/回答。谢谢!
最佳答案
我遇到了这个问题,对于刚开始使用Perlin Noise的人来说,这是相当普遍的。我相信正在发生的事情是您在距离太远的点采样了Perlin噪声。尝试将f乘以0.1,看看是否有帮助。另外,首先尝试只使用一个八度音阶,它将帮助您调试。
关于java - 佩林噪声不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13544805/