【问题标题】:Libnoise XNA translate perlin causes distortionLibnoise XNA translate perlin 导致失真
【发布时间】:2012-03-20 12:03:03
【问题描述】:

我一直在研究在 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 轴。

对此有什么想法吗?

【问题讨论】:

    标签: c# xna noise perlin-noise


    【解决方案1】:

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

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

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

    【讨论】:

    • 仅移动 Z 也会扭曲噪声(Z 是垂直轴)。 Y 似乎移动了“层”,所以我认为我已经在使用 3D 噪声,即使该类被命名为 Noise2D。似乎没有 Perlin3D 或 Noise3D 类。
    • 天哪,没错。我以前见过。 libnoise 中的 2D 支持通常只是使用 3D 的东西,其中一个轴设置为 0。看起来它没有移动 Y 轴。通常这将是提升,但我认为有人搞砸了从 C->C++ 的翻译。 github.com/ricardojmendez/LibNoise.Unity/blob/master/Noise2D.cs
    • 这是 c#,但这似乎很有可能.. 该库虽然不是开源的,所以我无法修改它:( 并不是说​​我对 perling 噪声的理解足够大以至于能够修改它.. 我已经给创作者发了电子邮件,但他们没有回复>_
    • 嗯,我看到了 XNA 并想到了 C#。我的错 ;) 你可以使用 C 版本吗?应该是开源的
    • 有一个 libnoise.net 我可以使用,但它比 xna 版本更难使用。
    【解决方案2】:

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

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

    public void GeneratePlanar(double left, double right, double top, double bottom, bool seamless)

            // 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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        相关资源
        最近更新 更多