Comment corriger un viewport pour le mettre au bon ratio? [D3D8] - Programmation
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)
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
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]
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....
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]
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
Et maintenant quand je mets aspect = m_cx / m_cy
[jfdsdjhfuetppo]--Message édité par Ace17 le 01-06-2002 à 11:34:26--[/jfdsdjhfuetppo]
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
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
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 ...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]
Marsh Posté le 01-06-2002 à 19:52:51
Ace17 a écrit a écrit : Bon ben je suis bon pour aller me jeter ...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...
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
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!