Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
У этого метода было замечательное преимущество в скорости [...] но его недостатком был скучный ландшафт. В частности из-за невозможности генерировать нависающие над землей выступы.
Теперь (примерно с Beta 1.3) пришлось перейти на похожую систему, использующую трёхмерный шум Перлина. Теперь уже не генерируется «высота земли». Значение шума было рассматривается как «плотность», и все блоки с плотностью меньше 0 становятся воздухом, а блоки с плотностью больше или равной 0 — землёй. Чтобы нижний слой был твёрдый, а верхний — нет, к полученному результату прибавляется высота (смещение относительно уровня моря).
Помню такую штуку как terragen
private float[] GetPseudoRandomGradientVector(int x, int y)
{
int v = (int)(((x * 1836311903) ^ (y * 2971215073) + 4807526976) & 1023);
v = permutationTable[v]&3;
switch (v)
{
case 0: return new float[]{ 1, 0 };
case 1: return new float[]{ -1, 0 };
case 2: return new float[]{ 0, 1 };
default: return new float[]{ 0,-1 };
}
}Вот эта часть?
function Noise(integer x)
x = (x<<13) ^ x;
return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end function
function Noise(integer x, integer y)
n = x + y * 57
n = (n<<13) ^ n;
return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end function
Создание карт из функций шума