Domanda

Ho iniziato a leggere nel materiale su Wikipedia, ma mi sento ancora come se non capisco come una scena funziona grafico e come può fornire benefici per un gioco.

  • Che cosa è un grafico scena nel contesto dello sviluppo motore di gioco?
  • Perché dovrei voler implementare uno per il mio motore di gioco 2D?
  • Fa l'utilizzo di uno stand grafo della scena come alternativa ad un sistema di un'entità classico con un gestore di entità lineare?
È stato utile?

Soluzione

Che cosa è un grafico scena? Un Scene Graph contiene tutte della geometria di una particolare scena. Sono utili per rappresentare traduzioni, rotazioni e scale (insieme ad altri affine trasformazioni ) degli oggetti relativa l'altro.

Per esempio, si consideri un serbatoio (tipo con tracce e una pistola). Scena può avere più serbatoi, ma ognuno essere orientati e posizionati in modo diverso, con ciascuno che la torretta ruotata per diversi azimut e con un diverso elevazione pistola. Invece di capire esattamente come la pistola deve essere posizionato per ogni serbatoio, è possibile accumulare trasformazioni affini mentre attraversate il grafico scena per posizionare correttamente. Rende calcolo di queste cose molto più facile.

2D scena Grafici: L'uso di un grafico scena 2D può essere utile se il contenuto è sufficientemente complesso e se gli oggetti hanno un numero di componenti secondari non rigidamente fissato al corpo più grande. In caso contrario, come altri hanno detto, è probabilmente eccessivo. La complessità delle trasformazioni affini in 2D è un po 'meno rispetto al caso 3D.

lineare Ente Responsabile: Io non sono chiare su esattamente che cosa si intende per un lineare entità responsabile , ma se si sta riferendo ad appena tenere traccia di dove le cose sono posizionati nella scena, allora grafici di scena può rendere le cose più facile se non ci è un alto grado di dipendenza spaziale tra i vari oggetti o sub-oggetti nella scena.

Altri suggerimenti

Che cosa è un grafico scena del gioco contesto di sviluppo del motore?

Beh, è ??un po 'di codice che ordina attivamente il tuo gioco di oggetti nello spazio gioco in un modo che lo rende facile da rapidamente trovare quale gli oggetti sono attorno a un punto nello spazio di gioco.

In questo modo, è facile:

  1. trova rapidamente quali oggetti sono in vista della telecamera (e inviare solo loro per le schede grafiche, rendendo il rendering molto veloce)
  2. trovare rapidamente gli oggetti vicino al giocatore (e applicare controlli di collisione al solo quelli)

E altre cose. Si tratta di permettere rapida ricerca nello spazio. Si chiama "spazio di partizionamento". Si tratta di divide et impera.

Perché dovrei voler implementare uno per il mio motore di gioco 2D?

Questo dipende dal tipo di gioco, più precisamente sulla struttura del vostro spazio di gioco.

Ad esempio, un gioco come Zelda potrebbe non avere bisogno di tali tecniche se è abbastanza veloce per test di collisione tra tutti gli oggetti sullo schermo. Tuttavia si può facilmente essere davvero molto lento, quindi la maggior parte delle volte si almeno impostare un grafo della scena (o partizione spazio di qualsiasi genere) ad almeno sapere che cosa è intorno a tutti gli oggetti in movimento e le collisioni di prova solo su quegli oggetti.

Quindi, che dipende. La maggior parte del tempo è richiesto per motivi di prestazioni. Ma l'attuazione del vostro partizionamento spazio è totalmente relativa al modo in cui il vostro spazio gioco è strutturato.

Fa l'utilizzo di uno stand scene graph come alternativa a un ente classico sistema con un gestore di entità lineare?

No.

