Newsgroup: it.comp.giochi.action
Titolo: Parallax mapping

...di cosa si tratta di preciso?
Il nome mi suggerisce una texture che da l'impressione di 3d, 
probabilmente le finestre degli uffici di fear, tanto per capirci, ma 
vorrei una conferma.
-- 
Quasi quasi prendo e vi lascio nella merda che siete.
Tanto io ho una personalita' brillante, voi avete bisogno di me mentre 
io non ho bisogno di voi
(C) 2005 Gobbacci

 vorrei una conferma.
Quella roba marrone sopra? Io pensavo fosse sporco...
Scusate il mio inutile posto, ma mi sto svegliando lentamente...
Ciaolo!
-- 
Parmino il Gioppino
Informazioni di servizio:
Ho qualche invito gmail da regalare
Vendo 4 gomme invernali 185/65R14 al 90% con cerchi 

 ...di cosa si tratta di preciso?
In soldoni è una specie di displacment mapping, solo che consuma molte
meno risorse...

 meno risorse...
Aggiungo che il parallax m. ha una funzione fondamentale che lo fa differire 
da tutti gli altri tipi di bump. L'Occlusion Culling che "maschera" le zone 
del bump non visibili quando viene osservato da angoli molto grandi.
Cosa che il P.M. di FEAR non ha; basta fare un buco su un muro e poi 
spostarsi di lato, il buco si spalma, cosa che non dovrebbe accadere.
Sicuramente e' stato fatto per risparmiare risorse.
-- 
Il mio weblog:
http://www.goodgame.it/weblog/carlitobitaly/
 


Uhm.. non ho mica capito.
Ad esempio in fear mi sono accorto che, quando si e' fuori, alcuni 
palazzi hanno delle finestre trasparenti, dalle quali si vede 
all'interno l'ufficio.
Ora, spostandosi, si nota che non e' una banale texture: la cornice 
della finestra si sposta con una velocita' diversa rispetto agli oggetti 
dentro all'ufficio.
Eppure non sembra 3d poligonale, non so come spiegarlo, ma sembra come 
gli effetti dei vecchi spara e fuggi dove c'era lo scroll, appunto, 
parallattico.


 parallattico.
L'associazione e' buona. Perche' quel tipo di bump e' dipendente dal punto
di vista dell'osservatore per il motivo che ho spiegato, proprio come voleva
simulare lo scroll di cui parli.


 -- 
E meno male... altrimenti per farlo girare in modo decente sarebbe servito
un pc "ninja" ;)))

 vorrei una conferma.
Se vuoi *veramente* capire di cosa si tratta, devi prima capire i 
principi che stanno alla base.
1) La differenza tra il continuo e il discreto.
Quello che ci interessa è che un segnale continuo limitato a una 
finestra (cioè un intervallo) spaziale o temporale finita, contiene una 
quantità infinita d'informazione, al contrario di un segnale discreto.
Per es. prendi del legno ed esaminane una superficie di un metro quadro: 
l'informazione contenuta in quel metro quadro è pressoché infinita 
poiché scelti tre punti non allineati, esisterà sempre un altro punto 
contenuto nel triangolo da essi individuato al quale è associato un 
colore potenzialmente non correlato a quello dei tre punti. In realtà 
sappiamo che a livello atomico il colore scompare, poiché è una 
proprietà dei pigmenti, ma si parla di nanometri (un miliardesimo di 
metro) quindi lasciamo stare.
Quanto detto non è vero nel caso discreto (pensa al monitor).
2) Mappa = segnale discreto.
Se prendiamo un segnale f(x,y) cioè una funzione che associa ad ogni 
punto di coordinate (x,y) dello spazio 2d un valore, abbiamo, anche se 
l'intervallo considerato è limitato, infiniti valori.
Dato che la memoria e i tempi di calcolo sono e devono essere finiti, 
non è possibile trattare infiniti valori. Una possibilità è quella di 
rappresentare l'informazione tramite una legge matematica, per es: 
f(x,y) = x^2+y^2+3xy-7y.
In realtà questa formula rappresenta un'approssimazione della realtà, un 
"modello", ma spesso è più che soddisfacente. Se però il calcolo è 
troppo oneroso, allora si preferisce precalcolare i valori a intervalli 
(di solito regolari, ma non è detto) e quindi salvarli in una tavola o 
mappa. Allora la creazione di una mappa è un processo di 
discretizzazione o anche campionamento, cioè si scelgono finiti valori 
da un insieme infinito di valori.
3) Interpolazione.
L'interpolazione consiste nella determinazione di una funzione continua 
passante per dei punti dati.
Praticamente si cerca di ricostruire un segnale continuo partendo dal 
segnale discreto.
Facciamo chiarezza: il segnale continuo può contenere valori 
assolutamente casuali e quindi non correlati; la discretizzazione o 
campionamento porta alla selezione di alcuni di questi valori e 
l'interpolazione ricrea un segnale continuo a partire da questi in modo 
che non esistano punti spaziali o temporali ai quali non è associato 
nessun valore. L'interpolazione lineare consiste nel congiungere i punti 
con segmenti creando di fatto una spezzata. In 3d equivale a congiungere 
vertici con semipiani (quindi superfici "piatte"). L'interpolazione dà 
quindi origine a un segnale continuo, ma nel quale i punti sono tutti 
correlati perché determinati a partire da pochi punti contenenti VERA 
informazione.
4) Geometria e colore.
Senza scendere nei dettagli matematici, diciamo che l'intensità luminosa 
di un punto su una superficie è proporzionale all'intensità della luce 
riflessa dal punto (è una proprietà della superficie), all'intensità 
della fonte di luce e al coseno dell'angolo formato dalla normale della 
superficie in quel punto e il vettore luce. Si avrà perciò intensità 
massima quando il vettore luce ha stessa direzione della normale, cioè 
quando l'angolo è 0 (sole allo zenit, per intenderci) e intensità minima 
quando i vettori sono perpendicolari (le tre intensità R, G, B 
determinano il colore).
Detto tutto questo risulta evidente che ogni tipo di Mapping è una 
semplice discretizzazione di queste informazioni e viene usata per 
semplificare alcuni calcoli:
- Texture Mapping: mappa contenente il colore della superficie. In (4), 
il valore della mappa verrà usato al posto del colore della superficie.
- Bump Mapping: mappa contenente valori utilizzati per perturbare la 
normale della superficie. E' chiaro che la normale dipende dalla 
geometria della superficie e determina il colore finale. Perturbare una 
normale altera il colore, alterando di fatto la percezione della 
geometria della superficie. La normale della superficie viene calcolata 
e una sua perturbazione in funzione del valore della mappa viene 
utilizzata al posto della normale originale.
- Normal Mapping: mappa contenente NON valori utilizzati per perturbare 
la normale, ma LE NORMALI STESSE, quindi è più "descrittiva" perché 
contiene più informazioni. In (4) non verrà quindi usata la normale 
reale della superficie, ma quella letta dalla mappa.
- Parallax/Displacement Mapping:
In fisica di parla spesso di errore di parallasse che si verifica quando 
si legge per es. la temperatura su un termometro non posizionandosi 
perfettamente al livello della più alta tacca che si trova al di sotto 
del punto più alto raggiunto dalla colonna di mercurio. Se ci si sposta 
in basso, apparirà che la colonna di mercurio sia più bassa di quanto è 
in realtà (perché apparirà in corrispondenza di una tacca più bassa). 
Allo stesso modo, spostandoci in una determinata direzione e osservando 
il "panorama" di lato, noteremo che gli oggetti vicini si muovono più 
velocemente di quelli lontani. Questo è falso, in quanto gli oggetti 
lontani sono in realtà molto più grandi di quelli vicini e quindi il 
loro muoversi più lentamente è solo un'illusione. L'effetto è aumentato 
dal fatto che in lontananza non si scorgono i dettagli e quindi non ci 
si accorge che questi si muovono in realtà veloci quanto quelli vicini. 
Quindi l'illusione nasce dal confrontare la velocità di oggetti della 
stessa dimensione, dimenticandosi di tenere conto della prospettiva.
Torniamo al Parallax Mapping.
Osserviamo il seguente schema (passo fisso, al limite copiare in notepad):
         --X--\    O
        /      Y
       /        \-----\
----------T--------------
           X   Y         texture
La linea orizzontale rappresenta la superficie effettiva, mentre la 
linea irregolare la superficie reale che vogliamo simulare.
Usando una classica Texture, l'osservatore O, guardando verso T vedrà X, 
ma si vede chiaramente che considerando la VERA superficie avrebbe visto 
Y (basta congiungere O con T per rendersene conto).
Allora che si fa?
Trasliamo la texture verso sinistra in modo che Y vada in X:
         --X--\    O
        /      Y
       /        \-----\
----------T--------------
       X   Y            texture
Ecco fatto, adesso in entrambi i casi si vedrà Y. Ma di quanto dobbiamo 
traslare ogni texel (pixel della texture)? In realtà si vede chiaramente 
come questo dipenda dall'altezza di tali punti sulla superficie reale, 
quindi ogni punto dovrà essere spostato (tramite un offset, ovvero 
discostamento) individualmente.
Chiariamo meglio. La situazione non corretta è:
                    O
         -----\
        /      Y
       /        \
     /           Z
    /             \
-----T--------U---------
      A        Y Z     texture
In tal caso, guardando verso T, si vede A (errato) al posto di Y 
(corretto) e guardando verso U si vede Y (errato) invece di Z corretto.
Allora trasliamo la texture:
                    O
         -----\
        /      Y
       /        \
     /           Z
    /             \
-----T--------U---------
      Y        Z     texture
Visto come la distanza tra Y e Z è radicalmente cambiata?
Significa che abbiamo dovuto spostare Y di molto e Z di molto meno. In 
pratica lo spostamento è proporzionale all'altezza del punto sulla 
superficie reale. Più il punto è alto e maggiore deve essere lo 
spostamento di correzione.
Notando che Y è più vicino all'osservatore e Z è più lontano, e che 
nella correzione Z viene spostato di poco mentre Y di molto, non 
possiamo non ricordarci dell'esempio iniziale dove effettivamente, 
nell'effetto di parallasse, gli oggetti lontani si muovono più 
lentamente di quelli vicini.
E' evidente: dato che Y è vicino all'osservatore O, quest'ultimo, 
muovendosi anche di poco, lo vedrà spostarsi di parecchio nella 
direzione opposta, mentre Z che è più lontano si muoverà di meno.
Parallax Mapping with Offset Limiting.
           offset   O
           ------>*
         --X--\
        /      Y
       /        \-----\
----------T--------------
           X   Y  V      texture
In questo caso, guardando verso T, si vede X ma si dovrebbe vedere Y. 
Allora, per renderizzare il punto T, trasliamo la texture di un offset, 
ma come determinare quest'ultimo? Possiamo tracciare il segmento OT e 
quindi partendo da X tracciare un segmento (in questo caso) orizzontale 
(cioè tangente alla superficie in X) verso O (sempre procedendo 
orizzontalmente) fino ad intersecare (in *) OT. La lunghezza di questo 
segmento potrebbe rappresentare il nostro offset, però non abbiamo fatto 
un buon lavoro, infatti trasleremmo troppo selezionando V anziché Y!
Allora dobbiamo accorciare l'offset, cioè limitarlo ed ecco perché si 
parla di "offset limiting". Ovviamente l'offset non crescerebbe 
ugualmente a dismisura perché si procede a normalizzare tutti i vettori, 
però l'offset limiting dà un risultato migliore.
Esiste un'ulteriore tecnica che utilizza le normali e le altezze 
normalizzate (alpha channel). Le normali determinano univocamente la 
pendenza di ogni porzione di superficie e le altezze danno 
l'informazione mancante, cioè la distanza dal "suolo".
Si procede determinando il vettore V (osservatore) che va 
dall'osservatore al punto della superficie preso in considerazione e 
quindi si cerca l'intersezione tra questo vettore e la superficie REALE 
che vogliamo simulare, determinando il corretto texel della texture da 
visualizzare, ... ma veramente non voglio scendere nei dettagli 
matematici, perché non ce n'è ragione.
Spero di averti chiarito un po' le idee su alcune cose.
Kiuhnm

 Se vuoi *veramente* capire di cosa si tratta, devi prima capire i 
