2009-09-19 7 views
14

Poszukuję algorytmów, które pozwolą mi wygenerować realistyczną mapę terenu 2D. Przez realistę rozumiem, że ta osoba uzna taką mapę za "normalną" mapę terenu, nie utworzoną sztucznie. Nie chcę tworzyć fotorealistycznej mapy. Po prostu coś podobnego do map, które można oglądać w atlasie geograficznym.Generowanie realistycznej mapy 2D

Do tej pory używam perlin noise dla mapy wysokości, a następnie dodaję jeziora, rzeki, góry, bagna i tak dalej. można spojrzeć jak to wygląda na zdjęciu poniżej:

Terrain map http://www.freeimagehosting.net/uploads/1f1e9372bf.png

nie jestem z niego zadowolony. Nie jest to realistyczne, ale sam nie mogę wymyślić czegoś lepszego. Czas nie jest sprawą, więc algorytmy mogą być ciężkie obliczeniowo.

Dzięki za poświęcony czas.

Po EDIT:

myślę Znalazłem jeden artykuł, który może być pomocny: http://portal.acm.org/citation.cfm?id=1255047.1255077

Jednak nie można uzyskać za darmo, więc ja wciąż szuka odpowiedzi lub pomysłów.

+4

Nie mogę znaleźć artykułu, który chciałem, ale w zasadzie używał on systemu wzgórz opartych na lokalizacji do generowania ładnych wysp. Jest to prawdopodobnie związane z tutaj: http://pcg.wikidot.com/articles Ale ja cba przeglądając je wszystkie. – Pod

+0

+1 za świetny link. Dzięki za zasoby Pod. Uważam, że są naprawdę pomocni. – Wodzu

+0

Nie powiedziałeś dlaczego nie jest to realistyczne, kwalifikujesz to, czego nie jesteś zadowolony z tych renderingów, rzek, granic, kształtów ... Nie podoba mi się stosunek zieleni do niebieskiego, zbyt dużo zieleni nie daje kontrastu, a rzeki są lo fi ... więc przynajmniej dodaj więcej wody lub informacji o wysokości, takich jak plaże, delty, szczyty itp., i więcej linii brzegowych. –

Odpowiedz

2

Teren jest tworzony przez mnóstwo różnych przyczyn w wielu różnych skalach czasowych. Aby naprawdę stworzyć realistyczny teren, musisz je zasymulować.

W "krótkim" okresie hydrosfera określa większość charakterystyk. Najprawdopodobniej możesz zacząć od terenu woksel/particle/heightmap/mesh zawierającego główne cechy (pasma górskie itp.) I potraktować je jako niezmienne, a potem poddać je procesowi z mnóstwem symulacji wody. Musisz obliczyć, gdzie będą rzeki i jeziora, jak będą one niszczyć podstawowy krajobraz i gdzie tworzą depozyty. Gdybym musiał to zakodować, prawdopodobnie zacznę od świata 3D wokseli.

To byłoby gigantyczne zadanie i jestem pewien, że istnieje wiele sztuczek dostępnych do generowania określonych typów terenu, które trwają milisekundy zamiast minut. Jakiego terenu szukasz? Górzysty? Nizinny? Uprzemysłowiony? Las? Pustynia? Archipelag?

Krótko mówiąc: jeśli chcesz terenu, który wygląda realistycznie dla ludzi (którzy w końcu są ekspertami od tego rodzaju rzeczy), musisz go stworzyć, symulując rzeczywiste procesy geologiczne.

5

Grałem wcześniej w generowanie terenu. Zakładając, że cel jest bitmapą, znalazłem sposób na zrobienie rzeczy jak rzeki i ogólnie sprawienie, żeby wyglądał lepiej: Erozja.

Po wygenerowaniu terenu innymi metodami należy go nieco zniszczyć: świat musi być wyrażony jako wysokość pikseli. Zrób miejsce na mapie i przenieś jednostkę wysokości do najniższego sąsiada. Przesuń kursor do tego sąsiada i powtarzaj, aż się nie poruszy. Powtórz dla innych pikseli.

Aby liczba rzek była taka sama, ile razy przekraczasz położenie, przesuwając bity w dół. Miejscami najbardziej dotkniętymi są rzeki.

Kontynuacja: Nie erodowałem każdego piksela, a po prostu dużą liczbę losowych pikseli, dopóki nie został wystarczająco zniszczony. Powodem ich erozji jest to, że przenosi ona bity i wypełnia dziury. Bez tego nie może być żadnych rzek, ponieważ nie będzie martwych, które zatrzymują przepływ - płynące piksele wypełniają wszelkie małe dziury i robią działające drogi wodne.

Przepraszam, nie mogę podać żadnych próbek, to było wiele lat temu i podczas gdy stary kod jest prawdopodobnie gdzieś gdzie nie wiem gdzie szukać.

+0

