1

Libnoise の dotnet ポートを使用して、次のコードを使用して XNA でいくつかのハイマップを生成しています。

ImprovedPerlin perlin = new ImprovedPerlin(seed, NoiseQuality.Standard);
FilterModule module = new SumFractal();
module.Frequency = 0.2f;
module.OctaveCount = 6;
module.Lacunarity = 2;
module.Gain = 2;
module.Offset = 1;
module.SpectralExponent = 0.9f;
module.Primitive3D = perlin;
float bound = 10f;
NoiseMapBuilderPlane builder = new NoiseMapBuilderPlane(
  6.0f + mapX, 10.0f + mapX, 1.0f + mapZ, 5.0f + mapZ, true);
    //bound + mapx,  (bound + mapX) * 2, bound, bound * 2, true);
NoiseMap noiseMap = new NoiseMap(128, 128);

builder.SetSize(128, 128);
builder.SourceModule = module;
builder.NoiseMap = noiseMap;
builder.Build();

Graphics.Tools.Noise.Renderer.GradientColor gradient = 
Graphics.Tools.Noise.Renderer.GradientColor.GRAYSCALE;
Color[] colorData = new Color[128 * 128];
texture =
  new Texture2D(AssetManager.graphicsDeviceManager.GraphicsDevice, 128, 128);

for (int y = 0; y < 128; ++y)
{
    for (int x = 0; x < 128; ++x)
    {
        byte color = gradient.GetColor(noiseMap.GetValue(x, y)).Green;
    }
}
texture.SetData<Color>(colorData);

XNA を使用しない提供された libnoise サンプルで異なる結果が得られたとしても、これはすべて正常に機能します (XNA で同じ結果を得るには、何らかの理由で周波数を下げる必要があります)。

悲しいことに、ノイズの 3D バリアントを生成する NoiseBuilder[3D] がないため、perlin 関数を使用して自分で構築する必要があります。しかし、perlin.getValue() を使用して 2D ノイズを生成しようとしても、間違っているようです。

float px = 0;
float py = 0;
for (int y = 0; y < 128; ++y)
{
    py += 0.1f;
    for (int x = 0; x < 128; ++x)
    {
        px += 0.1f;
        int color = (int)((perlin.GetValue(px, py, 0) + 1) * 177.5f);
    }
}

texture.SetData < Color > (colorData);

左 = perlin.getValue()、右 = メイジ 2 = NoiseMapBuilderPlane

SumFractal を組み込む方法もわかりませんが、それは後で心配になると思います。

4

0 に答える 0