Implementacja mapy / terenu z różnymi wysokościami sąsiadujących płytek


10

Ahoj!

Szukam informacji o mapach kafelków, a raczej o tym, jak nazywany jest określony typ mapy kafelków.

Interesuje mnie rodzaj implementacji zastosowanej w potentacie rollercoastera lub serii gier potentata transportowego. Patrzyłem na teren pola wektorowego i mapę wysokości, ale nie jestem pewien, czy nadają się do tego, czego szukam rozwijać.

Trudno było znaleźć jakieś przyzwoite informacje, ponieważ większość ludzi nazywa je mapą kafelków izometrycznych, ale chcę stworzyć coś w 3D ze stałą perspektywą ortograficzną. Rozumiem, że podstawowe przechowywanie mapy kafelków nie ma nic wspólnego z tym, jak jest renderowana, ale nie zamierzam tworzyć mapy kafelków 2D, takich jak stare pokemony / gry zelda, a raczej diablo z możliwością włączenia wystające klify i pochyłe tereny.

Próbuję tylko znaleźć odpowiednie hasła do wyszukiwania w Google i Stackoverflow w poszukiwaniu zasobów, które pomogą mi zdecydować, którą ścieżkę wybrać.

Do tej pory udało mi się opracować podstawową mapę kafelków bez użycia komponentu wysokość / rok przechowywanego w VBO i renderowanego jako szkielet. Na razie wygląda to dobrze, ale przewiduję, że napotkam problemy podczas próby manipulowania jednym wierzchołkiem w celu tworzenia klifów i stoków bez wpływu na sąsiednią płytkę.

Czy jest jakiś konkretny typ wdrożenia, nad którym powinienem się zastanowić? Myślałem, że złamałem go, gdy znalazłem sporo, jeśli informacje o terenie pola wektorowego, ale nie jestem pewien, czy to przyniosłoby prawidłowe wyniki.

Jeśli ktoś może rzucić nieco światła na to, proszę, pomoc byłaby bardzo mile widziana :)

Aktualizacja

Dołączyłem obraz w celu dalszego wyjaśnienia, co chciałbym osiągnąć:

Mapa kafelków 2.5D

Obraz zapożyczony z Jak utworzyć nachylone (wysokość) płytki izometryczne

Ten obraz pokazuje rodzaj terenu, który chciałbym wygenerować, ale nie obejmuje „klifów” ani wystających typów terenu, które jestem zainteresowany modelowaniem. Rodzi to jednak kilka innych pytań, których nie rozważałem, a mianowicie;

  • Jak obchodzić się z „warstwami”, takimi jak woda (lewy górny róg zdjęcia), aby uwzględnić widoczny grunt pod wodą?
  • W jaki sposób zostałyby zaspokojone „krawędzie” mapy, aby ziemia / błoto były renderowane w celu przedstawienia świata jako niepłaskiej istoty?
  • Czy podstawowa pamięć tego rodzaju terenu może być wykorzystana do modelowania fizyki, takiej jak piłka staczająca się ze wzgórza lub prędkości ruchu gracza przemierzającego zbocze?

Wpadłem na pomysł, że każdą płytkę terenu można modelować za pomocą 8 wierzchołków, przy czym 4 główne wierzchołki pokrywają samą płytkę, a pozostałe 4 wierzchołki służą do modelowania boków / ścian każdej płytki. Dwa problemy, które widzę w tej implementacji, to to, że a) mapa świata jest zasadniczo podwojona ib) biorąc pod uwagę, że nie wszystkie płytki będą zawierać „ściany”, niektóre płytki będą miały zbędne wierzchołki, które nie zostaną użyte.

Chciałbym stworzyć edytor terenu, który pozwala na deformację każdego kafelka, a także umożliwia zmianę terenu podczas gry. To samo w sobie stawia dodatkowe pytania, takie jak; Czy można używać VBO do przechowywania i renderowania terenu podczas modyfikacji w locie, a także czy można modyfikować wierzchołki bez wpływu na sąsiednie płytki?

