Polygone sind komisch gestretcht
-
Hey!
Ich versuche momentan mit DirectX etwas zurechtzukommen und hab mir nen Milkshape Model loader gebaut um mal ein paar Modelle zu bewundern. Doch die waren alle irgendwie verzerrt.
Zum Beispiel in diesem Screenshot. In Milkshape sehe ich ein fast perfektes Quadrat, in meinem kleinen Programm (ungefähr gleiche Renderfenstergrösse) ist es aber verzerrt.
Wodran liegt das und wie kann ich das ändern?
-
Hast du das Verhältnis von Breite/Höhe in der Projektionsmatrix richtig berechnet?
-
Ähhm, Projektionsmatrix... Die ist doch (nach dem SDK) für Near und Far Clipping, Field of View (Das ist doch sowas wie ein Zoom-Faktor, oder. Kann mir das vielleicht wer mal genauer erklären, oder muss man dafür Mathe studiert haben
?) und Aspect ratio (Absolut keine Ahnung was das sein soll...) da.
Ich hab die in meinem Code folgendermassen gesetzt:
D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 10000000000000.0f ); m_Direct3DDev->SetTransform( D3DTS_PROJECTION, &matProj );
So ähnlich wurde das auch in den SDK tutorials gemacht.
-
aspect ratio = Seitenverhältnis
-
MSDN schrieb:
Parameters
pOut
[in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
fovY
[in] Field of view, in the y direction, in radians.
Aspect
[in] Aspect ratio, defined as view space height divided by width.
zn
[in] Z-value of the near view-plane.
zf
[in] Z-value of the far view-plane.Die Aspect ratio ist genau dass was du brauchst, die beschreibt nämlich das Verhältnis von der Höhe zur Breite deines Fensters. Wenn du da 1 stehen hast geht DX davon aus dass das Fenster genauso hoch wie breit ist, was aber bei deinem nicht der Fall ist wie man auf dem Screenshot ganz deutlich sehen kann.
-
Okay, also wenn mein Renderfenster (bzw. Bildschirmauflösung bei Vollbild) 800x600 gross ist, muss ich für Aspect 600/800 = 0,75 einsetzen. Hab ich gemacht, allerdings ändert sich nichts an der verzogenen Darstellung.
-
Ist denn dein Fenster 800x600 groß? Genauer gesagt zählt eigentlich nur der Bereich in den DX zeichnet.
-
RECT R; GetClientRect(hWnd, &R); D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, (float)(R.bottom-R.top)/(float)(R.right-R.left), 1.0f, 10000000000000.0f ); m_Direct3DDev->SetTransform( D3DTS_PROJECTION, &matProj );
Also Aspect Ratio ist jetzt ClientHeight/ClientWidth. Ändert aber nichts an der verzerrten Darstellung. Momentan siehts so aus (diesmal mit Textur).
-
godlikebot schrieb:
Okay, also wenn mein Renderfenster (bzw. Bildschirmauflösung bei Vollbild) 800x600 gross ist, muss ich für Aspect 600/800 = 0,75 einsetzen. Hab ich gemacht, allerdings ändert sich nichts an der verzogenen Darstellung.
Isses dann nicht NOCH krasser?!?
IIRC gehört da einfach das Standard-Seitenverhältnis rein!
Da wir üblicherweise 4:3-Monitore benutzen (d.h. 4 Teile breit & 3 Teile hoch) - im Gegensatz zu z.B. 16:9-Fernsehern / -Monitoren, muß da doch eher 1.333333333f rein?!Denn 4 : 3 = 1 1/3 = 1.33333...
bzw. alle Standardauflösungen:
640 : 480 = 800 : 600 = 1024 : 768 = 1280 : 960 = 1600 : 1200 = 4 : 3 = 1.33333...
-
Sgt. Nukem schrieb:
[...]muß da doch eher 1.333333333f rein?!
Jupp, jetzt siehts richtig aus.
Aber, auf die Gefahr hin, dass ich mich total zum Affen mache, bedeutet "Aspect ratio, defined as view space height divided by width." nicht: Höhe geteilt durch Breite, also 3 geteilt durch 4???
-
Aber nochmal zu meiner Frage: Ist das jetzt ein Fehler in der SDK doku oder in meiner Denkweise ???
[edit='rapso']bleibt beim thema[/edit]