Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1408 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°148089
Ace17
Posté le 30-05-2002 à 18:19:34  profilanswer
 

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:

mood
Publicité
Posté le 30-05-2002 à 18:19:34  profilanswer
 

n°148128
bjone
Insert booze to continue
Posté le 30-05-2002 à 19:02:19  profilanswer
 

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)

n°148941
Ace17
Posté le 01-06-2002 à 09:50:15  profilanswer
 

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

n°148951
bjone
Insert booze to continue
Posté le 01-06-2002 à 10:57:44  profilanswer
 

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]

n°148952
bjone
Insert booze to continue
Posté le 01-06-2002 à 10:59:22  profilanswer
 

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

n°148953
Ace17
Posté le 01-06-2002 à 11:08:19  profilanswer
 

(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]

n°148958
Ace17
Posté le 01-06-2002 à 11:32:04  profilanswer
 

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]

n°148970
LeGreg
Posté le 01-06-2002 à 12:04:02  profilanswer
 

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

n°148975
LeGreg
Posté le 01-06-2002 à 12:08:25  profilanswer
 

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

n°148990
Ace17
Posté le 01-06-2002 à 12:28:50  profilanswer
 

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]

mood
Publicité
Posté le 01-06-2002 à 12:28:50  profilanswer
 

n°149133
bjone
Insert booze to continue
Posté le 01-06-2002 à 19:52:51  profilanswer
 

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...

n°149214
Ace17
Posté le 02-06-2002 à 10:53:06  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
Comment mettre un hebergeur qui gére ()mail en ()email (script)[ JAVA ] Newbie complet veut s'y mettre...
Que mettre comme serveur SMTP ?Mettre un scrollbar dans un popup
Feuille de style : le code pour mettre une image en background ?[PHP] help qqn peut-il me corriger mon expression régulière svp ?
[vb6]mettre une musique dans mon prog ![PHP-FLASH] mettre du PHP par dessus une animation flash?
[Flash] Mettre une bordure de couleur à un élément flash ?[VB] Comment detecte le CTRL + ENTER dsune form sans le mettre partou?
Plus de sujets relatifs à : [D3D8] Comment corriger un viewport pour le mettre au bon ratio?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR