Simulacija 3D prostora od nule ( Softverski rendering ).
Mozemo zapoceti mali projekat softverskog renderinga pa ko zna neshto o ovome neka se ukljuci i da neke primere ili ideje:)
Lepo je znati kako 3D radi "ispod haube".
Evo objasnjenja na brzinu kako poceti sa softverskim renderingom.
Imamo tacku u prostoru sa koordinatama x, y i z.
Da bi je projektovali na ekran u koordinate sx i sy ( screen ), koristimo sledece obrasce...
1. Prvo, kao sto je poznato ljudima koji su iole podesavali kameru u DirectX i OpenGL, treba nam FOV ( Field-of-view ) koji se predstavlja kao ugao.
- alpha ( neka nam je alpha = 45 stepeni )
Moramo ga predstaviti u radijanima pomocu obrasca
- alphaRad = alpha*PI/180
2. Racunamo d, distancu do ravni projektovanja koja je:
- d = 1/tan(alphaDeg)
3. Racunamo projektovane tacke:
- sx = d*x/z;
- sy = d*y/z;
4. Jedan problemcic je sto tacka nije na sredini ekrana kao sto bi ocekivali... Resenje je da je pomerimo na sredinu ekrana
- sx = sirinaEkrana/2 + (d*x)/z;
- sy = visinaEkrana/2 + (d*y)/z;
/// I znaci
Ovde ima dosta problema ( z ne sme da bude nula, float vs int ( grrrr ).... ).
Za pocetak, ovo je trivijalni primer kako simulirati 3D prostor i koji je dovoljan za 'igranje' sa z koordinatom...
Inace, ovaj primer se mogao odraditi i matricnim transformacijama kao sto se i pokazuje u referentnim knjigama o OpenGL i DirectX.
Mozemo zapoceti mali projekat softverskog renderinga pa ko zna neshto o ovome neka se ukljuci i da neke primere ili ideje:)
Lepo je znati kako 3D radi "ispod haube".
Evo objasnjenja na brzinu kako poceti sa softverskim renderingom.
Imamo tacku u prostoru sa koordinatama x, y i z.
Da bi je projektovali na ekran u koordinate sx i sy ( screen ), koristimo sledece obrasce...
1. Prvo, kao sto je poznato ljudima koji su iole podesavali kameru u DirectX i OpenGL, treba nam FOV ( Field-of-view ) koji se predstavlja kao ugao.
- alpha ( neka nam je alpha = 45 stepeni )
Moramo ga predstaviti u radijanima pomocu obrasca
- alphaRad = alpha*PI/180
2. Racunamo d, distancu do ravni projektovanja koja je:
- d = 1/tan(alphaDeg)
3. Racunamo projektovane tacke:
- sx = d*x/z;
- sy = d*y/z;
4. Jedan problemcic je sto tacka nije na sredini ekrana kao sto bi ocekivali... Resenje je da je pomerimo na sredinu ekrana
- sx = sirinaEkrana/2 + (d*x)/z;
- sy = visinaEkrana/2 + (d*y)/z;
/// I znaci
Code:
float tacka[3]; // u prostoru ( ovde bi stajala neka Vertex ( ili Vector3 ) klasa )
int sTacka[2]; // projektovana ( Vector2 )
int screenWidth = 640;
int screenHeight = 480;
float alphaRad = 45*3.14f/180; // ugao od 45 stepeni
float d = 1/tan(alphaRad);
// tacka sa koordinatama {10, 10, 10}
tacka[0] = 10;
tacka[1] = 10;
tacka[2] = 10;
sTacka[0] = screenWidth/2 + (int)(d*x)/z;
sTacka[1] = screenHeight/2 + (int)(d*y)/z;
float tacka[3]; // u prostoru ( ovde bi stajala neka Vertex ( ili Vector3 ) klasa )
int sTacka[2]; // projektovana ( Vector2 )
int screenWidth = 640;
int screenHeight = 480;
float alphaRad = 45*3.14f/180; // ugao od 45 stepeni
float d = 1/tan(alphaRad);
// tacka sa koordinatama {10, 10, 10}
tacka[0] = 10;
tacka[1] = 10;
tacka[2] = 10;
sTacka[0] = screenWidth/2 + (int)(d*x)/z;
sTacka[1] = screenHeight/2 + (int)(d*y)/z;
Ovde ima dosta problema ( z ne sme da bude nula, float vs int ( grrrr ).... ).
Za pocetak, ovo je trivijalni primer kako simulirati 3D prostor i koji je dovoljan za 'igranje' sa z koordinatom...
Inace, ovaj primer se mogao odraditi i matricnim transformacijama kao sto se i pokazuje u referentnim knjigama o OpenGL i DirectX.
Potpis
EOF