Grazie, molto esauriente.
Tra l'altro mi interesso del 3d dal punto di vista matematico quindi la 
tua spiegazione e' stata molto gradita :)


 la tua spiegazione e' stata molto gradita :)
Quando mi fai vedere qualcosa?


 tua spiegazione e' stata molto gradita :)
Mi fa piacere :)
Kiuhnm

 -- 
Pure io sono ansioso...;D

 Quando mi fai vedere qualcosa?
Oddio, posso farti vedere qualche screenshot, volentieri.
Farti vedere il prodotto la vedo dura visto che al di la' di essere 80 
mega di archivio, 1.5 giga di spazio su hd, credo di rischiare il 
licenziamento se pubblico il lavoro :)
Comuqnue e' un progetto scritto in java, che utilizza la libreria java3d 
per il rendering.
Con questo ho realizzato un aggeggio che permette di costruire delle 
tende da esterni, in 3d. (un po' quello che trovi all'ikea relativo ai 
mobili). Si inseriscono i dati di come si vuole la tenda, colore, 
struttura, dimensioni, accessori, ecc.. e lui ti visualizza in 3d come 
verra' il tuo acquisto. Con texture, illuminazione ecc. Poi ci puoi 
mettere come background la foto della casa tua, e ruotando e muovendo la 
tenda puoi avere un'idea di come verra' il giardino una volta installata.
Infine c'e' il rendering in ray tracing, che quindi effettua calcolo 
delle proiezioni delle ombre, riflessioni ecc, ed il preventivo che ti 
mostra quanto ti viene a costare quel che hai realizzato, con ciascuna 
singola voce.
Tecnicamente e' stato un lavoro molto interessante, fatto interamente da 
me, che mi ha insegnato quali sono le difficolta' di creare un oggetto 
3d composto. La tenda di fatto e' formata da un insieme di oggetti 
elementari, che vengono stretchati, ruotati, traslati, proprio come 
fosse una scatola di lego. Ci son problematiche di cinematica inversa 
(se ruoto un pezzo complesso, si devono ruotare tutti i pezzi elementari 
che son composti), importazione di oggetti da altri cad, conversione di 
formati.. insomma ora che e' finito e' stata una bella soddisfazione.

 wrote in message 
news:435e78ce$0$20487$4faf...@reader4.news.tin.it...


 c'ho capito n'a mazza Kiuhnm comunque ti credo!!
Dopo la spiegazione di kiuhnm invece ho capito perfettamente.
Hai fear?
Se si, spara contro un muro, poi osserva il buco, e prova a spostarti.
Quella e' una texture, non una struttura poligonale.


> Spero di averti chiarito un po' le idee su alcune cose.
Suggerisco a Lord di mettere questa spiegazione sul suo blog.
:)
-- 
Micheal the Angel
------------------------------------
Che mondo sarebbe senza Nutella?
------------------------------------
Occhio all'indirizzo mail
------------------------------------ 

 avere un'idea di come verra' il giardino una volta installata.
Splendido esempio di tecnologia al servizio dell'uomo.
Bravo PdG.


 vertici con semipiani (quindi superfici "piatte"). L'interpolazione dà 
Non "semipiani", ma "porzioni di piano" (determinate per es. da poligoni 
con vertici complanari).
Kiuhnm

 :)
Tieni comunque presente che è estremamente divulgativa e, di 
conseguenza, contiene lievi imprecisioni (volute). Del resto tutte le 
volte che al posto di scrivere formule si usano parole si fa qualche 
errore :)
Kiuhnm

 Oddio, posso farti vedere qualche screenshot, volentieri.
[]
Lavoro molto interessante! Complimenti.
Se hai uno screen di un rendering finito sono molto curioso di vedere che si 
puo' fare con java3d.
Anche il pvt se lo ritieni.


 Suggerisco a Lord di mettere questa spiegazione sul suo blog.
Sebbene sia di livello altissimo e' troppo tecnica per essere capita da 
chiunque.



Perfezionista...


 Perfezionista...
