[ milas @ 16.08.2004. 19:09 ] @
Imao bih nekoliko pocetnickih pitanja u vezi DirectX-a.

1. Ako je definisan Vertex ovako:

Code:
 struct Vertex
{
    float  _x,  _y,  _z;
    float _nx, _ny, _nz;
    static const DWORD FVF;
};


i onda ako popunim Vertex Buffer sa ovim verteksima
Code:
// popuni bafere sa podacima kocke
Vertex* verteksi;
VertexBuffer->Lock(0, 0, (void**) &verteksi, 0);
    // prednja strana
    verteksi[0] = Vertex(-1.0f, 0.0f, -1.0f, 0.0f, 0.707f, -0.707f);
    verteksi[1] = Vertex( 0.0f, 1.0f, 0.0f, 0.0f, 0.707f, -0.707f);
...

i onda kada zelim da crtam to radim ovako:
Code:
Device->SetStreamSource(0, VB, 0, sizeof(Vertex));
Device->SetFVF(Vertex::FVF);
Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

Pitanje je kako DrawPrimitive zna sta se nalazi u strukturi Vertex i kako to koristi. Inace ovaj primer je iz knjige i nije mi bas jasno zasto koristi ove promenljive _nx, _ny i _nz, a to koristi za crtanje jednostavne piramide ?

2. Zasto je ovo
Code:
D3DX_PI * 0.5f
jednako 90 stepeni ?

3. Da li neko moze malo bolje mi objasni funkcije D3DXMatrixLookAtLH i D3DXMatrixPerspectiveFovLH?


[ glorius @ 16.08.2004. 20:20 ] @
Cao.

1)
Zasto je D3DX_PI * 0.5f ?
Hmm... Matematika ti nije bas najbolja strana.
D3DX_PI je PI u matematici.
PI = 3.141592653589 itd Predstavlja ugao u radijanima.
Ugao u stepenima se dobija kada se ugao u radijanima pomnozi sa 180 i podeli sa 3.1415... to jest sa PI.
Znaci PI*180/PI = 180 stepeni a PI*0.5f je u stvari (PI/2)*180/PI = 90 stepeni!

2)
D3DXMatrixLookAtLH:

D3DXMATRIX* D3DXMatrixLookAtLH(
D3DXMATRIX* pOut,
const D3DXVECTOR3* pEye,
const D3DXVECTOR3* pAt,
const D3DXVECTOR3* pUp
);

pOut - "popunjava" rezultujucu matricu
pEye - Vektor koji definise gde se nalazi "oko" kamere
pAt - Vektor koji definise gde je uperen vektor kamere
pUp - Vektor koji je obicno (0, 1, 0) i oznacava orijentaciju kamere. (0, 1, 0) znaci da je gornji deo kamere po y osi. Nisam bas nesto ovo objasnio ali neka te ovaj parametar ne zamara i neka bude (0, 1, 0).

D3DXMatrixPerspectiveFovLH:

D3DXMATRIX* D3DXMatrixPerspectiveFovLH(
D3DXMATRIX* pOut,
float fovy,
float aspect,
float zn,
float zf
);


Ako si neki put radio u 3D MAX-u video si opcije za kameru 30mm, 50mm, 200mm itd. E to je FOV ( koji je parametar ove f-je - fovy). FOV - Field of View i on je u radijanima ( oni su ti sada malo jasniji ).

aspect je odnos izmedju duzine i sirine ekrana. NPR bioskopski ekran je 16:9 i njegov aspect je 16/9 = 1.777. Ekran rezolucije 800*600: njegov aspect je 800/600 = 1.333. Experimentisi sa ovim vrednostima i dobijaces suzenje slike ili tako nesto.

zn - near clip-plane:
zf - far clip-plane:

Scena ima svoju dubinu relativno na kameru. Sve sto je izmedju vrednosti zn i zf ce se renderovati. NPR: Napravis sferu i zadas koj koordinate (0, 0, 100). Ako stavis zn = 1.0f i zf = 200 sfera je u opsegu kamere i bice renderovana ali ako stavis za poziciju sfere (0, 0, 1000) ona se nece renderovati. Pogledaj malo SDK help ako ti knjiga ne pomaze mada bi mogao da mi kazes gde si nabavio knjigu.