Mam wrażenie, że albo nadmiernie komplikuję, albo wpadam w paraliż analityczny, ponieważ zaniedbuję pisania jakiegokolwiek kodu, aby rozwiązać problem, nie mając jasnego pojęcia, jak osiągnąć to, czego chcę.

Znów, po prostu szukam w tym celu pchnięcia we właściwym kierunku. Czy istnieje konkretny typ implementacji mapowania terenu / terenu, który uwzględniałby deformację mapy 3D zarówno przez edytor map, jak i podczas gry, czy też muszę rzucić własną, że tak powiem? Nie próbuję tutaj wymyślać koła, ale staram się znaleźć jakieś zasoby, biorąc pod uwagę, że nie jestem pewien, czego szukać.

Jeśli ktoś może podać jakieś informacje, zasoby lub fragmenty kodu, byłoby to bardzo mile widziane, ponieważ chętnie ubrudzę sobie ręce i zacznę produkować coś innego niż płaski szkielet, który aktualnie posiadam.

Dziękuje za przeczytanie!

Odpowiedzi:


2

Gdybym był tobą, zajrzałbym do wokseli, a dokładniej renderowania kostek typu Minecraft . W przeciwieństwie do map wysokości mogą obsługiwać zwisy, jaskinie, budynki o wielu piętrach itp.

Przechowujesz swój teren w trójwymiarowej tablicy liczb całkowitych, w której liczby są mapowane na określony typ terenu: 0 = powietrze, 1 = brud, 2 = woda itp. Następnie, aby utworzyć siatkę do renderowania, należy utwórz twarze sześcianu dla każdego niepustego woksela.

Ten samouczek jest doskonałym wyjaśnieniem, jak to zrobić w C ++ za pomocą Ogre3D. Zakładam, że w OpenGL musiałbyś przejść nieco niżej.

Po utworzeniu kostek chcesz wygładzić krawędzie, aby utworzyć rodzaj płynnego terenu pokazanego na obrazie. Wierzę, że robi to PolyVox (także w C ++); możesz rzucić okiem na ich kod. Myślę, że zasadniczo robisz w 3D to, co obraz pokazuje w 2D: uśrednij otaczające pozycje sześcianu, aby wiedzieć, gdzie umieścić każdy wierzchołek.

EDYTOWAĆ:

  • Wygeneruj ściany dla kostek sąsiadujących z wodą, tak jakby kafelek wody był pusty, i renderuj ściany wodne w sposób przezroczysty.
  • Twarze na „krawędzi” mogą być generowane tak jak zwykłe twarze, jeśli uważasz woksele poza światem za puste.
  • Fizyka: Prawdopodobnie możesz podać renderowaną siatkę do silnika fizyki jako obiekt statyczny.
  • Edytor map: chcesz edytować podstawowe dane wokseli, a nie samą siatkę! (Siatka powinna odzwierciedlać dane, więc edycja wokseli powinna powodować zmiany w siatce.) Jeśli nie znasz, możesz poszukać Modelu, Widoku, Kontrolera (MVC).

Jeśli masz więcej pytań, zostaw komentarz. Witamy w gamedev.SE!


Jest to bardzo skomplikowane rozwiązanie dla stosunkowo prostego problemu. Wiele gier zrobiło to, o co prosi OP, bez złożoności wokseli.
Sean Middleditch

Zgadzam się, woksele mogą być skomplikowane. Czy mógłbyś zamieścić link do tych gier? Chcę usłyszeć, jak to zrobili.
Wackidev

Bawiłem się pomysłem używania wokseli. Czy ta implementacja sugerowałaby, że wszystkie kostki mają wymiary jednostkowe, czy może być wytłoczony pojedynczy sześcian? Domyślam się, że świat musiałby być przechowywany w warstwach, aby umożliwić wodę i inne płytki, które mogą „zachodzić” na płaszczyznę y.
CaptainRedmuff

Tak, zazwyczaj woksele mają rozmiar jednostkowy. Przypuszczam, że można je wytłaczać, ale myślę, że to tylko skomplikowałoby sprawę. Nie jestem pewien, czy rozumiem, co masz na myśli mówiąc o warstwach. Czy chodzi o płytki wodne o zmiennej wysokości?
Wackidev

