[D3D8] Comment corriger un viewport pour le mettre au bon ratio?

Comment corriger un viewport pour le mettre au bon ratio? [D3D8] - Programmation

Marsh Posté le 30-05-2002 à 18:19:34    

Dans mon systeme il y a plusieurs vues de la meme scene, sous des angles différent. Chaque vue est en fait un viewport et mon probleme est que le contenu du viewport est stretché pour rentrer dans le viewport. A la rigueur ca ne me generait pas mais je voudrais surtout que le contenu soit streché avec le bon ratio et non pas en fonction des dimensions du viewport! Par exemple, si mon viewport est aplati, l'image dedans va l'etre aussi, et ca je ne veux pas.  
J'ai trouvé un début d'explication, une histoire de corriger le ratio dans la matrice de projection mais je n'ai pas tout compris. Quelqu'un pourrait m'expliquer?
 
Merci!  :hello:

Reply

Marsh Posté le 30-05-2002 à 18:19:34   

Reply

Marsh Posté le 30-05-2002 à 19:02:19    

si je me plantes pas,  
 
D3DXMATRIX* D3DXMatrixPerspectiveFovLH(
  D3DXMATRIX* pOut,
  FLOAT fovy,
  FLOAT Aspect,
  FLOAT zn,
  FLOAT zf
);  
 
c'est ton aspect ratio qui est planté...
 
le fovy indique ton champ de vision vertical et pas horizontal (ce qui est po naturel je trouve)
 
aspect=width/height
 
comme ça: fovx = aspect*fovy
 
fovy = fovx/aspect (si tu veux travailler comme moa en champ de vision horizontal...)
 
(le champ de vision horizontal = aspect * champ de vision vertical)

Reply

Marsh Posté le 01-06-2002 à 09:50:15    

Ouais mais le probleme c'est que cette fonction suppose que le viewport est carré, or c'est pas mon cas

Reply

Marsh Posté le 01-06-2002 à 10:57:44    

arf et tu crois qu'en 1600*768 t'est carré ?
 
c'est l'aspect ratio qui indique le rapport largeur/hauteur, et la routine attends le champ de vision vertical...
 
si tu as un viewport en 400x300 (w=400 h=300)
 
aspect=400/300=1.33333
 
donc tu passes TOUJOURS ce rapport
et ensuite dane le fovy soit tu passes le champ de vision vertical, mettons 70° (1.22 radians). mais c'est pas naturel.
 
si tu veux travailler en champ de vision -horizontal-, et que tu veux 90° de champ de vision, tu passes:
 
fovx=aspect*fovy    (vu que aspect=w/h)
fovy=fovx/aspect
fovy=90°/1.3333333=67.5° => 1.17 radians

 

[jfdsdjhfuetppo]--Message édité par bjone le 01-06-2002 à 10:58:33--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 01-06-2002 à 10:59:22    

d'ailleurs pense à tester tes volumes 3d contre la view frustum avec une bounding box, ou une sphere d'enveloppe....

Reply

Marsh Posté le 01-06-2002 à 11:08:19    

(m_posx, m_posy, m_cx, m_cy sont les dimensions et la position du viewport)
 
Voici le code lors de l'initialisation de l'objet fenetre:
 
 
 float nearp = 1.0f;
 float farp = 100.0f;
 
 float aspect = float(m_cx)/float(m_cy);
 
 D3DXMatrixPerspectiveFovLH(&m_MatProj, (D3DX_PI/2)/aspect, aspect, nearp, farp);
 m_Device->SetTransform(D3DTS_PROJECTION, &m_MatProj);
 
Voici le code du rendu :
 D3DVIEWPORT8 viewport;
 
 viewport.X = m_posx;
 viewport.Y = m_posy;
 viewport.Width = m_cx;
 viewport.Height = m_cy;
 viewport.MinZ = 0.0f;
 viewport.MaxZ = 1.0f;
 
 
 m_Device->SetViewport(&viewport);
 
 m_Device->BeginScene();
 m_pScene->Render();
 m_Device->EndScene();
 
Il me semble avoir suivi tes indications, pourtant les objets continuent de se déformer selon les dimensions du viewport.
Je précise que le viewport n'occupe *pas* tout l'écran

 

[jfdsdjhfuetppo]--Message édité par Ace17 le 01-06-2002 à 11:09:33--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 01-06-2002 à 11:32:04    

je précise que chaque rectangle est un viewport différent
On a donc 4 viewports en tout, dont un en fond qui prend tout l'écran
 
Voici ce que ca donne quand je mets aspect = 1
http://ace17.free.fr/viewports.gif
 
Et maintenant quand je mets aspect = m_cx / m_cy
http://ace17.free.fr/viewports2.gif

 

[jfdsdjhfuetppo]--Message édité par Ace17 le 01-06-2002 à 11:34:26--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 01-06-2002 à 12:04:02    

voila mon code d'init:
 
D3DXMatrixPerspectiveFovLH( (D3DXMATRIX*)&proj, D3DX_PI/4, (float)viewport->SizeX/(float)viewport->SizeY, 10.0f, 5000.0f );
 
A+
LeGreg

Reply

Marsh Posté le 01-06-2002 à 12:08:25    

autre chose est-ce que tu changes de matrice de projection entre tes viewports sachant que l'aspect change??
 
LeGreg

Reply

Marsh Posté le 01-06-2002 à 12:28:50    

legreg a écrit a écrit :

autre chose est-ce que tu changes de matrice de projection entre tes viewports sachant que l'aspect change??
 
LeGreg  




 
Bon ben je suis bon pour aller me jeter :D...c'était tout simplement un bug..... Hé ouais, meme si ils avaient chacun leur matrice ils ne la redonnaient pas a m_Device quand c'était leur tour de faire le rendu... Bon ben merci!

 

[jfdsdjhfuetppo]--Message édité par Ace17 le 01-06-2002 à 12:29:07--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 01-06-2002 à 12:28:50   

Reply

Marsh Posté le 01-06-2002 à 19:52:51    

Ace17 a écrit a écrit :

 
 
Bon ben je suis bon pour aller me jeter :D...c'était tout simplement un bug..... Hé ouais, meme si ils avaient chacun leur matrice ils ne la redonnaient pas a m_Device quand c'était leur tour de faire le rendu... Bon ben merci!  
 
 




 
bin oui, il me semble pas que chaque viewport a sa propre matrice de projection...

Reply

Marsh Posté le 02-06-2002 à 10:53:06    

bjone a écrit a écrit :

 
 
bin oui, il me semble pas que chaque viewport a sa propre matrice de projection...  




 
Oui c'était le cas mais j'oubliais de mettre SetTransform avant chaque rendu

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed