Il problema della precisione
Sin dall'inizio, il team di ingegneri sapeva che il mondo continuo avrebbe influenzato in modo significativo il motore e la progettazione dei contenuti e il problema principale era la stabilità numerica. Immagina due personaggi che camminano in formazione a due metri di distanza in direzione est dall'origine. Ad un certo punto, la distanza l'una dall'altra è sopraffatta dalla distanza dall'origine e i personaggi appariranno "nella stessa posizione".
Con la virgola mobile, più si ottiene dall'origine, più precisione si perde, il che può causare ogni tipo di brutto problema. Le cose non vanno bene, compaiono delle crepe tra le maglie adiacenti, lo spazio inizia a quantizzare e cani e gatti iniziano a vivere insieme. Dungeon Siege utilizza la FPU in modalità di precisione singola per ovvi vantaggi prestazionali e per abbinare la precisione nativa dell'hardware video. Tuttavia, anche se aumentassimo la precisione, alla fine non potrebbe mai risolvere il problema perché il mondo era pianificato per essere incredibilmente grande.
Il problema della precisione significava che non sarebbe stato possibile avere un mondo unificato per coordinare lo spazio come la maggior parte degli altri giochi. Invece, la soluzione era quella di segmentare il mondo continuo in un insieme di spazi di coordinate indipendenti e passare periodicamente da uno all'altro per ripristinare la precisione. All'interno di questi vincoli sono state provate varie idee e alla fine abbiamo optato per una variazione di un sistema portale standard.
La nostra soluzione consiste in un sistema di coordinate basato su nodi relazionali, in cui ogni blocco di geometria (Nodo d'assedio) ha il suo spazio di coordinate ed è collegato spazialmente alla geometria vicina tramite le porte che condivide in comune con quei vicini. La disposizione dei nodi collegati da porte forma un grafico continuo che rappresenta l'intera mappa del mondo. Questo sistema di nodi si è evoluto nel tempo dal suo obiettivo originale di mantenere la precisione FPU per diventare il metodo principale di suddivisione efficiente dello spazio e la radice di innumerevoli ottimizzazioni.
Per incapsulare il concetto di una posizione 3D rispetto a un nodo specifico, il vettore tradizionale (x, y, z) doveva essere aumentato con un ID nodo (x, y, z, nodo) e rappresentare un offset rispetto all'origine di un nodo specifico invece. Questa 4 tupla è incapsulata come Posizione nodo assedio o SiegePos. Successivamente, abbiamo aggiunto un SiegeRot (quaternione, nodo) al fine di gestire i confronti tra gli orientamenti tra i nodi.
La frase "non c'è spazio nel mondo" è diventata un mantra per il team, anche se ci sono voluti letteralmente anni per tutti per capire a fondo cosa significasse.