Determinare se la struttura creata dal giocatore corrisponde a un modello in un gioco basato su blocchi 3D


8

Disclaimer: questa è una di quelle temute domande in stile Minecraft, ma penso che sia più una domanda su strutture di dati e algoritmi

Sono davvero nuovo alle strutture di dati 3D e mi chiedo quale sia il modo migliore per archiviare e abbinare una struttura di blocchi 3D.

In questo momento, il giocatore è in grado di posizionare blocchi in qualsiasi spazio arbitrario e quando questi blocchi corrispondono a una struttura predefinita si verifica un evento. Il modo in cui lo sto facendo attualmente è quando un giocatore posiziona un blocco il gioco controlla ricorsivamente ogni blocco adiacente per trovare il blocco con la coordinata x, y, z più bassa e rende quel blocco il blocco radice. Quindi controlla il resto dei blocchi, in base al blocco radice, per assicurarsi che corrispondano a un determinato modello. Il problema è che quando il modello diventa più complicato, anche il mio codice (terribilmente inefficiente).

Sto pensando che il modo migliore per farlo sia quello di memorizzare un qualche tipo di matrice che definisce la struttura e quindi abbinare contro la matrice ogni volta che un giocatore piazza un blocco. Esistono già strutture / algoritmi di dati che corrisponderebbero a questo tipo di problema?


1
Ad esempio, stai pensando a come modellare le strutture come un portale Minecraft?
deceleratedcaviar

1
@Daniel In realtà, immagino che sarebbe un buon esempio. Tuttavia, il mio obiettivo sarebbe quello di avere una struttura arbitrariamente grande / complessa. I portali sono piuttosto semplici.
WillP,

1
Non una risposta, ma solo un pensiero: se le strutture diventano arbitrariamente grandi e l'elenco delle strutture target (che devi cercare per trovare una corrispondenza) diventa incredibilmente grande, questo diventa un problema di riconoscimento del modello, come riconoscere il testo o il discorso. Quindi ti allontani dal confronto della forza bruta verso metodi statistici come i modelli di Markov nascosti addestrati sulle tue strutture bersaglio. Sarebbe così bello.
Pieter Müller,

@Harikawashi Oh amico, sarebbe fantastico. Anche se il mio obiettivo non è qualcosa di astronomicamente grande, posso farlo comunque solo per giocarci. Grazie!
WillP

Risposte:


10

Ad essere sincero, prenderei la soluzione semplice.

Crea una matrice che definisce la struttura. Ogni volta che un blocco viene modificato, prova ad applicare quella matrice a tutte le posizioni che potrebbero aver creato la nuova struttura. Saranno posizioni in larghezza * profondità * in altezza, dal momento che il giocatore potrebbe aver finito qualsiasi punto della struttura, ma non dovrebbe essere troppo male perché la maggior parte di queste posizioni uscirà presto quando il primo controllo fallisce.

Fondamentalmente, hai una matrice 3d e la stai confrontando con un'altra matrice 3d, con una serie di offset.

Da qui ci sono un sacco di ottimizzazioni totalmente opzionali che potresti fare. Ad esempio, se la tua struttura è estremamente scarsa - ovvero il giocatore sta costruendo un'alta torre con una sfera in alto, ma non ti importa se il fondo della torre è circondato da alberi - potresti trasformarlo in un elenco di blocchi anziché una matrice. (Genererei l'elenco dalla matrice - la matrice sarà molto più semplice da gestire direttamente.)

Se vuoi essere super intelligente, spezza la struttura in blocchi. Se sai che il giocatore ha appena cambiato il blocco 1,2,3 e sai che posizionare la tua struttura alle coordinate 0,0,0 richiederebbe il blocco 1,2,3 per essere ossidiana e il blocco 1,2,3 è legno , quindi non è nemmeno necessario provare il blocco 1,2,3. Genera tutti i possibili offset per la struttura dato che il giocatore ha appena piazzato un tipo specifico di blocco. Quindi, quando il giocatore piazza quel blocco, basta controllare le possibili compensazioni pregenerate.

Ma, sul serio, questa è tutta ottimizzazione. Crea una matrice, quindi confronta la tua matrice con lo stile di forza bruta mondiale. Supponendo che tu stia realizzando qualcosa di Minecrafty, le persone in realtà non posizionano tutti quei blocchi, al massimo pochi blocchi ogni secondo. A meno che tu non abbia centinaia di enormi strutture, sarai in grado di testarlo facilmente.


3
Hai ragione. La forzatura bruta non dovrebbe davvero essere un grave problema di prestazioni. Mi sento come se fossi caduto nella trappola dell'ottimizzazione prematura. Grazie per la tua comprensione.
WillP,

0

Bene, ti viene in mente un problema interessante. Suggerirei qualcosa di simile al seguente: usa i tuoi blocchi come pixel e fai un rilevamento delle collisioni per / pixel, dove tutti i blocchi devono corrispondere per restituire una vera collisione.

Funzionerebbe bene, tuttavia assicurati di farlo solo quando cambiano oggetti / blocchi. Quindi consiglierei un semplice sistema di eventi per passare una modifica a un controllo oggetti, che può certamente usare il tuo algoritmo. Che quindi farebbe qualsiasi cosa tu voglia fare quell'oggetto. Inoltre consiglierei di controllare l'altezza e la larghezza, prima di eseguire l'algoritmo, perché se non è abbastanza alto / è troppo alto ovviamente non corrisponderà.

Per quanto riguarda una struttura di dati, farebbe un vettore semplice, o forse una struttura di dati personalizzata.

Domanda interessante.

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.