Большинство алгоритмов перлин-шума позволят вам получить значение шума в любом заданном месте, например noise(x,y,z)
. Это делает довольно простым создание шума на основе фрагментов. Все, что вам нужно сделать, это передать глобальную позицию вместо позиции чанка.
for(int i = 0; i < CHUNKMAX_X; i++)
for(int j = 0; j < CHUNKMAX_Y; j++)
for(int k = 0; k < CHUNKMAX_Z; k++)
if(isSolid(perlinNoise.get(chunkPosition.x + i,
chunkPosition.y + j,
chunkPosition.z + k))
thisChunk[i,j,k] = new Voxel(solid);
else
thisChunk[i,j,k] = new Voxel(air);
Итак, вы можете видеть, что мы генерируем ландшафт для фрагмента, перебирая границы фрагментов и проверяя, является ли эта глобальная позиция твердой или нет. Вероятно, это та же методология, которую вы используете для генерации ландшафта в целом.
perlinNoise.get
занимает глобальную позицию и возвращает ее плотность. Где isSolid
просто будет простой тест, чтобы увидеть, является ли воксель "достаточно плотным", чтобы претендовать на твердое тело.
perlinNoise.get
может быть более сложным, чем простой алгоритм шума. Вы можете иметь чеки, основанные на глубине вокселя в вашем мире. Например, если воксел находится ниже того, что вы определили как «абсолютный базовый уровень земли», он может использовать алгоритм Perlin Worm для получения плотности, если он выше абсолютного базового уровня, он может использовать функцию нормальной плотности, чтобы дать вам более разнообразная местность. Однако я бы порекомендовал немного смешаться между ними.
Комбинирование различных шумовых функций Perlin - это то, с чем вам нужно поиграть и посмотреть, что работает. Лучше всего настроить свою среду так, чтобы вы могли просто изменить некоторые значения и выполнить горячую замену местности без необходимости перезагружать игру. Удачного эксперимента.