Pixel po pixel ... Out of memory!
[ milas @ 16.08.2004. 21:14 ] @
Hvala na odgovoru!
Knjiga je "DirectX 9 - programiranje grafike i igara", pisac je Tom Miler, a izdavac Kompjuter biblioteka Cacak. Inace radi se o Managed DicrectX-u u jeziku C#.
[ Nothingman @ 16.08.2004. 21:37 ] @
Citat:

Pitanje je kako DrawPrimitive zna sta se nalazi u strukturi Vertex i kako to koristi. Inace ovaj primer je iz knjige i nije mi bas jasno zasto koristi ove promenljive _nx, _ny i _nz, a to koristi za crtanje jednostavne piramide ?


Nisam nikada radio u D3D ali pretpostavljam da nx,ny i nz prestavljaju normalni vektor(svaki vertex bi trebao da ima po jedan) koji se koristi kod osvetljenja. Covek koji je pisao knjigu verovatno od pocetka zeli da u strukturi vertex obezbedi prostor za te normale jer zna da ce mu kasnije trebati.
Koliko vidim iz koda koji si postavio ti si pre poziva funkcije pozvao i neku funkciju setstreamsource u kojoj si kao parametar predao velicinu strukture vertex. Znaci sada posto directx zna kolika je velicina te strukture vise nema nikakvih problema da funkcija drawprimitive nju koristi za renderovanje. Posto si joj rekao da zelis da crta trouglove ona sada jednostavno moze da iz svake pojedinacne strukture u listi koristi recimo prvih 12 bajta za x,y i z a onda da inkrementira pointer za velicinu te strukture i tako dodje do sledecih x,y,i z(novih 12 bajta)...
Posto ja nemam pojma o DX ovo sto sam gore napisao uopste ne mora da bude tako ali samo sam ti hteo dati ideju kako je to moguce implementirati.
[ Nothingman @ 16.08.2004. 21:48 ] @
Citat:

Knjiga je "DirectX 9 - programiranje grafike i igara", pisac je Tom Miler, a izdavac Kompjuter biblioteka Cacak. Inace radi se o Managed DicrectX-u u jeziku C#.


Kakva je knjiga? Jel se dobije cd sa nekim demoima na njoj? Koliko kosta? I za kraj kako si ti u LA dosao do nje? :)
[ bokash @ 16.08.2004. 22:52 ] @

Citat:
Pitanje je kako DrawPrimitive zna sta se nalazi u strukturi Vertex i kako to koristi. Inace ovaj primer je iz knjige i nije mi bas jasno zasto koristi ove promenljive _nx, _ny i _nz, a to koristi za crtanje jednostavne piramide ?

Citat:
1. Ako je definisan Vertex ovako:

Code:
struct Vertex
{
float _x, _y, _z;
float _nx, _ny, _nz;
static const DWORD FVF;
};


Treba jos i ovo:
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL;
Onda zna iz deklaracije velicinu vertexa, sta sadrzi i redosled.
A normali su za lightning i sl.
[ milas @ 17.08.2004. 01:50 ] @
L.A. - Lazarevac, S&CG. Knjiga kosta 1000 din. i ima dosta demoa, kao i DirectX update summer 2003 SDK. Knjiga je vrlo dobra za pocetnike jer je i namenjena za nekoga ko samo zna osnove programiranja! Ali, ponovo kazem tu se radi sa Managed DirectX-om i u jeziku C#.
[ Reljam @ 17.08.2004. 02:40 ] @
Hehe, ovo je vec drugi put. Obicno je L.A. = Los Angeles, a LA = Lazarevac. Razlika u tim tackicama je ogromna. :)

