Mappa delle tessere / implementazione del terreno con altezze diverse delle tessere vicine


10

Ahoy!

Sto cercando alcune informazioni sulle mappe delle piastrelle, o meglio, come viene chiamato un tipo specifico di mappa delle tessere.

Sono interessato al tipo di implementazione utilizzata nel magnate sulle montagne russe, o alla serie di giochi del magnate dei trasporti e ho cercato il terreno del campo vettoriale e il terreno della mappa di altezza, ma non sono sicuro che siano adatti a ciò che sto cercando sviluppare.

È stata una lotta trovare informazioni decenti dato che la maggior parte delle persone si riferisce ad essa come una mappa di piastrelle isometriche, ma sto cercando di creare qualcosa in 3D con una prospettiva ortografica fissa. Capisco che l'archiviazione di base della mappa delle tessere non ha nulla a che fare con il modo in cui viene renderizzata, ma non sto cercando di creare una mappa delle tessere 2D come i giochi pokemon / zelda della vecchia scuola, più lungo le linee di diablo con la possibilità di includere scogliere a strapiombo e terreno in pendenza.

Sto solo cercando di trovare i termini giusti per cercare su Google e StackOverflow risorse per aiutarmi a decidere quale percorso procedere.

Finora sono riuscito a perfezionare una mappa di tessere di base senza utilizzare il componente altezza / y memorizzato in un VBO e renderizzato come wireframe. Fin qui sembra tutto a posto, ma immagino che incontrerò problemi quando provo a manipolare un singolo vertice per creare scogliere e pendenze senza influenzare una piastrella vicina.

Esiste un tipo specifico di implementazione che dovrei esaminare? Pensavo di averlo risolto quando ho trovato una discreta quantità di informazioni su un terreno di campo vettoriale, ma non sono sicuro che questo avrebbe prodotto i risultati corretti.

Se qualcuno può farmi luce su questo per me, l'aiuto sarebbe molto apprezzato :)

Aggiornare

Ho incluso un'immagine per ulteriori chiarimenti su ciò che vorrei ottenere:

Mappa delle tessere 2.5D

Immagine presa in prestito da Come creare tessere isometriche inclinate (in altezza)

Questa immagine mostra il tipo di terreno che vorrei generare, ma non include le "scogliere" o i tipi di terreno a strapiombo che sono interessato alla modellazione. Tuttavia solleva alcune altre domande che non avevo considerato, vale a dire;

  • Come verrebbero gestiti "strati" come l'acqua (in alto a sinistra dell'immagine) per includere il terreno visibile sotto l'acqua?
  • Come verrebbero soddisfatti i "bordi" della mappa in modo che la terra / fango venisse rappresentata per rappresentare il mondo come un'entità non piana?
  • La memoria sottostante per questo tipo di terreno potrebbe essere usata per modellare la fisica come una palla che rotola giù da una collina o la velocità di movimento di un giocatore che attraversa una pendenza?

Ho avuto l'idea che ogni piastrella del terreno potesse essere modellata con 8 vertici in cui i 4 vertici principali coprivano la tessera stessa e i restanti 4 vertici sono usati per modellare i lati / le pareti di ogni piastrella. I due problemi che vedo con questa implementazione sono che a) la mappa del mondo è essenzialmente raddoppiata per dimensione eb) dato che non tutte le tessere includeranno "muri", alcune tessere finiranno con vertici ridondanti che non vengono utilizzati.

Vorrei creare un editor del terreno che consenta la deformazione di ogni tessera e includa la possibilità di cambiare il terreno durante il gioco. Questo di per sé pone ulteriori domande come; È possibile utilizzare un VBO per archiviare e rendere il terreno mentre viene modificato al volo e inoltre, è possibile modificare i vertici senza influire sulle tessere vicine?

Ho l'impressione che stia complicando troppo le cose o incorrendo in analisi-paralisi in quanto sto trascurando di scrivere qualsiasi codice per risolvere il problema senza avere una chiara idea di come raggiungerei ciò che voglio.

Ancora una volta, sto davvero cercando una spinta nella giusta direzione con questo. Esiste un tipo specifico di implementazione di tilemap / terreno in grado di far deformare una mappa 3D sia da un editor di mappe che durante il gioco o devo fare il mio, per così dire? Non sto cercando di reinventare la ruota qui, ma sto lottando per trovare risorse dato che non sono sicuro di cosa cercare.

Se qualcuno è in grado di fornire informazioni, risorse o frammenti di codice, questo sarebbe molto apprezzato in quanto sono impaziente di sporcarmi le mani e iniziare a produrre qualcosa di diverso dal wireframe piatto che ho attualmente.

Grazie per aver letto!

Risposte:


2

Se fossi in te, esaminerei i voxel, in particolare il rendering del cubo di tipo Minecraft . A differenza delle altezze, possono gestire sporgenze, caverne, edifici a più piani, ecc.

Memorizzeresti il ​​tuo terreno in un array 3D di numeri interi, dove i numeri sono mappati su un certo tipo di terreno: 0 = aria, 1 = sporcizia, 2 = acqua, ecc. Quindi, per creare la mesh da renderizzare, dovresti crea le facce di un cubo per ogni voxel non vuoto.

Questo tutorial è una grande spiegazione di come farlo in C ++ usando Ogre3D. Presumo che dovresti andare un po 'più a basso livello in OpenGL.

Dopo aver creato i cubi, ti consigliamo di smussare i bordi per creare il tipo di terreno fluido mostrato nell'immagine. Credo che PolyVox (anche in C ++) lo faccia; potresti dare un'occhiata al loro codice. Penso che fondamentalmente fai in 3D ciò che l'immagine mostra in 2D: media delle posizioni del cubo circostante per sapere dove posizionare ciascun vertice.

