Größenordnungs(?)-Phänomen mit d3d und Vertexbuffern
-
Guten Tag.
Ich hatte mir vor kurzem vorgenommen in die 3d-Programmierung
einzusteigen, dabei wollte ich ein schlichtes "2D"-Memory Spiel
basteln(Die Kartengraphik wird auf zwei zum Quadrat gelegte Dreiecke geklebt), dessen 3D-elemente darauf beschränkt sind, die Kamera
frei(wenn auch stets mit einem Fokus auf das Spielfeld) im Raum zu bewegen (um ein wenig mit dem Matrizengedöns
herumzuexperimentieren).Für diesen Zweck habe ich zwei Projekte begonnen.
Im ersten wollte ich erst ein paar Experimente machen um überhaupt erst mal zu schauen was ich so zu tun habe und im zweiten Projekt wollte ich dann das Spiel richtig beginnen.Da gab es nur ein kleines Problem oder eher Phänomen.
Die Größenordnung hat sich beim Wechsel zum zweiten Projekt ganz plötzlich geändert.Mein Fenster habe ich mit einer Breite und Höhe von 612 Pixeln erstellt, die selben Werte gab ich auch für den Backbuffer an.
Für "Field of View" gab ich D3DX_PI/4 an und für diese Aspektratio 1.0f (ist halt gleiche Breite und Höhe).
Die near-clipping-plane bekam einen Wert von 1.0f und die weiter hinten einen Wert von 500.0f.Shön und gut, diese Werte wurden für beide Projekte angegeben.
Das seltsame war nur, dass im ersten Projekt (das zum experimentieren) die near-clippingplane (also der z-Wert von 1.0f) in Breite und Höhe genau der Backbuffergröße entsprach und ich somit innerhalb der nc-plane mit den Vertexdaten genau wie mit Pixeln rechnen konnte, im zweiten Projekt jedoch erst einen z-Wert von 309.0f einstellen musste um diese Situation zu erreichen.Man könnte sich jetzt denken, im zweiten Projekt müsste ich irgendwas anders gemacht haben (natürlich habe ich das weiß nur nicht was, aber da kommt noch mehr, sonst würde ich es nicht phänomen nennen -- denn ...), doch als ich verwirrt wieder das erste Projekt gestartet hatte, waren die Graphiken plötzlich viel zu groß dargestellt, von der 8x8 Kartenreihe war im ganzen Bild nur noch eine Ecke auf dem ganzen Fenster zu sehen.
Der einzige Unterschied bis zum diesem Punkt bei beiden projekten bestand darin, dass ich beim ersten Projekt erst mit D3DXMATRIXOrthoLH begonnen hatte und es erst später auf D3DXMatrixPerspectiveFovLH umstellte(sah auch danach noch normal aus), während ich beim zweiten Projekt sofort D3DXMatrixPerspevtiveFovLH verwendet habe.
Meine Frage wäre also nun:
Welche Werte müssten wie gesetzt sein, damit Vertexdaten innerhalb der Near-Clippingplane so verwendet werden könnten, als seien sie pixel?Beispiel:
Fensterhöhe 500
Fensterbreite 500Ein aus Dreiecken bestehendes Quadrat mit den den Werten:
(Fensterursprung unten links)
0, 0, 1 - unten links
0, 250, 1 - oben links
250, 250, 1 - oben rechts
250, 0, 1 - unten rechtsWs müsste man nun tun, damit dieses Quadrat das Fensterviertel unten links einnimt und nicht das ganze Fenster bedeckt geschweige denn weit darüber hinausreicht?
(vorraussetzung ist jedoch, das Quadrat liegt in der Nearclippingplane und Ursprung ist bereits unten links)
-
wenn ich dich richtig verstehe, willst du also das machen:
Ein Viereck, welches im Raum schwebt, also wirklich koordinaten im raum hat, soll in der perspektive mit kamera usw so groß sein, dass es ein viertel des bildschirmes einnimmt? Das ist sehr schwierig. Dazu müsstest du die Transformation quasi zurückrechnen, also von der darstellung zu den koordinaten. Musst also Prjektions und sichtmatrix invertieren und damit irgendwie rumrechnen. Wie, das weiß ich nciht.
Wenn man 2D-Grafiken haben möchte, also Dreicke und vierecke direkt in pixelkoordinaten angeben will, dann macht man eigentlich folgendes:
Entweder du machst eine orthogonale sicht oder projektionsmatrix (weiß jetzt nciht welche) und dann wird der z-wert nicht mehr beachtet.
Oder (so würde ich es machen) du nimmst direkt transformatierte vertizes. Die heißen so. Haben als FVF anstatt D3DFVF_XYZ D3DFVF_XYZRHW. Dann kannst du die x- und y-Werte direkt setzen. rhw setzt du auf 1, z zwischen 0 und eins und dann müsste es eigentlich klappen. Diese Objekte werden dann allerdings nicht mehr durch die transformationspipeline geschickt, also kamera-matrix und translationsmatrix usw werden nicht beachtet.Aso, dritte möglichkeit wäre ID3DXSprite zu verwenden.
-
Dieses Quadrat auszurichten ist ja kein Problem, das schaffe ich auch.
Das hier beschriebene Problem ist ja keines was mich im Moment wirklich aufhält.
Doch weswegen ich hier schreibe ist, dass ich dieses Quadrat bei absolut selber Größe im ersten Projekt direkt auf die Near-Clippingebene legen musste um mein Ziel zu erreichen und bei meinem zweiten Projekt den Z-Wert auf 309.0f setzen musste, das fand ich halt seltsam.Dieses Quadrat ist auch schon zu einem Würfel angewachsen.
Es soll ja irgendwann ein 3D-Spiel werden weswegen sich die Orthogonale Projektion usw. nicht wirklich anbieten für meine Experimente auf den Weg dahin, aber danke für den Hinweis.Inzwischen bin ich mit dem Problem auch ein klein wenig weiter gekommen.
Im ersten Projekt habe ich die Entfernung zwischen zwei Vertices z.B. mit "128.0f" angegeben.
Seit Auftreten meines hier beschriebenen Problems erwartet D3D jedoch eine Angabe von "0.128f" für den Selben Effekt.
Jedoch kann ich mir nicht erklären welche Einstellung dafürverantwortlich sein sollte.
Vielleicht hilft das ja ein wenig weiter.
Hat wer eine Ahnung wie ich das wieder umdrehen kann?