Status serwera H&H widoczny tylko dla zalogowanych użytkowników.



  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Generator terenu.



#16
Myślę, że generacja rzek metodą "góry>morze" jest najlepszą z możliwych. Wink

W swoim własnym generatorze świata generacja rzek działa tak:
1. Główny Random generuje nowy seed, którzy służy do utworzenia nowego Random do generacji rzek
2. Wybierany jest losowy punkt w danym supergrid
3. Sprawdzamy, czy w wybranym punkcie nie ma jeziora/morza/innej rzeki i czy znajduje się na odpowiedniej wysokości, jeśli nie wracamy do punktu 2.
4. Za pomocą A*, gdzie heurystyką jest wysokość schodzimy w dół aż do morza/jeziora/innej rzeki.
5. Jeśli finalna wielkość rzeki jest za mała, wracamy do punktu 2
6. Nanosimy zmiany na mapę
7. Wracamy do punktu 2 jeśli chcemy wygenerować więcej rzek

Metoda taka działa świetnie i jest stosunkowo szybka, zwykle generuje realistycznie wyglądające rzeki. Jedyną wadą jest to, że stosunkowo ciężko jest generować rzeki wykraczające poza dany supergrid, ale w przypadku generacji świata kawałkami 2500X2500 lub 5000X5000 praktycznie nie jest to zauważalne. Naturalnie jest to generacja z myślą o grze MMO, nie nadaje się do gry w której trzeba na bieżąco generować nowy teren (choć istnieje naturalnie możliwość powiększenia świata).

Tu masz przykład (dla większej widoczności zostawiłem włączoną tylko generację heightmapy, biomów podstawowych opartych na wysokości oraz rzek, 2500X2500 wygenerowane w 27 sekund):

[Obrazek: rd4c.png]



Odpowiedz



#17
Mój algorytm produkcji rzeki jest prawie identyczny, ale widzę jeden problem. A* wymaga punktu startowego i punktu docelowego, w jaki sposób określasz ten drugi? Czy jest jakaś wariacja A*, która nie wymaga punktu docelowego? U mnie wygląda to tak, że klasyfikuję wybrzeża (czyli każdy wodny tile który sąsiaduje z lądem) w tabeli możliwych zakończeń rzek a potem dla każdego wylosowanego "źródła" szukam najbliższego możliwego punktu docelowego. Przy czym jest to do dopracowania bo czasem (rzadko) zdarza się, że rzeka spływa z góry po czym ją okrąża bo akurat tak wylosowało zakończenie rzeki, mimo iż po tej drugiej, bardziej naturalnej stronie owej góry też jest punkt docelowy dla rzeki ale był akurat o te 2 kratki dalej więc nie został wybrany.

Faktycznie jest to też szybkie, u mnie generacja 20-30 rzek na terenie 1800x1800 zajmuje jakieś 15-35s.



Odpowiedz



#18
U mnie nie ma punktu docelowego - mój A* dąży do tego, aby zejść jak najniżej (ale z racji tego jak ten algorytm działa w przypadku, w którym rzeka startuje w dolinie jest ona w stanie iść "pod górę", choć po przeniesieniu świata z 3d do 2d tego nie widać) - jest to kwestia napisania odpowiedniej heurystyki. Punktem końcowym jest pierwsze napotkane pole z biomem morze/jezioro/rzeka.

Z racji tego, jak mój generator generuje teren mogą wystąpić "morza" liczące kilka pól wielkości - nauczyłem algorytm sobie z tym radzić ustalając minimalną wielkość akwenu do jakiego trafić może rzeka.

Edit: Generacja 17 rzek na 2500X2500 zajmuje średnio 4,5 sekundy. Sporo zależy od czynnika losowego, niektóre generują się w mniej niż ułamek sekundy a innym zajmuje to nawet 2-3 sekundy.



Odpowiedz



#19
Twojemu rozwiązaniu bliżej do algorytmu Dijsktry. Podejrzewam, że to co nazywasz heurystyką jest zwykłą wagą tile'a.

Kolejna sprawa to podawanie czasu działania algorytmu. Nie ma to sensu, co komputer to inna wartość, dlatego podaje się złożoność obliczeniową.

To takie moje nie wnoszące w rozmowę grosiki Wink.
p
o
n
i
e
w
a
ż

d
ł
u
g
a

s
t
o
p
k
a

t
o

j
e
s
t

t
o



Odpowiedz



