Libnoise XNA translate perlin вызывает искажение - PullRequest
2 голосов
/ 02 марта 2012

Я искал библиотеки для генерации шума в 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);

Здесь проблема в ; хотя он переводит карту высот, он также искажает ее. Что кажется странным, потому что перлин остается неизменным. Я мог предположить, что изменение Z приведет к изменению карты высот, но я изменяю только ось X.

enter image description here

Есть идеи по этому поводу?

Ответы [ 3 ]

1 голос
/ 07 апреля 2012

Похоже, основная проблема заключается в том, какие измерения использует карта высот для получения результатов.

Таким образом, весьма неопределенно, какие измерения использует построитель карт высот в качестве отметки, особенно после применения проекции....

Мне кажется, что Х контролирует высоту (если вы посмотрите на океан, похоже, вы буквально поднимаете уровень моря).Хотя это может не иметь особого смысла, было бы хорошо проверить источник и посмотреть, какие измерения он фактически использует.Подобный трехмерный шум, как правило, не заботится о том, какие размеры есть, при условии, что он соответствует вашему приложению.

0 голосов
/ 14 сентября 2013

Я не знаю насчет libnoise xna, но обычный libnoise использует X и Z для карты высоты 2d Таким образом, вы должны перевести X и Z вместо X и Y.

0 голосов
/ 05 февраля 2013

Я знаю, что это старый поток, и я не знаю, что такое перевод, но я не думаю, что он вам нужен для генерации разных плиток.

Просто используйте функцию 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);
...