Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem vezan za kreiranje vertexa (3D teren)

[es] :: 3D programiranje :: Problem vezan za kreiranje vertexa (3D teren)

[ Pregleda: 3823 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

speciebsp
Gorazde, BiH

Član broj: 52340
Poruke: 19
*.dslam.ob.bih.net.ba.

Sajt: bspdx.cjb.net


Profil

icon Problem vezan za kreiranje vertexa (3D teren)26.03.2005. u 23:41 - pre 231 meseci
Ovdje imam jedan kôd iz tutorijala sa stranice 32bits.co.uk u kojem covjek objasnjava kako iz heightmape dobiti 3D teren... medjutim ovo zaista nikako nemogu da sazvakam:

Code:

int z = 128;
            float tu, tv;
            int nArrayIndex = 0;

            for(int nIndexY=0;nIndexY<bmpHeight;nIndexY+=2)
            {
                tv = (float)(((float)nIndexY/(float)2)/(float)128);
                for(int nIndexX=0;nIndexX<bmpWidth;nIndexX+=2)
                {
                    int x=nIndexX-128; 
                    tu = (float)(((float)nIndexX/(float)2)/(float)128);                    
                    cvs[((nIndexY/2) * 128)+(nIndexX/2)].X = (float)x;
                    cvs[((nIndexY/2) * 128)+(nIndexX/2)].Y=(float)data[nIndexY,nIndexX];
                    cvs[((nIndexY/2) * 128)+(nIndexX/2)].Z=(float)z;
                    cvs[((nIndexY/2) * 128)+(nIndexX/2)].Tu=tv;
                    cvs[((nIndexY/2) * 128)+(nIndexX/2)].Tv=tu;
                    int col=data[nIndexY,nIndexX]*7;
                    cvs[((nIndexY/2) * 128)+(nIndexX/2)].Color = Color.FromArgb(255, col,col,col).ToArgb(); 
                }
                z-=2;
            }


            for(int nIndexY=0; nIndexY<128; nIndexY++)
            {
                for(int nIndexX=0; nIndexX<127; nIndexX++)
                {
                    Inds[nArrayIndex]=  (short)(((nIndexY+1) * 128)+nIndexX);
                    Inds[nArrayIndex+1]=(short)((nIndexY     * 128)+nIndexX);
                    Inds[nArrayIndex+2]=(short)(((nIndexY+1) * 128)+nIndexX+1);
                    Inds[nArrayIndex+3]=(short)(((nIndexY+1) * 128)+nIndexX+1);
                    Inds[nArrayIndex+4]=(short)((nIndexY     * 128)+nIndexX);
                    Inds[nArrayIndex+5]=(short)((nIndexY     * 128)+nIndexX+1);
                    nArrayIndex+=6;
                }
            }


Interesuje me dali mi ko moze objasniti na koji tacno nacin kreira vertexe na osnovu koda iznad?

Znam da drugi dio koda sluzi za kreiranje indexa i to je to :)

Napomena: data[] niz sadrzi vrijednosti pixela bitmape, tj. vrijednosti boja (0-255)!

Hvala unaprijed!
 
Odgovor na temu

Nothingman

Član broj: 31375
Poruke: 308
*.mobtel.co.yu.



+112 Profil

icon Re: Problem vezan za kreiranje vertexa (3D teren)27.03.2005. u 01:01 - pre 231 meseci
Stvar je prilicno prosta. Glupo je sad da ti neko ovde objasnjava liniju po liniju koda. Mislim da je bolje resenje da potrazis preko googla neki dobar heightmap tutorial. (ili bar objasni sta ti konkretno nije jasno kod heightmappinga).
Kad shvatis kako stvar funkcionise nece ti ni trebati taj kod sto si postavio jer ces znati sam da ga napises za 10 minuta ;)
Ako ne mozes da nadjes dobar tutorial javi mi da ti posaljem na mail.

p.s. Ako te interesuje generisanje 3d terena skini preko e-donkeya "Focus on 3d terrain". Knjiga (koja ruku na srce i nije nesto) ima oko 200 strana, tako da vise dodje kao tutorial :)
A ima i chapter o heightmapingu...

Q: Are there really any systems where
void main() doesn't work?
A: It has been reported that programs using void main() can crash.
Q: The book I've been using, _C Programing for the Compleat Idiot_,
always uses void main().
A: Perhaps its author counts himself among the target audience.
 
Odgovor na temu

speciebsp
Gorazde, BiH

Član broj: 52340
Poruke: 19
*.dslam.ob.bih.net.ba.

Sajt: bspdx.cjb.net


Profil

icon Re: Problem vezan za kreiranje vertexa (3D teren)27.03.2005. u 14:04 - pre 231 meseci
Citat:
Nothingman: Stvar je prilicno prosta. Glupo je sad da ti neko ovde objasnjava liniju po liniju koda. Mislim da je bolje resenje da potrazis preko googla neki dobar heightmap tutorial. (ili bar objasni sta ti konkretno nije jasno kod heightmappinga).
Kad shvatis kako stvar funkcionise nece ti ni trebati taj kod sto si postavio jer ces znati sam da ga napises za 10 minuta ;)
Ako ne mozes da nadjes dobar tutorial javi mi da ti posaljem na mail.

p.s. Ako te interesuje generisanje 3d terena skini preko e-donkeya "Focus on 3d terrain". Knjiga (koja ruku na srce i nije nesto) ima oko 200 strana, tako da vise dodje kao tutorial :)
A ima i chapter o heightmapingu...


Nije meni potrebno objasnjavati zasto je Vertex.X = X ili Vertex.Y = Y.. mislim da jeste to glupo, ali me interesuje samo kratak koncept kreiranja tih vertexa.

Koliko sam ja shvatio uzme prvi red (npr: Y=0) i onda se krece for petljom po X-u i tako kreira vertex-e... fazon je sto mi nije jasno odakle ovo:

[((nIndexY/2) * 128)+(nIndexX/2)] i kako do ovog dolazimo??

Hvala na odgovoru!
 
Odgovor na temu

Nothingman

Član broj: 31375
Poruke: 308
*.mobtel.co.yu.



+112 Profil

icon Re: Problem vezan za kreiranje vertexa (3D teren)27.03.2005. u 17:26 - pre 231 meseci
A to je u pitanju :)
Zamisli da imas ekran rezolucije sirina*visina (npr. 640*480).
Ako ti je:
byte* VideoMemory;
pointer na video memoriju, kako ces upisati crveni pixel na ekranu na recimo koordinatama x=220, y=300 ako svaki pixel predstavimo kao jedan bajt?
Koristices formulu:
VideoMemory[y*sirina + x] = CrvenaBoja;
Znaci posto je memorija linearna, a koordinate si dobio u dvodimenzionalnom prostoru sa x, y, ti moras da pronadjes mesto u linearnoj memoriji koje odgovaraju tim koordinatama. Drugim recima pri rezoluciji 640*480 prvih 640 bajtova u nizu VideoMemory predstavljaju prvi red na ekranu(znaci bajtovi od 0-639), sledecih 640 bajtova predstavlja drugi red (640-1279)...i tako dalje.
Znaci da bi pronasao pixel sa koordinatama 220, 300 ti pises:
VideoMemory[300*640+220];

Kakve to sad ima veze sa onim sto si ti pitao? :)

Citat:
[((nIndexY/2) * 128)+(nIndexX/2)] i kako do ovog dolazimo??


Pa princip je isti. Tebi gore broj 128 predstavlja sirinu (jednog reda), a nIndexY i nIndexX predstavljaju y i x koordinate. Pitanje je sad zasto gore x i y delimo sa 2.
Evo bacih pogled na kod koji si stavio i vidim da on u petlji te indexe inkrementira za 2 pri svakom prolazu. Nisam siguran, jer ne znam koja je velicina bitmape iz koje taj program uzima podatke. Inace koliko vidim kod je prilicno ruzno napisan ako je namenjen za tutorial, pogotovu sto koristi hard coded vrednosti tipa 128, 7 i slicno.
Zato verovatno i imas problema da shvatis kako funkcionise. Reci mi koje su podrazumevane velicine height mape i teksture za taj program pa cu moci vise da ti pomognem. Na prvi pogled izgleda kao da je heightmap 64*64 pa zato deli sa dva, mada je to glup nacin da se tako nesto uradi :)

Da li ti je ovo bar malo pomoglo? Ako nije reci sta tacno ti jos zadaje probleme. Veoma je nezgodno ovo objasniti cistim tekstom, ne kaze se dzaba da slika vredi hiljadu reci :)

Q: Are there really any systems where
void main() doesn't work?
A: It has been reported that programs using void main() can crash.
Q: The book I've been using, _C Programing for the Compleat Idiot_,
always uses void main().
A: Perhaps its author counts himself among the target audience.
 
Odgovor na temu

Nothingman

Član broj: 31375
Poruke: 308
*.mobtel.co.yu.



+112 Profil

icon Re: Problem vezan za kreiranje vertexa (3D teren)27.03.2005. u 18:09 - pre 231 meseci
Posto znam da u proslom postu nisam bio bas najjasniji evo pokusacu
ponovo. Najbolje da pokusam da ti objasnim na najprostijem primeru
heightmappinga.
Recimo da imamo sliku u bmp formatu velicine 5*5 pixela.
Neka nam je to heightmapa.
Teksture necemo imati da ne bi komplikovao, a vrlo ih je lako dodati.
Nas cilj je da svaki pixel u heightmapi iskoristimo za visinu, tj. y koordinatu
jednog vertexa u nasem svetu. Naravno broj vertexa koje cemo imati u svetu mora odgovarati
broju pixela u heightmapi. Znaci ako je heightmapa 5*5 onda cemo imati i mapu opisanu
sa 5*5 vertexa.
Neka imamo strukturu:
Code:

typedef struct tagVertex
{
    float x,y,z
}Vertex;

