如何使用perlin.getValue()在Libnoise中生成3D高度图?

时间:2013-01-14 23:32:08

标签: .net xna perlin-noise

我一直在使用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中获得相同的结果)。

可悲的是,没有NoiseBuilder [3D]来生成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);

left = perlin.getValue(), right = mage 2 = NoiseMapBuilderPlane

我不知道如何合并SumFractal,但我想这是后来的担心。

0 个答案:

没有答案