Я искал библиотеки для генерации шума в 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.
Есть идеи по этому поводу?