Posto cemo za nas primer koristiti 5*5 heightmapu bice potrebno da rezervisemo memoriju za
25 vertexa:

Vertex Mapa[25];

takodje neka je heightmapa ucitana u niz bajtova:
byte data[25];

E sad cemo na najjednostavniji nacin da generisemo nas svet.
Zamisli da zelimo nasu mapu da krece iz koordinatnog pocetka.
Koordinate u XZ ravni cemo da postavimo da budu na konstantnim udaljenostima
jedna od druge. Na primer imacemo mapu 5*5 vertexa, tj. pet vrsta i pet kolona.
Kako se pozicija vertexa u mapi krece sa leva na desno, povecava se njegova x koordinata za 1.0;
Kako se pozicija vertexa u mapi krece odozgo na dole povecava se njegova z koordinata za 1.0;
Tako recimo vertex koji se u mapi nalazi na poziciji (0,0) imace x i z koordinatu jednaku 0.0;
Vertex koji se nalazi u mapi na poziciji (2,3) imace x koordinatu 2.0, a z koordinatu 3.0.

Kod bi isao otprilike ovako:
Code:

for( int z=0; z<5; z++)
{
    for(int x=0;x<5;x++)
    {
        Mapa[z * 5 + x].x = (float)x;    
        Mapa[z * 5 + x].y = data[z * 5 + x];
        Mapa[z * 5 + x].z = (float)z;
    }
}

Znaci ovo je najprostiji moguci primer, ali sam ga dao samo da bi bilo lakse da
provalis kako stvari funkcionisu.
U primeru nisam dao deo koda gde generises indexe za trouglove, jer to mozes uraditi na razne nacine,
pa cak i ne moras da radis ako u samoj petlji generises niz trouglova.
Znaci gore sam napisao samo nacin kako da generises matricu vertexa.
Ako razumes kako ovo gore funkcionise, javi mi da mogu da ti objasnim jos neke stvari
oko skaliranja, transliranja mape, postavljanja tekstura i slicno. Naravno ako
ti je to potrebno...

Q: Are there really any systems where
void main() doesn't work?
A: It has been reported that programs using void main() can crash.
Q: The book I've been using, _C Programing for the Compleat Idiot_,
always uses void main().
A: Perhaps its author counts himself among the target audience.
 
Odgovor na temu

speciebsp
Gorazde, BiH

Član broj: 52340
Poruke: 19
*.bih.net.ba.

Sajt: bspdx.cjb.net


Profil

icon Re: Problem vezan za kreiranje vertexa (3D teren)27.03.2005. u 18:49 - pre 231 meseci
Kao prvo jedno veliko hvala za ovo sto si napisao sve... Sa prvim primjerom si mi pojasnio zasto je dao [iY*128+iX], jer me je ovo zbunjivalo najvise i to uvjek kada sam zelio da kreiram svoj terrain... znam da je ovo brute force tehnika i da postoje vec neke tehnike kao sto je ROAM, ali za mene je dovoljno i ovo jer necu renderirati sve vertexe vec cu koristiti quadtree da odbacim ono sto player nevidi :)

Kao drugo dijeli sa 2 jer inkrementira sa 2...a inkrementira ih kako bi iz bitmape velicine 128*128 dobio teren velicine 256*256...


A sada odoh sve ovo implementirati pa ti posaljem screenshot ;)

Hvala jos jednom

 
Odgovor na temu

Nothingman

Član broj: 31375
Poruke: 308
*.mobtel.co.yu.



+112 Profil

icon Re: Problem vezan za kreiranje vertexa (3D teren)27.03.2005. u 20:47 - pre 231 meseci
Citat:
speciebsp:
Kao drugo dijeli sa 2 jer inkrementira sa 2...a inkrementira ih kako bi iz bitmape velicine 128*128 dobio teren velicine 256*256...


Sumnjao sam u tako nesto, mada to bas i nije najbolji nachin da se to uradi ;)


Citat:

A sada odoh sve ovo implementirati pa ti posaljem screenshot ;)


Jos bolje, postavi ovde link za igru kada je zavrsis ;)

Q: Are there really any systems where
void main() doesn't work?
A: It has been reported that programs using void main() can crash.
Q: The book I've been using, _C Programing for the Compleat Idiot_,
always uses void main().
A: Perhaps its author counts himself among the target audience.
 
Odgovor na temu

mloh2
Zoran Stupic
BG

Član broj: 62103
Poruke: 24
*.beotel.net.



Profil

icon Re: Problem vezan za kreiranje vertexa (3D teren)04.07.2005. u 13:43 - pre 228 meseci
Kad smo vec kod terena, ima li neko dobru ideju kako bi se organizovale klase?
Kako bi "izgledao" jedan OOP teren. Podrazumeva se da vertexi imaju boju i normalu,
i da je moguce imati vise tekstura na terenu. Negde trava, negde kamen...


 
Odgovor na temu

[es] :: 3D programiranje :: Problem vezan za kreiranje vertexa (3D teren)

[ Pregleda: 3823 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.