Libnoise XNA翻译perlin导致失真

时间:2012-03-01 23:04:27

标签: c# xna noise perlin-noise

我一直在寻找能够在XNA中产生噪音的库。 Libnoise似乎是最合乎逻辑的选择。该库很容易工作,并产生一些很好的结果。我在生成其他部分时遇到了一些麻烦。 C ++文档有一个非常好的功能:

  utils::NoiseMap heightMap;
  utils::NoiseMapBuilderPlane heightMapBuilder;
  heightMapBuilder.SetSourceModule (myModule);
  heightMapBuilder.SetDestNoiseMap (heightMap);
  heightMapBuilder.SetDestSize (256, 256);
  heightMapBuilder.SetBounds (6.0, 10.0, 1.0, 5.0); //this one!
  heightMapBuilder.Build ();
//http://libnoise.sourceforge.net/tutorials/tutorial3.html

XNA版本不能像这样工作,而是使用翻译功能“移动”生成的高度图。

Translate.cs

/// <summary>
    /// Initializes a new instance of Translate.
    /// </summary>
    /// <param name="x">The translation on the x-axis.</param>
    /// <param name="y">The translation on the y-axis.</param>
    /// <param name="z">The translation on the z-axis.</param>
    /// <param name="input">The input module.</param>
    public Translate(double x, double y, double z, ModuleBase input)
        : base(1)
    {
        this.m_modules[0] = input;
        this.X = x;
        this.Y = y;
        this.Z = z;
    }

用法

        perlin = new Perlin(zoom, 4, 0.2, 4, 1, QualityMode.Medium);
        Translate translate = new Translate(location.X, location.Y, 0, perlin);
        this.m_noiseMap = new Noise2D(200, 200, translate);
        this.m_noiseMap.GeneratePlanar(-1 * zoom, 1 * zoom, -1 * zoom, 1 * zoom, true);

这就是问题出现的地方;虽然它确实翻译了高度图,但它也会扭曲它。这似乎很奇怪,因为perlin仍未修改。我可以想象更改Z会导致高度图发生变化,但我只是在改变X轴。

enter image description here

对此有什么想法吗?

3 个答案:

答案 0 :(得分:1)

看起来主要问题是高度图用于产生结果的尺寸。

因此,高度图构建器用作高程的尺寸非常模糊,尤其是在应用投影后......

在我看来,X正在控制海拔(如果你看海洋,看起来你实际上是在升高海平面)。虽然这可能没有多大意义,但检查源并查看其实际使用的尺寸可能会很好。像这样的3D噪声一般不关心哪个尺寸,只要你使它与你的应用程序保持一致。

答案 1 :(得分:0)

我知道这是一个旧线程,我不知道翻译是什么,但我认为你不需要它来生成不同的瓷砖。

只需使用GeneratePlanar()函数将贴片按X和Y单位偏移,并使其相对于缩放,因此如果缩放0.5,则将相对贴片的偏移量移动0.5倍

public void GeneratePlanar(双左,双右,双顶,双底,bool无缝)

        // Initialize the noise map
        this.m_noiseMap = new Noise2D(resolution, resolution, moduleBase);
        this.m_noiseMap.GeneratePlanar(
        offsetX + 0 * 1/zoom, 
        offsetX + 1 * 1/zoom, 
        offsetY + 0 * 1/zoom,
        offsetY + 1 * 1/zoom);

答案 2 :(得分:0)

我不知道libnoise xna,但普通的libnoise使用X和Z作为2d高度图。所以你应该翻译X和Z而不是X和Y.