Większość algorytmów szumów Perlin pozwala na odzyskanie wartości hałasu w dowolnym miejscu, z czymś podobnym noise(x,y,z)
. To sprawia, że generowanie hałasu na zasadzie fragmentu po kawałku jest dość proste. Wszystko, co musisz zrobić, to przekazać pozycję globalną zamiast pozycji fragmentu.
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);
Jak widać, generujemy teren dla fragmentu, wykonując iteracje ponad granicami fragmentu i sprawdzając, czy ta globalna pozycja jest stała, czy nie. Jest to prawdopodobnie ta sama metodologia, której używasz do generowania terenu w ogóle.
perlinNoise.get
zajmuje pozycję globalną i zwraca swoją gęstość. Gdzie isSolid
byłby prosty test, aby sprawdzić, czy woksel jest „wystarczająco gęsty”, aby zakwalifikować się do substancji stałej.
perlinNoise.get
może być bardziej złożony niż zwykły algorytm hałasu. Możesz mieć kontrole oparte na głębokości woksela w twoim świecie. Na przykład, jeśli woksel znajduje się poniżej poziomu absolutnego podstawowego podłoża, może użyć algorytmu perlin worms do zwrócenia gęstości, jeśli jest powyżej bezwzględnej podstawy, może użyć funkcji normalnej gęstości, aby uzyskać bardziej zróżnicowany teren. Poleciłbym jednak połączenie tych dwóch elementów.
Łączenie różnych funkcji hałasu Perlina to po prostu coś, z czym musisz się bawić i zobaczyć, co działa. Najlepiej jest skonfigurować środowisko, aby można było po prostu zmienić niektóre wartości i zamienić teren bez konieczności ponownego ładowania gry. Miłego eksperymentowania.