Noise ++ Perlin模块始终返回0

时间:2013-10-24 23:25:15

标签: c++ perlin-noise noise-generator

我使用Noise ++库在我的程序中产生噪音,至少这是目的。 我把它设置为其中一个测试,以便测试它,但无论我给它什么参数我只得到0回来

如果有人对Noise ++有任何经验,如果你能检查并查看我是否做错了,那将会非常有用。

//
// Defaults are
// Frequency    =   1
// Octaves      =   6
// Seed         =   0
// Quality      =   1
// Lacunarity   =   2
// Persistence  =   0.5
// Scale        =   2.12
//

NoiseppNoise::NoiseppNoise( ) : mPipeline2d( 2 )
{
    mThreadCount = noisepp::utils::System::getNumberOfCPUs ();

    mPerlin.setSeed(4321);
    if ( mThreadCount > 2 ) {
        mPipeline2d = noisepp::ThreadedPipeline2D( mThreadCount );
    }

    mNoiseID2D = mPerlin.addToPipe ( mPipeline2d );
    mCache2d = mPipeline2d.createCache();
}

double NoiseppNoise::Generate( double x, double y )
{
    return mPipeline2d.getElement( mNoiseID2D )->getValue ( x, y, mCache2d );
}

1 个答案:

答案 0 :(得分:1)

我已将以下行添加到您的代码中进行编译(除了清理缓存外基本上没有任何更改):

struct NoiseppNoise
{
  NoiseppNoise();
  double Generate( double x, double y );

  noisepp::ThreadedPipeline2D mPipeline2d;
  noisepp::ElementID mThreadCount;
  noisepp::PerlinModule mPerlin;
  noisepp::ElementID mNoiseID2D;
  noisepp::Cache*  mCache2d;
};

/* constructor as in the question */

double NoiseppNoise::Generate( double x, double y )
{
  mPipeline2d.cleanCache (mCache2d);  // clean the cache before calculating value
  return mPipeline2d.getElement( mNoiseID2D )->getValue ( x, y, mCache2d );
}

调用它
NoiseppNoise np;
std::cout<<np.Generate(1.5,1)<<std::endl;

实际上为我输出了一个好的值,0.0909。

但是如果用两个“整数”(例如3.0和5.0)调用它,输出将为0,因为在某些时候会执行类似于以下语句的内容:

const Real xs = Math::CubicCurve3 (x - Real(x0));

如果参数是整数,则xReal(x0)始终相同,因为Real(x0)基本上是x的整数部分,因此xs将是设置为0.在此之后,有更多的计算来获得实际值,但它确定为0.