2

我一直在寻找在 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 轴。

在此处输入图像描述

对此有任何想法吗?

4

3 回答 3

1

看起来主要问题是高度图使用什么尺寸来产生结果。

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

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

于 2012-04-06T21:21:36.830 回答
0

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

于 2013-09-14T07:04:30.203 回答
0

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

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

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

        // 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);
于 2013-02-04T20:06:45.637 回答