Un oggetto due volte più vicino appare due volte più grande?


16

Quindi stavo pensando di creare un gioco 2D in cui puoi anche muoverti lungo l'asse Z, cambiando in quale livello sei. A seconda della profondità, desidero ridimensionare i miei sprite 2D.

Una volta qualcuno mi aveva mostrato una demo in cui aveva molti sprite 2D e, scorrendo, poteva cambiare la profondità della videocamera. Quindi, quando si ingrandisce, gli oggetti si avvicinano al giocatore e appaiono più grandi. Poi mi sono chiesto, quanto più grande dovrebbe essere un oggetto quando si avvicina di 1 unità. Come lo calcoleresti? Quindi il ragazzo mi ha detto: c'è una regola di base che sto usando: "gli oggetti due volte più vicini, appaiono due volte più grandi".

Ora, testandolo da solo, so che la regola non si applica nel mondo reale;) Ma c'è qualche costante che viene usata nei calcoli del mondo reale per la prospettiva o qualcosa del genere? O una formula?

So che questo potrebbe non essere il posto migliore per porre una domanda del genere, ma poiché questo è l'unico sito che utilizzo per domande relative al gioco e il mio contesto è un gioco, ho pensato di provarlo. Inoltre, mi aspetto che ci sia questa persona qui che sa tutto di prospettive e matrici 3D o qualcosa del genere, dal momento che potrebbe riguardare i giochi 3D;)

tl; dr:

"un oggetto due volte più vicino, appare due volte più grande" Questo non è vero nel mondo reale. Ma quale costante o formula è corretta?


3
Non ho idea di quale sia la risposta, ma so come ho potuto scoprirlo. Scatta delle foto di qualcosa. Forse un pezzo di carta. Prendili da diverse distanze conosciute e poi fai un po 'di matematica per calcolare la quantità di immagine presa dal pezzo di carta e determinare il rapporto da quello. Potrebbe essere un esperimento divertente!
SpartanDonut,

Mi chiedo perché nessuno abbia mai parlato di logaritmi naturali ...
Chad Harrison,

4
Perché non è vero? Penso che sia vero
Ivan Kuckir,

@hydroparadise Cosa hanno a che fare i logaritmi naturali con questa domanda?
Nathan Reed,

Sono solo pedante qui lo so, ma "Due volte più vicino" è una frase strana. Non dovrebbe essere "La metà più lontana"? "Due volte" è più grande, ma se qualcosa si avvicina la distanza si riduce.
MrVimes

Risposte:


19

In genere è vero, a seconda del punto di vista e della direzione in cui si è spostato, nonché dell'angolo di visione.

Esempio di prospettive per oggetti

Nota come nella prima vista della telecamera, poiché il blocco rosso è perpendicolare alla vista della telecamera, l'oggetto sembra essere due volte più grande in un rapporto 1: 2 perfetto (Nota la freccia che indica che colpisce il bordo della vista dopo essere stato spostato due volte più vicino)

Il secondo è lo stesso blocco di dimensioni ruotato di 45 gradi. Quando viene ruotato, il bordo inferiore non si trova più alla stessa distanza dalla videocamera del bordo superiore, quindi non si adatta correttamente al rapporto 1: 2, ma in realtà è due volte più grande (come è a lo stesso angolo nel blocco blu più lontano di quello nel blocco blu vicino.)

In conclusione, questo in realtà significa che il tuo amico aveva ragione e un rapporto 1: 1 ("gli oggetti due volte più vicini, appaiono due volte più grandi") per i tuoi oggetti è una buona scelta.



Bella risposta! Le immagini lo rendono decisamente più chiaro. In realtà mi sento davvero stupido ora, dal momento che ho provato questo prima di pubblicare la domanda tenendo la mano davanti alla mia faccia e avvicinandola. E poi ho pensato: no, non sembra due volte più grande .... Avrei dovuto misurarlo più accuratamente;) La prospettiva è una cosa divertente! Inoltre, se Aseel come avrei dovuto essere in grado di elaborare le immagini da solo;) Ma un'ottima risposta! Grazie!
Berry

@Mason Wheeler - Ordinato: P
Tom 'Blue' Piddock

8

Un oggetto due volte più vicino appare due volte più grande. È una conseguenza del teorema di Thales ed è vero nel mondo reale.

Si potrebbe sostenere che il Teorema di Thales è lo strumento matematico di base dietro la proiezione prospettica e ciò che è noto nella pipeline grafica (OpenGL o DirectX) come divisione prospettica . È un teorema che dovresti assolutamente conoscere e imparare a riconoscere quando può essere usato.


Grandi riferimenti! Esaminerò sicuramente il Teorema di Thales e cercherò di capire meglio la pipeline grafica.
Berry

7

In realtà è praticamente vero (se sposti un oggetto due volte più lontano sembra mezzo grande) ma oscura come le dimensioni visive degli oggetti dovrebbero cambiare mentre gli spettatori si muovono. In particolare, gli oggetti sembrano ingrandirsi più velocemente quanto più si avvicinano. Questo perché lo spettatore copre metà della distanza molto più velocemente quando l'oggetto è vicino, rispetto a quando l'oggetto è più lontano. O per dirla in altro modo, mentre la velocità dello spettatore è costante, il valore di "metà della distanza" cambia al variare della distanza dall'oggetto.


2

Dato che non stai effettivamente lavorando nello spazio 3D, possiamo supporre che gli sprite non ruotino mai (la rotazione può essere simulata con l'inclinazione, ecc.) Questo semplice vincolo rende abbastanza facile ottenere numeri un po 'precisi su quale dovrebbe essere la dimensione in base alla distanza dalla fotocamera.

Innanzitutto, devi capire come vengono renderizzati gli oggetti 3D. Anche se una telecamera converge in un singolo punto, esiste un piano invisibile che funge da schermo su cui disegnare gli oggetti. L'unica cosa che devi sapere sullo schermo è quanto è distante dalla fotocamera.

Ecco un diagramma di come viene eseguito il rendering di un oggetto su una telecamera a due diverse distanze.

Come prevedibile, l'altezza dell'oggetto dipende dalla distanza dalla telecamera. MA poiché il rendering si verifica sul piano di abbattimento vicino, in quel punto dobbiamo calcolare l'altezza dello sprite.

Alcuni calcoli di base del trigocer ti porteranno alla seguente formula:

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

ESEMPIO:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

Vorrei suggerire di iniziare v=5e quindi regolare da lì in base a come appare. Potrei mettere insieme un violino che ti permette di vedere i cambiamenti in tempo reale.

TL; DR

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

EDIT: quando dici di spostarti lungo l'asse z, suppongo che vorrai una vista prospettica (come la maggior parte dei giochi 3D; tiratori, ecc.) La matematica per calcolare le dimensioni dell'oggetto in base alla distanza dipenderà anche dalla posizione nel riquadro, simile alla visione periferica. Invece, lo proverei con la mia matematica che è una visione ortografica (pensa a Mario, Angry Birds, Super Smash Bros, ecc.). Non conosco l'aspetto e la sensazione che stai cercando di ottenere, ma finché sembrerà reale, i giocatori non lo sapranno mai!

DEMO!


Sì, in realtà sto mirando a una visione ortografica. Il gioco da cui "prendo in prestito" la mia attuale ispirazione è Rayman Origins. In alcune sezioni del gioco puoi saltare sui fiori e poi rimbalzerai su un altro livello con una profondità diversa. Quindi la fotocamera ingrandisce o rimpicciolisce rispondendo a quella profondità. Axample può essere visto in questo video , alle 4:50 e alle 5:00.
Berry

Inoltre, un'ottima risposta! Ma dato che solo una conferma che la regola "due volte più vicina, due volte più grande" sarebbe stata sufficiente, ho scelto la risposta di Blue come la migliore.
Berry

Grazie e buona fortuna con il tuo gioco! Ma voglio chiarire agli altri che "due volte più vicino, due volte più grande" funzionerà alla grande se tutto è molto vicino alla fotocamera. Man mano che le cose si allontanano, il cambiamento di dimensione percepito si riduce. Ad esempio, guarda il pollice da vicino, quindi estendi il braccio e guardalo. La dimensione del pollice appare drasticamente più piccola. Dopodiché, guarda qualcosa di molto lontano. Fai un passo indietro (circa la stessa della lunghezza del braccio). Notare come le dimensioni sono appena cambiate? Se un gioco ha un lungo campo visivo, usare un po 'di matematica farà molta strada.
Jim Buck,

EDIT: ho fatto un errore nel mio commento precedente. "Due volte più vicino, due volte più grande" è corretto quando gli oggetti rimangono abbastanza vicini l'uno all'altro rispetto alla loro distanza dalla telecamera.
Jim Buck,

Ecco una breve demo che ho messo insieme, usare il mouse per spostarsi e la rotella di scorrimento per cambiare la profondità.
Jim Buck,

0

Questo non è stato coperto e ho pensato che potesse essere utile: dovrebbe essere notato quando si metà della distanza, raddoppiando la dimensione in entrambe le dimensioni X e Y quadruplicherà l'area totale dello sprite. Questo è perché:

Area = X * Y

Dopo lo zoom in:

NewArea = (x*2) * (y*2)

Questo può darti l'impressione che l'effetto di zoom sia rapido o troppo intenso. È possibile regolare il fattore modificando 2 nella formula precedente in un valore float come 1,5 o 1,33.

In alternativa, ciò che ho fatto è memorizzare la profondità della telecamera (distanza) per i riquadri in un valore in byte insieme alla traslazione della telecamera (X e Y), quindi calcolare le dimensioni delle piastrelle proiettate in questo modo:

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

Si noti che CameraZdeve essere rigorosamente tra 1-255 e che la restrizione potrebbe essere un vantaggio o una rovina per te in futuro.

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.