Coś w tym stylu. Zastanawiałem się bardziej nad zdefiniowaniem „podłogi”, która mogłaby być wytłoczonym sześcianem, który miałby na wierzchu sześcian wody określony przez płaszczyznę, w której przecinają się one. Być może znów komplikuję sprawy. Przeczytam trochę więcej o wokselach i zobaczę, dokąd mnie to zaprowadzi.
CaptainRedmuff

6

To: http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png to przykład mapy, którą zrobiłem jakiś czas temu.

Miałem XML reprezentujący mapę i różne rodzaje kafelków. Każdy typ miałby kilka atrybutów:

  • Wysokość
  • Pozycja
  • Typ scalania: Jaki rodzaj scalenia tego kafelka zrobiłby ALL(jeśli powinien scalić się z dowolnym kafelkiem wokół niego), EQUAL(tylko scal z kafelkami tego samego typu), NONE(nigdy nie scalaj).
  • Scal wysokość: maksymalna wysokość stoków (dobra w przypadku nawisów), załóżmy, że chcesz, aby płytka łączyła się tylko z płytkami o tej samej wysokości lub różnicy 1, wartość byłaby równa.

Następnie przeczytałem wszystkie kafelki i utworzyłem je w scenie. Po pierwsze, biorąc pod uwagę pozycję. Każdy kafelek musiał wiedzieć, że jest sąsiadem, więc musiałem dwukrotnie przejść przez mapę, raz, aby wszystko stworzyć, i jeszcze raz, aby przesunąć każdy wierzchołek do właściwej pozycji.

Chociaż moje modele są heksami, koncepcja jest taka sama, potrzebujesz kostki do reprezentowania swojej płytki, a następnie przesuniesz wierzchołki podstawy na najniższy poziom i „wygładzisz” górę sześcianu z sześcianami wokół niego. Sprawdziłbyś również, czy dwie strony kostek zostały scalone, więc możesz po prostu usunąć tę stronę z kostki (jeśli nie są scalone, prawdopodobnie jest to klif lub coś takiego).

O fizyce zależy od celu. Jeśli robisz coś takiego jak rollercoaster potentat, tak naprawdę ich nie potrzebujesz. Możesz po prostu sprawdzić wysokość gracza między poszczególnymi płytkami i zdecydować o prędkości chodzenia. Możesz zrobić to samo dla obiektu, który porusza się sam (jak piłka), możesz sprawdzić płytki wokół (lub aktualny kąt płytki) i zdecydować o kierunku / prędkości. Jeśli potrzebujesz realistycznej fizyki (np. Grawitacji, tarcia itp.), Musisz użyć silnika fizyki i możesz użyć reprezentacji 3D kostki w silniku.

Warstwy są również możliwe, ale potrzebujesz czegoś takiego jak Minecraft (z wygładzaniem na kostkach w najwyższej warstwie). Jeśli potrzebujesz tylko warstw do wody, możesz mieć „źródło wody” na kafelku i mieć kod wypełniający każde miejsce wokół niego, które jest na tej samej wysokości lub mniejszej (rozwiązanie rekurencyjne dobrze by się tutaj mieściło).

Edytor terenu byłby również prosty, jeśli kod jest wystarczająco elastyczny, możesz zastosować przekształcenia do pojedynczego kafelka (tego, który zmieniasz) lub do listy kafelków (jeśli używasz „pędzla” do wybierz i przenieś je). Tego samego kodu można użyć do zmodyfikowania terenu w grze. I tak, możesz zmienić wierzchołki na VBO, można również zmieniać wierzchołki bez wpływu na inne (zależy to również od tego, jak kodujesz w ten sposób).


+1 Dziękujemy za wkład w to. Podnosisz dobrą rację na temat warstwowania w odniesieniu do „źródła wody”, którego wcześniej nie rozważałem. Zajmę się modyfikowaniem VBO w locie, skoro wiem, że jest to możliwe :)
CaptainRedmuff
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.