Come posso fare in modo che “cadano” terreni 3D come Animal Crossing?


15

Animal Crossing ha un modo unico di scorrere la mappa del mondo: quando il personaggio si sposta verso il basso, il mondo gira e rigira in alto, come se fosse bloccato in un tubo di cartone:

Animal Crossing è il mondo dei cilindri

Questo video mostra come si muove.

Come posso creare questo effetto?


1
A me non sembra un effetto, sembra un mondo 3D molto semplice che la videocamera sta seguendo.
James,

L'hacking del gioco può produrre un problema tecnico che ti consente di camminare nell'oceano dove finisce il mondo. Puoi vedere frammenti del mondo resi "curvati all'indietro" nel vuoto oltre il limite del mondo. Video qui .
Anko,

Risposte:


6

Stavo sperimentando un po 'dopo aver giocato a Deathspank, che ha un effetto simile. Anche se non ho mai approfondito abbastanza per vedere se potesse essere sintonizzato per funzionare molto bene, una possibilità è semplicemente modificare gli elementi nel tuo shader di vertice in base alla profondità. Una funzione che mappa cos (profondità) su una modifica dell'asse Y funziona. Puoi regolarlo in modo tale che il mondo non solo cada in lontananza ma anche se è più vicino di una certa profondità, facendo sentire il mondo particolarmente rotondo. Puoi fare lo stesso per il valore dell'asse X per renderlo più sferico. Non sono sicuro se questo è il modo in cui tali giochi lo fanno effettivamente; i miei esperimenti hanno dato risultati insoddisfacenti ma non ho giocato molto con i rapporti, quindi potrebbe essere stato semplice come cambiare il tasso di caduta per renderlo migliore.


+1 perché è così che lo farei. Tuttavia, potresti voler chiarire cosa intendi per "profondità". Potrebbe essere la distanza dalla fotocamera o la distanza dal personaggio. Penso che sarebbe bello sperimentare entrambi.
DaleyPaley,

Mi dispiace, sono in ritardo alla festa - con circa 6 anni di ritardo - ma nel caso AC la "profondità" viene calcolata in base alla distanza dalla telecamera ... ma poiché la posizione della telecamera si basa sulla posizione del personaggio, tutto è un po ' collegato.
lvictorino,

5

Sembra semplicemente prendere un "mondo piatto" e mapparlo su coordinate cilindriche . Essenzialmente avvolgendo il mondo su un cilindro. Ho fatto qualcosa di simile con un mondo piatto, ma l'ho avvolto in una sfera:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Il modo in cui l'ho fatto per una sfera è simile al modo in cui lo faresti per un cilindro. Scegli un raggio adatto (ρ o "rho" in coordinate cilindriche) per il tuo mondo. Per ogni vertice, prendi le coordinate XZ del tuo mondo (supponendo che Y sia altezza), quindi converti in coordinate cilindriche usando XZ e raggio più Y. Se non aggiungi Y, otterrai un cilindro piatto. Quindi riconvertire in coordinate cartesiane per pescare in gioco.


3
Un'altra cosa da menzionare, la dimensione Y del mondo in Animal Crossing è molto più grande della circonferenza del cilindro (solo osservandola, perché la linea dell'orizzonte è molto vicina). Pertanto una parte della mappa del mondo viene ritagliata solo verso le aree più vicine al personaggio e quell'area ritagliata viene avvolta attorno all'intero cilindro. È simile al ritaglio di una mappa basata su piastrelle 2D solo per le parti visibili.
ChrisC,

Punto eccellente. Immagino che potrebbe anche essere usato per ridurre l'ingombro della memoria caricando / scaricando il mondo secondo necessità.
MichaelHouse

5

Vuoi passare da un mondo planare a uno cilindrico.

Una rotazione attorno all'asse x (in coordinate omogenee) è simile alla seguente:

     | 1   0   0   0 |
Rx = | 0  ca  -sa  0 |
     | 0  sa   ca  0 |
     | 0   0    0  1 |

Dove:

ca = cos(angle) and sa = sin(angle)

Per calcolare l'angolo, guarda l'immagine. Il pi / 2 si cancella e ti rimane con:

angle = offset_from_character.z - radius

Inoltre, guarda l'immagine. L'angolo del punto proiettato dipende dalla distanza orizzontale dal carattere, la distanza dalla sfera dipende dalla verticale.

new_position = character_position - vec3(0,radius,0) + Rx * vec3(0,radius+_old_position.y,0)

assicurati di abbattere le cose che sono oltre l'orizzonte, altrimenti il ​​mondo intero si avvolgerà.

Disclaimer: non l'ho testato e non sono un esperto di matematica, ma la risposta è qualcosa del genere. Qualcuno, per favore, mi corregga se sbaglio.

mondo sferico

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.