window scaling hassle

Started by
1 comment, last by anotherfantasy 22 years, 2 months ago
i have this annoying problem i need help with. if i make a window for direct x that is num x num in dimensions (width and height are the same) i can draw a 1.0f x 1.0f square and it will actually look like a square. if the window dimensions are different (if i initiate them differently or resize a 600x600 window), the polygon looks like a rectangle because it got streched in only one dimension. maybe i''m not using the aspect ratio corretly... but how do i make it so that when i resize a window, the contents inside are scaled properly in all 3 dimensions? this is my matrix code... the program window size is 640 x 480 D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj ); i believe the 3rd parameter is the aspect ratio correct? i tried changing it to (float)640/480 and (float)480/640 and any other weird numbers but nothing on the window changes.
There''s an astronomical difference in being the best and being the best of the best.
Advertisement
The aspect ratio is the ratio between the width and height of the display. A 1:1 (the 1.0) means that the width and height are identical. If you are using a 640x480 resolution, then use a ratio of 1.333333 (which is 640/480). I use the following settings that always work for me:

D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.333333f, 1.0f, 10000.0f);

Jim Adams
For any window use this code:

RECT rc;
GetClientRect(hwndRender, &rc);
D3DXMatrixPerspectiveFovLH(..., float(rc.right)/rc.bottom, ...);

Note that you need float cast so that you don''t do integer division.

You might want to put this code also in your WM_SIZE handler. Since there is no way to change back-buffer size on the fly, when your window is resized you need to destroy d3d device and recreate it.
---visit #directxdev on afternet <- not just for directx, despite the name

This topic is closed to new replies.

Advertisement