Pensa che stamattina appena alzato ho avuto la folgorazione e ho capito 
di aver scritto semipiano a sproposito :)
Si vede che la mia mente di notte ripensa a tutto quello che ho fatto e 
scritto. Non è la prima volta che mi capita.
Forse dovrei lasciarmi un po' andare e just relax...
Kiuhnm

 e scritto.
E evidente a questo punto che penso solo alle cazzate anche da addormentato.


 c'ho capito n'a mazza Kiuhnm comunque ti credo!!
In due parole:
se guardi un panorama e ti muovi lateralmente (per es. premendo A o D :) 
) vedrai che gli oggetti lontani sembrano muoversi più lentamente di 
quelli vicini. In realtà l'effetto è determinato dal fatto che si 
confrontano tra loro oggetti che appaiono di dimensione uguale, ma che 
in realtà non lo sono.
Il parallax mapping vuole simulare questo effetto. Se veramente vogliamo 
rendere la superficie *non* piatta, allora dobbiamo fare in modo che i 
pixel che escono di più dalla superficie si spostino più velocemente in 
quanto si trovano più vicini all'osservatore. Quindi il parallax mapping 
in pratica raggruppa i pixel della texture in pixel che hanno la stessa 
altezza, ovvero distanza dall'osservatore e li trasla a velocità differenti.
Es.
            A  osservatore (è un occhio ;) )
         11
        2  2   2     2          2     2
       3    333 3   3 3              3 3
    444          444   444444444 4444   4
---------------------------------------------
    4443211233323444323444444444244443234	
In basso trovi la texture dove i texel (pixel della texture) non hanno 
altezza e in alto trovi la parallax map dove i texel hanno anche 
un'altezza. I texel appartengono a quattro gruppi: 1, 2, 3, 4.
I texel del gruppo 1 scorrono molto velocemente, mentre quelli del 
gruppo 2 meno velocemente e così via fino a quelli del gruppo 4 che sono 
i più lenti.
In altre parole si vuole dare l'impressione che i texel della texture 
abbiano diversa distanza dall'osservatore modulando (cioè alterando) la 
velocità con la quale scorrono quando l'osservatore si muove 
parallelamente al muro.
In pratica sarebbe come avere non una sola texture, ma N texture (con 
buchi in modo che si vedano quelle dietro) che scorrono a diverse 
velocità. Ti ricordi i vecchi videogame che usavano questo effetto?
Sembrava o no che effettivamente le texture più veloci rappresentassero 
"strisce" di paesaggio più vicino?
Quindi in definitiva il parallax mapping non è niente di nuovo: è 
un'intelligente rielaborazione di un vecchio trucco 2d usato molti anni fa.
Kiuhnm

 che tutti shpalmerà!"
Bisogna ammettere che è orecchiabile :)
Kiuhnm

 Anche il pvt se lo ritieni.
Pronti.
http://pdg.altervista.org/ip.jpg


 Pronti.
Bel lavoro, l'interfaccia e' molto pulita.
Per essere il lavoro di una sola persona devi aver buttato sangue.


 Per essere il lavoro di una sola persona devi aver buttato sangue.
Ci sono impazzito. Ho passato (molte) notti in piedi.
Tra l'altro e' il mio primo progetto che tratta sia grafica 3d, sia 
interfacce utente, quindi....
Grazie :)



Bel lavoro...;-)

 
Grazie!
C'e' da dire che java3d aiuta.. e' un ottima libreria che si appoggia su 
directx o opengl, a scelta, ed e' decisamente ottimizzata, per essere java.
Quel che vedi sulla schermata gira piuttosto fluidamente (non li ho 
contati ma credo siamo sopra ai 20 al secondo) su una obsoleta radeon 
7500 mobility da 32 mega.

 
http://pdg.altervista.org/ip.jpg
Davvero un bel lavoro. Gli utenti non capiscono il lavoro che c'è dietro 
a un'interfaccia anche minimale. Solitamente impiego solo il 30% a fare 
gli algoritmi interni e il rimanente 70% a costruire e debuggare 
l'interfaccia grafica.
Una domanda: perché non usi l'antialiasing?
Kiuhnm


Grazie per i complimenti
Non l'ho settato perche' ho una scheda video sul portatile direi quasi 
minimale, e per sviluppare mi da piu' fastidio che beneficio.