In qualunque modo di gestire la vita Il vostro gioco entita, lo spazio-partizione / scena-grafico è lì solo per consentire di cercare rapidamente oggetti nello spazio, né più né meno. La maggior parte del tempo sarà un oggetto che ha alcuni slot di oggetti, corrispondenti a diverse parti dello spazio di gioco e in tali slot sarà oggetti che sono in quelle parti. Può essere piatta (come un paravento 2D a 2 o 4), oppure può essere un albero (come albero binario o quadtree, o qualsiasi altro tipo di albero) o qualsiasi altra struttura di ordinamento che limiti il ??numero di operazioni è necessario eseguire per ottenere alcune informazioni relative allo spazio.

Nota una cosa:

In alcuni casi, è anche bisogno di diversi sistemi di partizione spazio separato per scopi diversi. Spesso un "grafo della scena" è di circa il rendering quindi è ottimizzato in un modo che dipende da punto di vista del giocatore e di scopo è quello di permettere la raccolta rapida di un elenco di oggetti per rendere di inviare alla scheda grafica. Non è proprio adatto per eseguire ricerche di oggetti intorno a un altro oggetto e che lo rende difficile da usare per il rilevamento preciso di collisione, come quando si utilizza un motore fisico. Quindi, per l'aiuto, si potrebbe avere un sistema di partizione di spazio diverso solo per scopo la fisica.

Per fare un esempio, voglio fare un gioco "l'inferno proiettile", dove c'è un sacco di palle che astronave del giocatore deve schivare in modo molto preciso. Per ottenere abbastanza di rendering e prestazioni di rilevamento di collisione ho bisogno di sapere:

  1. quando le pallottole figurare, nello spazio dello schermo
  2. quando proiettili lasciano lo spazio dello schermo
  3. quando il giocatore entra in collisione con proiettili
  4. quando il giocatore entra in collisione con i mostri

Così ho tagliato il ricorsivamente schermo che è in 2D in 4 parti, che mi dà un quadtree. Il quadtree viene aggiornato ogni tick gioco, perché tutto si muove costantemente, quindi devo tenere traccia della posizione di ciascun oggetto (nave spaziale, proiettile, mostro) nella quadtree di sapere che uno è in quale parte dello schermo.

Il raggiungimento 1. è semplice, basta inserire il proiettile nel sistema.

Per ottenere 2. Ho mantenuto un elenco di foglie nel quadtree (sezione quadrata dello schermo) che sono sul bordo dello schermo. Quelle foglie contengono gli IDS / puntatori dei proiettili che sono norecchio al confine così devo solo verificare che si stanno muovendo fuori a sapere se posso fermarli il rendering e la gestione di collisione anche. (Potrebbe essere po 'più complesso, ma si ottiene l'idea.)

Per ottenere 3 e 4. Ho bisogno di recuperare gli oggetti che si trovano vicino astronave del giocatore. Quindi, prima ho la foglia in cui astronave del giocatore è e ottengo tutti gli oggetti in esso. In questo modo mi metterà alla prova solo la collisione con il giocatore navicella spaziale su oggetti che si trovano attorno ad esso, non tutti gli oggetti. (È un po 'più complesso, ma si ottiene l'idea.)

In questo modo posso fare in modo che il mio gioco verrà eseguito senza problemi anche con migliaia di proiettili in continuo movimento.

In altri tipi di struttura dello spazio, sono necessari altri tipi di spazio partizionamento. In genere, i giochi kart / auto avranno un "tunnel" scene-graph perché visivamente il giocatore vedrà solo le cose lungo la strada, in modo da avere solo controllare dove si trova sulla strada per recuperare tutti gli oggetti visibili in giro per il "tunnel" .

Un grafico scena è un modo di organizzare tutti gli oggetti nell'ambiente. Di solito si ha cura di organizzare i dati per il rendering efficiente. Il grafico, o un albero, se volete, può mostrare la proprietà di oggetti secondari. Per esempio, al più alto livello ci può essere un oggetto di città, sotto sarebbe molti oggetti di costruzione, sotto quelli possono essere pareti, mobili ...

