创造自然的Perlin噪音

时间:2013-12-13 09:03:59

标签: perlin-noise

http://image.kilho.net/?pk=1420781

我正在尝试使用perlin噪音来创建地形。

但我总是高于噪音。

http://image.kilho.net/?pk=1420774

我想得到的是最后一张(第7张)图片。

但我的噪点图像看起来像第4或第5张图像。

这是我的代码(java)

int seed;

public Noise() {
    Random ran = new Random();
    seed = ran.nextInt();
}
/**
 * Brut noise generator using pseudo-random
 */
public double noise(int x,int y)
{
    x=x + y * seed;
    x=((x<<13) ^ x);
    double t=(x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff;
    return 1-t*0.000000000931322574615478515625;

}

/**
 * Smoothed noise generator using 9 brut noise
 */
public double sNoise(int x,int y)
{
    double corners = ( noise(x-1, y-1)+noise(x+1, y-1)+noise(x-1, y+1)+noise(x+1, y+1) ) * 0.0625;
    double sides   = ( noise(x-1, y)  +noise(x+1, y)  +noise(x, y-1)  +noise(x, y+1) ) *0.125;
    double center  =  noise(x, y) *0.25;
    return corners + sides + center;        
}

/**
 * Linear Interpolator
 *
 * @param a value 1
 * @param b value 2
 * @param x interpolator factor
 * 
 * @return value interpolated from a to b using x factor by linear interpolation
 */
public double lInterpoleLin(double a,double b,double x)
{
    return  a*(1-x) + b*x;      
}


/**
 * Cosine Interpolator
 *
 * @param a value 1
 * @param b value 2
 * @param x interpolator factor
 * 
 * @return value interpolated from a to b using x factor by cosin interpolation
 */
public double lInterpoleCos(double a,double b,double x)
{

    double ft = x * 3.1415927;
    double f = (1 - Math.cos(ft)) * .5;
    return  a*(1-f) + b*f;
}

/**
 * Smooth noise generator with two input 2D
 * <br>
 *  You may change the interpolation method : cosin , linear , cubic 
 * </br>
 * @param x x parameter
 * @param y y parameter
 *
 * @return value of smoothed noise for 2d value x,y
 */
public double iNoise(double x,double y)
{
    int iX=(int)x;
    int iY=(int)y;
    double dX=x-iX;
    double dY=y-iY;
    double p1=sNoise(iX,iY);
    double p2=sNoise(iX+1,iY);
    double p3=sNoise(iX,iY+1);
    double p4=sNoise(iX+1,iY+1);
    double i1=lInterpoleLin(p1,p2,dX);
    double i2=lInterpoleLin(p3,p4,dX);
    return lInterpoleLin(i1,i2,dY); 
}   

/**
 * Perlin noise generator for two input 2D
 * 
 * @param x x parameter
 * @param y y parameter
 * @param octave maximum octave/harmonic
 * @param persistence noise persitence
 * @return perlin noise value for given entry
 */
public double pNoise(double x,double y,double persistence,int octave)
{
    double result;
    double amplitude=1;
    int frequence=1;
    result=0;
    for(int n=0;n<octave;n++)
    {
        result+=iNoise(x*frequence,y*frequence)*amplitude;
        frequence<<=1;
        amplitude*=persistence;
    }
    return result;  
}

}

1 个答案:

答案 0 :(得分:0)

如果您将此代码称为持久值小于1,则会过度采样高频率 您正在使用的分形/ fBm倍频程求和方法是一个八度音阶下降限制器,从最紧张的结果开始并将其混合到更宽的特征扩展中。对于地形生成器,人们通常需要具有一些细节的中大特征 - 我听说应该使主要通道至少5个,可能是20个像素宽以获得平滑的特征。由于您的代码每个单元格执行一个像素,因此白色“电视静态”噪声可能会压倒您想要查看的信号。

我打赌您提到的示例图片库使用的是近似统一(或可能更高)的持久性参数来获取最终图像。