MODIFICARE:

  • Genera le facce per i cubi adiacenti all'acqua come se la piastrella fosse vuota e rendi le facce dell'acqua trasparenti.
  • Le facce sul "bordo" possono essere generate come facce normali, se si considerano vuoti i voxel fuori dal mondo.
  • Fisica: puoi probabilmente alimentare la mesh renderizzata al tuo motore fisico come oggetto statico.
  • Editor di mappe: vorresti modificare i dati voxel sottostanti, non la mesh stessa! (La mesh dovrebbe rispecchiare i dati, quindi la modifica dei voxel dovrebbe produrre cambiamenti nella mesh.) Potresti cercare Model, View, Controller (MVC) se non ne hai familiarità.

Se hai altre domande, non esitare a lasciare un commento. Benvenuto su gamedev.SE!


Questa è una soluzione molto complicata che per un problema relativamente semplice. Molti giochi hanno fatto ciò che l'OP chiede senza la complessità dei voxel.
Sean Middleditch,

Sono d'accordo che i voxel possono essere complicati. Vorresti collegarti a questi giochi? Sono interessato a sapere come hanno fatto.
Wackidev,

Stavo giocando con l'idea di usare voxel. Questa implementazione implicherebbe che tutti i cubi hanno dimensioni unitarie o che un singolo cubo potrebbe essere estruso? Immagino che il mondo debba essere immagazzinato in strati per consentire l'acqua e altre tessere che potrebbero "sovrapporsi" lungo il piano y.
CaptainRedmuff,

Sì, in genere i voxel hanno dimensioni unitarie. Suppongo che si possano estrudere, ma penso che ciò renderebbe il tutto più complicato. Non sono sicuro di capire cosa intendi per livelli. Ti riferisci a piastrelle d'acqua di altezza variabile?
Wackidev,

Qualcosa del genere. Stavo pensando di più alla semplice definizione di un "pavimento" che potrebbe essere un cubo estruso che ha in cima un cubo d'acqua definito dal piano in cui i due si intersecano. Forse ho di nuovo complicato le cose. Farò ancora qualche lettura sui voxel e vedrò dove mi porta.
CaptainRedmuff,

6

Questo: http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png è un esempio di una mappa che ho fatto qualche tempo fa.

Avevo un XML che rappresentava la mappa e diversi tipi di tessere. Ogni tipo avrebbe alcuni attributi:

  • Altezza
  • Posizione
  • Tipo di unione: quale tipo di unione farebbe questa tessera ALL(se dovesse fondersi con una tessera attorno ad essa), EQUAL(unire solo con tessere dello stesso tipo), NONE(mai unire).
  • Unisci altezza: l'altezza massima per le pendenze (buona per sporgenze), supponiamo che tu voglia unire le piastrelle solo con piastrelle della stessa altezza o con una differenza di 1, il valore sarebbe uno.

Vorrei quindi leggere tutte le tessere e crearle nella scena. Innanzitutto tenendo conto solo della posizione. Ogni tessera doveva sapere che era vicina quindi dovevo passare due volte sulla mappa, una volta per creare tutto, e un'altra volta per spostare ciascun vertice nella giusta posizione.

Sebbene i miei modelli siano esadecimali, il concetto è lo stesso, avresti bisogno di un cubo per rappresentare la tua piastrella, quindi sposteresti i vertici di base al livello più basso e "levigerei" la parte superiore del cubo con i cubi attorno. Verifichi anche se due lati dei cubi sono stati uniti in modo da poter semplicemente rimuovere quel lato dal cubo (se non sono uniti è probabilmente una scogliera o qualcosa del genere).

A proposito di fisica, dipende dal tuo obiettivo. Se stai facendo qualcosa come un magnate sulle montagne russe non hai davvero bisogno di loro. Puoi semplicemente controllare l'altezza del giocatore tra ogni tessera e decidere la velocità di camminata. Potresti fare lo stesso per un oggetto che si muove da solo (come la palla), puoi controllare le tessere intorno (o l'angolo attuale delle tessere) e decidere una direzione / velocità. Se hai bisogno di una fisica realistica (come gravità, attrito, ecc.) Dovresti usare un motore fisico e potresti usare la rappresentazione 3D del cubo nel motore.

I livelli sono anche possibili, ma avresti bisogno di qualcosa come Minecraft (con levigatura sui cubi nel livello più alto). Se hai solo bisogno di strati per l'acqua, puoi avere una "sorgente d'acqua" su una piastrella e avere il tuo codice riempire ogni spazio intorno alla stessa altezza o inferiore (una soluzione ricorsiva si adatterebbe bene qui).

Un editor del terreno sarebbe anche semplice, se il tuo codice è abbastanza flessibile, puoi applicare le trasformazioni a una singola tessera (quella che stai cambiando) o a un elenco di tessere (se stai usando un 'pennello' per selezionali e spostali). Lo stesso codice può essere utilizzato per modificare il terreno del gioco. E sì, puoi cambiare i vertici sul VBO, è anche possibile cambiare i vertici senza influire sugli altri (dipende anche dalla tua codifica in quel modo).


+1 Grazie per il tuo contributo in merito. Sollevi un buon punto sulla stratificazione per quanto riguarda la "sorgente d'acqua" che non avevo mai considerato prima. Esaminerò al volo la modifica del VBO ora che so che è possibile :)
CaptainRedmuff,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.