#20
Mogę ten kod pokazać, proszę: http://pastebin.com/KkjPeJeQ.

Generacja rzeki zwraca true lub false, ponieważ dzięki temu mogę przerwać loop generacji rzek w razie zbyt wielu niepowodzeń i kontrolować, czy rzeka została wygenerowana. Złożoność obliczeniowa całej generacji jest trudna do określenia, ponieważ dużo zależy od czynnika losowego, choć generacja pojedynczej rzeki zwykle trwa od 5 do 200 ms (zazwyczaj bliżej pierwszej z tych wartości).



Odpowiedz



#21
Ma ktoś jakiś pomysł na generację lasów?

Jeden pomysł, który mi się podoba, to szybka symulacja lasu na przestrzeni kilku wieków. Stawiamy pojedyncze sztuki drzew w kilku miejscach i symulujemy ich zachowanie na przestrzeni kilku stuleci - drzewa rozmnażają się i rozsiewają według narzuconych zasad. Metoda fajna dla zaawansowanych systemów botanicznych, gdzie mamy różne typy drzew i roślinności i zmierzamy ku maksymalnemu odtworzeniu realnego świata. Więcej tutaj: http://procworld.blogspot.com/2011/05/forest.html
Kiedyś chciałbym taką metodę zastosować, ale nie pasuje ona do aktualnego konceptu.

Myślałem nad tym, żeby wygenerować lasy za pomocą perlina, gdzie wartości powyżej pewnej granicy będą wyznaczały teren leśny a poniżej tej wartości - teren bez lasu. Potem czynniki takie jak wysokość i wilgoć decydowały by o zagęszczeniu lasu. Nie jestem pewien jak to wyjdzie ale pewnie to wypróbuję jeśli nie znajdę nic lepszego.

Pozostaje aspekt techniczny ale mam chyba nienajgorszy nań pomysł. Generator zapisuje drzewa (i pozostałe obiekty) tak samo jak teren ale w osobnym pliku. Serwer odczytuje plik z obiektami dynamicznie, tak samo jak teren - ładuje chunki gdy są potrzebne i zwalnia pamięć gdy nie są. Żeby nie obciążać serwera koniecznością zapisywania zmian do owego pliku na bieżąco (przepisywanie całego pliku danych z usunięciem 4 bajtów za każdym razem jak ktoś zetnie drzewo nie jest zbyt efektywne) serwer będzie każde "zniknięte" drzewo zapisywał w osobnej tabeli a przy wyłączaniu, korzystając z tej tabeli, nadpisze istniejący plik z obiektami pozbywając się tych, których już być nie powinno. Rozwiązuje to problem kosztem wydłużenia czasu zamykania serwera o kilka ułamków sekund i kosztem tego, że w przypadku crashu serwera ścięte już raz drzewa zostaną przywrócone. Ale i temu być może można zaradzić robiąc wspomnianą procedurę okresowo co jakiś czas, zamiast tylko przy wyłączaniu serwera.



Odpowiedz



#22
Jakbym robił lasy, to poprzez podział mapy na małe segmenty (w stylu 10X10) , określenie jaki % tego obszaru zajmuje las, a potem umieszczenie tam danyProcent*iloscDrzew drzew. W jaki sposób? Poprzez wybieranie losowych miejsc w tym obszarze i sprawdzanie, czy pobliskie drzewa nie są zbyt blisko/w tym samym miejscu.



Odpowiedz



#23
Mój pomysł na roślinność ogólnie polega na wykorzystaniu statystyki. Opisujesz gatunek rośliny atrybutami: klimat, ukształtowanie terenu, wilgotność, gęstość porastania, pospolitość, itp.. Przypisujesz tile'om wartości od 0 (brak szans na wyrośnięcie) do 1 (idealne miejsce dla rośliny) na podstawie wartości reprezentowanych przez dany tile i losujesz wystąpienie rośliny na podstawie tej wartości + unikalnych wartości rośliny.

To tylko teoria, której nie sprawdziłem w praktyce, ale moim zdaniem na to szansę na wygenerowanie złożonej warstwy flory.
p
o
n
i
e
w
a
ż

d
ł
u
g
a

s
t
o
p
k
a

t
o

j
e
s
t

t
o



Odpowiedz



#24



Odpowiedz



Digg   Delicious   Reddit   Facebook   Twitter   StumbleUpon  


Użytkownicy przeglądający ten wątek:
1 gości