[ Srki_82 @ 08.08.2004. 02:24 ] @
Ucitavam mesh iz X fajla koji moze biti bilo koje velicine. Pravim program koji ce taj mesh da smanji na velicinu koja ce stati u BoundingSphere precnika R i da ga nacrta tako da njegov centar bude na koordinatama X, Y, Z
Deo koda izgleda ovako:

Ovako odredjujem koordinate centra mesh-a i odredjujem koliko ga treba smanjiti.

Code:

D3DXVECTOR3* pData; 
g_pMesh->LockVertexBuffer( 0, (LPVOID*) &pData );
float g_fObjectRadius;

D3DXComputeBoundingSphere( pData, g_pMesh->GetNumVertices(),
  D3DXGetFVFVertexSize( g_pMesh->GetFVF() ), &g_vObjectCenter,
  &g_fObjectRadius );

g_pMesh->UnlockVertexBuffer();
ar = R / g_fObjectRadius; // R je precnik lopte u koju zelim da mesh stane
D3DXMatrixScaling( &matScale, ar, ar, ar );


Ovako koliko treba da pomerim mesh

Code:

D3DXMatrixTranslation( &matTrans, X - g_vObjectCenter.x,
  Y - g_vObjectCenter.y,
  Z - g_vObjectCenter.z );


Zatim te matrice pomnozim i postavim ih kao World matricu

Code:

D3DXMatrixMultiply( &matWorld, &matTrans, &matScale );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );


I sad kad postavim sledece matrice

Code:

D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

D3DXVECTOR3 vEyePt( X , Y + 4, Z );
D3DXVECTOR3 vLookatPt( X , Y, Z );
D3DXVECTOR3 vUpVec( 0.0f, 0.0f, 1.0f );
D3DXMATRIX matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );


i postavim X = 0.0f, Y = 0.0f, Z = 5.0f, R = 0.2f na ekranu se ne vidi mesh... vidi se negde na otprilike 0, 0, 0 + nesto malo.

Probao sam i da matrice sa skaliranje i translaciju mnozim drugim redosledom, ali se i onda mesh ne nalazi tamo gde treba... ili mozda ne znam kako treba da postavim kameru i perspektivu.
[ Reljam @ 08.08.2004. 03:37 ] @
Hm, ovo izgleda ok. Ti namestis objekat na (X, Y, Z) kameru na (X, Y+4, Z) i onda valjda i treba objekat da se nalazi na (0, 0, 0) na ekranu, zar ne?

Moguce da nisam dobro shvatio pitanje, tako da okaci ovde program pa da pogledamo ako i dalje ne radi - ili mi posalji na mail.
[ Srki_82 @ 08.08.2004. 12:16 ] @
Pronasao sam gresku. Negde u programu sam X stalno postavljao na 0.5f pa zato nije radilo kako treba.

Imam jos jedno pitanje. Kada imam vise objekata koji trebaju da se iscrtaju na razlicitim mestima u prostori uvek sam postavljao matricu za projekciju i kameru na pocetku i onda prilikom crtanja menjao world matricu za svaki objekat. Da li se to tako radi ili ima neki bolji nacin?
[ Reljam @ 08.08.2004. 18:08 ] @
Ne, potrebno je samo da namestis world matricu.

Malo pojednostavljeno, to izgleda ovako:
World matrix - SRT (skaliranje, rotacija, translacija) jednog konkretnog objekta u svetu
View matrix - SRT tvoje kamere (i to obicno inverzne)
Projection matrix - Prebacivanje iz prostora kamere u prostor 'ekrana'

Znaci projection matrix ti je isti za ceo program.
View matrix ti se menja od frame-a do frame-a, u zavisnosti od toga kako ti se pomera kamera.
World matrix se menja nekoliko puta po frameu, svaki objekat ima svoju.

Nadam se da ovo pomaze.
[ Nothingman @ 08.08.2004. 22:21 ] @
Citat:

Ne, potrebno je samo da namestis world matricu.

Malo pojednostavljeno, to izgleda ovako:
World matrix - SRT (skaliranje, rotacija, translacija) jednog konkretnog objekta u svetu
View matrix - SRT tvoje kamere (i to obicno inverzne)
Projection matrix - Prebacivanje iz prostora kamere u prostor 'ekrana'

Znaci projection matrix ti je isti za ceo program.
View matrix ti se menja od frame-a do frame-a, u zavisnosti od toga kako ti se pomera kamera.
World matrix se menja nekoliko puta po frameu, svaki objekat ima svoju.

Nadam se da ovo pomaze.


A najbolje bi ti bilo da procitas knjige od Lamotha i Abrasha(Tricks of the 3d programming gurus i Black book, vec mnogo puta spominjane na ovom forumu)
i da shvatis zasto je ovo sto je Reljam napisao bas tako.
[ Srki_82 @ 09.08.2004. 17:56 ] @
Tako ja i radim. Mozda sam malo cudno napisao. Znaci na pocetku programa podesim matricu za projekciju i kameru (ne menjam vise ni jednu jer se u mom slucaju kamera ne krece) i posle samo menjam World matricu za svaki objekat. Kad mi se kamera krece onda na pocetki podesim matricu za projekciju, View matricu postavim na identity (te dve matrice vise ne diram), a World matrica mi je ustvari World matrica * matrica kamere. U DXSDK pise da je bolje da se samo jedna matrica (World) menja, a ne i World i View.
[ Reljam @ 09.08.2004. 19:18 ] @
Jeste, sve sto si napisao je tako.

Sto se tice menjanja samo jedne ili obe matrice, to se vise odnosi na high-performance programe. Ako pravis nesto sto samo vrti par objekata na ekranu, bice ti lakse da koristis i World i View.