Перевод перлина Libnoise XNA вызывает искажение

Я искал библиотеки для создания шума в 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 работает иначе, вместо этого она использует функцию перевода для «перемещения» по сгенерированной карте высот.

Перевести.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.

введите здесь описание изображения

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


person omgnoseat    schedule 01.03.2012    source источник


Ответы (3)


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

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

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

person Colin Godsey    schedule 06.04.2012
comment
Перемещение только по Z также искажает шум (Z — вертикальная ось). Кажется, Y перемещает слой, поэтому я думаю, что уже использую 3D-шум, даже если класс называется Noise2D. Кажется, нет класса Perlin3D или Noise3D. - person omgnoseat; 07.04.2012
comment
о боже, это правильно. Я видел это раньше. Поддержка 2D в libnoise, как правило, просто использует 3D-материал с 0, установленным для одной оси. Похоже, что он не перемещает ось Y. Обычно это повышение, но я думаю, что кто-то напортачил с переводом с C->C++. github.com/ricardojmendez/LibNoise.Unity/blob/master/Noise2D. cs - person Colin Godsey; 11.04.2012
comment
Это С#, но это кажется очень вероятным. Библиотека не с открытым исходным кодом, поэтому я не могу ее модифицировать :( Не то, чтобы мое понимание шума перлинга было достаточно большим, чтобы иметь возможность его модифицировать. Я уже e- написал создателям, но они не отвечают ›_‹ - person omgnoseat; 13.04.2012
comment
хм, я увидел XNA и подумал о C#. Плохо ;) Можно ли вообще использовать версию C? Должен быть с открытым исходным кодом - person Colin Godsey; 13.04.2012
comment
Есть libnoise.net, который я мог бы использовать, но он немного сложнее в использовании, чем версия xna. - person omgnoseat; 14.04.2012

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

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

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

person Robert Jernberg    schedule 14.09.2013