Normale moras da imas da bi strane piramide imale razlicitu boju, jer ako nema normale, onda bi cela piramida bila iste boje. To ne zvuci toliko lose, ali to u stvari znaci da bi svi pikseli u piramidi imali istu boju, i ne bi video onu ivicu piramide koja je okrenuta ka tebi. Drugim recima, u vecini slucajeva bi video jedan deformisan trougao.
[ milas @ 23.08.2004. 21:12 ] @
Imao bih jos nekoliko pocetnickih pitanja u vezi DirectX-a:

1. Sta znace sledece stvari:
Code:

IDirect3DDevice9->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
IDirect3DDevice9->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
IDirect3DDevice9->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);


i
Code:

IDirect3DDevice9->SetRenderState(D3DRS_ZWRITEENABLE, false);
IDirect3DDevice9->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
IDirect3DDevice9->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
IDirect3DDevice9->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
IDirect3DDevice9->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);
IDirect3DDevice9->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
IDirect3DDevice9->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

2. Kada je svetlo ovako usmereno:
Code:
D3DXVECTOR3 smerSvetla(0.707f, -0.707f, 0.707f);

gde se ono tacno nalazi u xyz prostoru?

3. Sta rade funkcije:

Code:
D3DXMatrixShadow
i
Code:
D3DXMatrixReflect


i sta predstavlja
Code:
D3DXPLANE
struktura ?

4. Sta znaci ova pozicija kamere (gde gleda):

Code:
D3DXVECTOR3 pozicija( cosf(ugao) * radius, 3.0f, sinf(ugao) * radius );
[ bkaradzic @ 23.08.2004. 21:33 ] @
Citat:
milas:
2. Kada je svetlo ovako usmereno:
Code:
D3DXVECTOR3 smerSvetla(0.707f, -0.707f, 0.707f);

gde se ono tacno nalazi u xyz prostoru?


Nigde. Ne možeš na osnovu smera da odrediš poziciju. Ako se radi o directional light onda ti je dovoljno da znaš samo smer jer pozicija nije bitna za izračunavanje osvetljenja. Podrazumeva se da je svetlo beskonačno udaljeno od objekta i zraci su paralelni.

Citat:
milas:
4. Sta znaci ova pozicija kamere (gde gleda):

Code:
D3DXVECTOR3 pozicija( cosf(ugao) * radius, 3.0f, sinf(ugao) * radius );


Opet nigde, jer ne možeš na osnovu jedne pozicije da odrediš smer. Moraš imati dve pozicije, tj. poziciju kamere (Eye) i poziciju gde kamera gleda (LookAt).

Trebao bi malo da prelistaš knjigu iz matematike. ;)

Odgovore na sva ostala pitanja možeš naći u DirectX SDK Help-u. directx9_c.chm fajl koji dobijaš uz DirectX 9 SDK.

Branimir
[ milas @ 23.08.2004. 22:18 ] @
Da li moze neko da mi odgovori na pitanja?!

Napomena: u ni jednom pitanju nisam trazio da mi neko kaze da to svetlo ili kamera gleda u 3.4,5.7,4.5 tacku, nego samo princip rada tih funkcija!!!
[ bkaradzic @ 23.08.2004. 22:57 ] @
Citat:

Napomena: u ni jednom pitanju nisam trazio da mi neko kaze da to svetlo ili kamera gleda u 3.4,5.7,4.5 tacku, nego samo princip rada tih funkcija!!!


Pitao si:

Citat:

2. Kada je svetlo ovako usmereno: gde se ono tacno nalazi u xyz prostoru?
4. Sta znaci ova pozicija kamere (gde gleda):


U Srpskom jeziku kada pitaš "gde se tačno nalazi" to znači da te interesuje pozicija, a kada pitaš "gde gleda" onda to znači da te interesuje smer. Odgovore na pitanja koja si postavio si dobio. Pitanja 2. i 4. nemaju veze sa funkcijama (osim sinf i cosf). U oba slučaja se radi o konstruktoru D3DXVECTOR3 klase.

Odgovori na ostala pitanja bi bili suvišni pored detaljne MSDN dokumentacije. RTFM!

Branimir