Per la maggior parte, però, questi sono utilizzati solo per le scene 3D. Vorrei suggerire non andare con qualcosa che complicato per una scena 2D.

Sembra che ci siano un bel paio di filosofie diverse sul web per quanto riguarda ciò che i responsebilties sono di scenegraph. Le persone tendono a mettere in un sacco di cose diverse come la geometria, la macchina fotografica di, fonti di luce, trigger di gioco ecc.

In generale I descriva una scenegraph come descrizione di una scena ed è composto da un unico o più strutture di dati contenenti le entità presente nella scena. Queste strutture di dati possono essere di qualsiasi tipo (array, albero, composita modello , ecc) e possono descrivere qualsiasi di proprietà dei soggetti o qualsiasi rapporto tra le entità nella scena. Queste entità possono essere qualcosa che va da oggetti solidi disegnabili a collisione mesh, della fotocamera e sorgenti luminose. L'unica vera limitazione che ho visto finora è che le persone raccomandano di tenere i componenti di gioco specifici (come trigger di gioco) fuori per evitare problemi di dipendenze in seguito. Queste cose dovrebbero essere estratta via, per dire, "LogicEntity", "InvisibleEntity" o semplicemente "entità".

Ecco alcuni usi comuni di e Datastructures in uno scenegraph.

relazioni padre / figlio

Il modo in cui si può utilizzare uno scenegraph in un gioco o il motore è quello di descrivere le relazioni padre / figlio tra tutto ciò che ha una posizione, sia esso un oggetto solido, una macchina fotografica o qualsiasi altra cosa. Tale rapporto un significherebbe che la posizione, la scala e l'orientamento del bambino sarebbe rispetto a quella del suo genitore. Ciò consentirebbe di rendere la fotocamera seguire il giocatore o per avere una sorgente luminosa seguire un oggetto in torcia. Sarebbe anche consentire di fare cose come il sistema solare in cui si può descrivere la posizione dei pianeti rispetto al sole e la posizione delle lune relativi al loro pianeta se questo è ciò che stai facendo.

Anche cose specifiche da qualche sistema nel vostro gioco / motore può essere conservato in scenegraph. Ad esempio, come parte di un motore fisico potrebbe essere definito semplici collisione mesh per oggetti solidi che possono avere geometria troppo complessa per collisioni di prova su. Si potrebbe mettere queste collisioni mesh (sono sicuro che avere un altro nome, ma ho dimenticato: P). Nel vostro scenegraph e li hanno seguono gli oggetti che modellano

Spazio-partizionamento

Un altro possibile datastructure in uno scenegraph è una qualche forma di spazio-partizionamento come affermato in altre risposte . Ciò consentirebbe di eseguire query veloci sulla scena come ritaglio qualsiasi oggetto che non è nel tronco di visualizzazione o in modo efficiente filtrare gli oggetti che il controllo necessità di collisione. È inoltre possibile consentire codice del client (nel caso in cui si sta scrivendo un motore) per eseguire query personalizzate per qualunque scopo. Questo codice client modo non deve mantenere le proprie strutture spazio-partizionamento.

spero che ti ho dato, e gli altri lettori, alcune idee di come è possibile utilizzare uno scenegraph e quello che si potrebbe mettere in esso. Sono sicuro che ci sono un sacco di altri modi per utilizzare uno scenegraph ma queste sono le cose che mi si avvicinò con.

In pratica, gli oggetti di scena dei videogiochi sono raramente organizzata in un grafico che è "camminava" come un albero quando la scena è resa. Un sistema grafico si aspetta in genere una grande varietà di roba da rendere, e questo grande array viene camminava in modo lineare.

I giochi che richiedono relazioni genitoriali geometrici, come quelli con le persone in possesso di pistole o serbatoi con torrette, definire e applicare quei rapporti su una base alle necessità al di fuori del sistema grafico. Queste relazioni tendono ad essere solo un profondo, e quindi non c'è quasi mai la necessità di una struttura ad albero arbitrariamente profondo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top