Dzięki Loren. Nie jestem pewien, czy rozumiem cię poprawnie. Czy muszę zerwać każdy piksel na mapie? Jest to trochę porównywalne do przykładu, który zaczyna się na szczycie lokalnego wzgórza, a nie zejścia w danym kierunku. Przez "schodzenie" rozumiem szukanie piksela sąsiada mniejszą lub równą wysokością. I kontynuuj, dopóki warunek nie zostanie naruszony. To właśnie teraz robię (ale nie obniżam wysokości) i możesz zobaczyć wyniki. Byłoby wspaniale, gdybym mógł zobaczyć kilka zrzutów ekranu z twojego generatora. – Wodzu

+0

@Wodzu, myślę, że sugestia Lorena jest właściwym kierunkiem dla ciebie. I nie, nie musisz wymazywać każdego piksela; ale powinieneś poruszyć trochę (przesuwać je, osad jest również ważny dla kształtu). Zobacz http://markjstock.org/pages/builder.html obraz dla "erode". – Unreason

1

Moja metoda w Terra3D polegała na generowaniu losowych wartości wysokości, a następnie wykonywaniu 3 wygładzających przejść z niewielkim przekształceniem zapisanym w algorytmie. Zmiana kształtu powoduje, że teren pod linią wody przesuwa się nieco w dół, a wszystko powyżej linii wody przesuwa się nieco w górę. Efektem jest jednak wiele wzgórz i małych jezior. A może nie jest to dokładnie to, czego szukasz.

Jednak nie jestem przekonany, że szef odpowiedzialny za moją metodę nie może zostać wykorzystany do uzyskania tego, co chcesz. Możesz po prostu napisać kilka warunków do algorytmu przekształcania/wygładzania. Na przykład zmniejszenie stopnia wygładzenia terenu na wyższych wysokościach spowoduje bardziej efekt skalistej góry. A następnie napisanie bardziej zaangażowanego algorytmu wygładzającego (lub gaussowskiego), który rozciąga się dalej dla niższych wysokości, może zbierać te jeziora razem, tworząc naturalne rzeki.

Oto kod do generowania terenu w Terra3D w przypadku jesteś zainteresowany:

// GENERATE TERRAIN 
    for (i = 0; i < MAX; i++) 
    {  
    for (i2 = 0; i2 < MAX; i2++) 
    { 
     if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10) 
     field[i][i2].y=0; 
     else 
     field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05; 
    } 
    } 

    // SMOOTH/RESHAPE TERRAIN 
    for (int cnt = 0; cnt < 3; cnt++) 
    { 
    for (int t = 1; t < MAX-1; t++) 
    { 
     for (int t2 = 1; t2 < MAX-1; t2++) 
     { 
     field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4; 

     if (cnt == 0) 
     { 
      if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2; 
      else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5; 
     } 
     } 
    } 
    } 

To kod niechlujstwa, że ​​napisałem około 10 lat temu. Terra3D był długim procesem eksperymentowania i grzebania w ciemności, aby uzyskać efekt, którego szukałem. Ale może to pomoże.

+1

O mój boże, że menu na twojej stronie było denerwujące! –

+1

Ach tak, stworzyłem to menu, gdy miałem 18 lat. Haha, po prostu trochę zmniejsz głośność. ;) –

+0

Dzięki Steve za zainteresowanie i za kod. Nadal pracuję nad generatorem! Twój kod jest dobry na trójwymiarowy symulator lotu, ponieważ w tego typu grach użytkownik jest zadowolony z posiadania jezior i gór. Właściwie nie przejmuje się zbytnio strukturą terenu i jego logiką. Jednak staram się osiągnąć coś innego. Jeśli otworzysz geograficzny album i spojrzysz na teren, zobaczysz, że jest on losowy, ale spełnia także pewne zasady. f.e. rzeka spada z gór do jakiegoś jeziora lub morza, lub góry są ułożone w grona. – Wodzu

1

Wiem, że to naprawdę stare pytanie, ale odpowiadam na nie dla przyszłych ludzi szukających dobrego generatora terenu, tak jak ja. Skorzystaj z darmowej wersji World Machine 2. Jest to generator terenu, który może wykonać dokładnie to, o co prosisz i nie tylko. Został on użyty przez profesjonalistów do generowania obrazów, trójwymiarowego terenu świata, a nawet do map takich, jak sugerujesz. Zwróć uwagę, że darmowa wersja jest przeznaczona tylko do niekomercyjnych zastosowań.

+0

Nawiasem mówiąc, witryna www.world-machine.com –

+0

Bezpłatne jest bardzo ograniczone na rozmiar mapy ORAZ generuje mapę tylko raz (lub ile razy naciskasz przycisk "generuj"), co nie jest zbyt satysfakcjonujące, gdy chcesz wygenerować losowo mapę w swojej aplikacji :) –

+0

Dziękuję Felipe M. Pytanie jest stare, ale nadal jestem zainteresowany wszelką pomocą. Daję ci +1 za odpowiedź, ponieważ generator terenu, dla którego dałeś połączenie, tworzy naprawdę ładny teren. Jednak ten teren wciąż nie ma żadnego logicznego sensu;) Ok, może wytworzyć ci górę i odrobinę wody. Ale generuje "gromady" tych samych obiektów. Gdzie są jeziora, rzeki i inne góry? Te "obiekty" muszą być umieszczone na mapie w naturalny sposób, tak jak zrobi to matka natura :) Na przykład: rzeka spływa z góry na jezioro. – Wodzu