Mathematisches Problem beim Projezieren von 3D zu 2D
-
Hallo,
ich habe mich inzwischen schon sehr viel mit SoftwareRendering auseinander gesetzt und auch schon einen relativ guten SoftwareRasterizer hinbekommen.
Wie einige von euch wissen werden 3D Koordinaten auf die 2D Fenster Fläche projeziert, in dem man die x und y Koordinaten durch die z Koordinate teilt, also x2d = x / z und y2d = y / z. Das funktioneirt bei mir auch gut und sieht auch ganz schön aus.
Allerdings muss ich die Funktion zum Zeichnen des jeweiligen Dreiecks beenden und verlassen sobald z kleiner gleich 0 ist. Warum bei 0 ist klar, weil man nicht durch 0 teilen kann/darf/soll und kleiner als 0 weil sonst ein sehr hässliches Ergebniss zu sehen ist.
Die Dreiecke die von den Grafikkarten gezeichnet werden verschwinden aber auch nicht wenn sie zu weit aus dem Bildschirm gehen und einer der drei z Koordinaten kleiner als 0 ist.
Meine Frage ist also, wie kann man das verhinden oder wie müssen die x, y, z und wohmöglich auch die Texture Koordinaten u und v umgerechnet oder korigiert werden??
-
LukasBanana schrieb:
Hallo,
ich habe mich inzwischen schon sehr viel mit SoftwareRendering auseinander gesetzt und auch schon einen relativ guten SoftwareRasterizer hinbekommen.
sagt wer?
Wie einige von euch wissen werden 3D Koordinaten auf die 2D Fenster Fläche projeziert, in dem man die x und y Koordinaten durch die z Koordinate teilt, also x2d = x / z und y2d = y / z. Das funktioneirt bei mir auch gut und sieht auch ganz schön aus.
eigentlich teilt man durch w
Allerdings muss ich die Funktion zum Zeichnen des jeweiligen Dreiecks beenden und verlassen sobald z kleiner gleich 0 ist. Warum bei 0 ist klar, weil man nicht durch 0 teilen kann/darf/soll und kleiner als 0 weil sonst ein sehr hässliches Ergebniss zu sehen ist.
Die Dreiecke die von den Grafikkarten gezeichnet werden verschwinden aber auch nicht wenn sie zu weit aus dem Bildschirm gehen und einer der drei z Koordinaten kleiner als 0 ist.
Meine Frage ist also, wie kann man das verhinden oder wie müssen die x, y, z und wohmöglich auch die Texture Koordinaten u und v umgerechnet oder korigiert werden??clipping ist das suchwort was du brauchst
-
Wieso teilt man durch "w"? "w" kenn ich nur als 4. Komponente eines Vektors oder eines Quaternionen.
Ich verstehe nicht ganz warum ich nach Clipping suchen soll? Es ist schon klar wie das gemeint war, oder? Was muss ich machen wenn z oder von mir aus w kleiner gleich 0 oder?
-
LukasBanana schrieb:
Wieso teilt man durch "w"? "w" kenn ich nur als 4. Komponente eines Vektors oder eines Quaternionen.
und eine position ist ein vector, und eine projektionsmatrix ist eine 4*4 matrix, entsprechend mit einem xyzw vector multipliziert.
Ich verstehe nicht ganz warum ich nach Clipping suchen soll? Es ist schon klar wie das gemeint war, oder? Was muss ich machen wenn z oder von mir aus w kleiner gleich 0 oder?
weil clippen das problem loest.
ich weiss nicht weshalb du nach der loesung fuer ein problem fragst und wenn man dir sagt wie die loesung heisst, fragst du was du mit ihr anstellen sollst
-
Meine Matrix multipliziere ich mit einem Vektor immer so:
NewX = X*M[0] + Y*M[4] + Z*M[ 8] + M[12]; NewY = X*M[1] + Y*M[5] + Z*M[ 9] + M[13]; NewZ = X*M[2] + Y*M[6] + Z*M[10] + M[14];
Wenn ich da jetzt noch W dazu nehemn würde, müsste das dann so aussehen?
NewX = X*M[0] + Y*M[4] + Z*M[ 8] + W*M[12]; NewY = X*M[1] + Y*M[5] + Z*M[ 9] + W*M[13]; NewZ = X*M[2] + Y*M[6] + Z*M[10] + W*M[14]; NewW = X*M[3] + Y*M[7] + Z*M[11] + W*M[15];
Wenn ich jetzt aber "NewW" zum Teilen nehme (x / w und y / w) dann geht zum Beispiel schon mal die Tiefe der Matrix (nämlich M[14]) verloren. X, Y, Z Position ist in einer 4*4 matrix an den Stellen 12, 13 und 14 abgespeichert, 15 ist normalerweise immer 1.
Das verstehe ich daher nicht so ganz. Die 4 Koordinate W verwirrt mich noch.
-
LukasBanana schrieb:
Position ist in einer 4*4 matrix an den Stellen 12, 13 und 14 abgespeichert, 15 ist normalerweise immer 1.
Das verstehe ich daher nicht so ganz. Die 4 Koordinate W verwirrt mich noch.dann schau dir mal an wie eine projektionsmatrix ausschaut, dann weisst du dass das, was normalerweise ist, fuer eine projektionsmatrix nicht gilt, wenn sie perspektivisch ist
aber das loest dein problem nicht, clipping wird es aber;)
-
Die Vektoren mit einem negativen z-Wert stehen doch vor der Leinwand (der Fläche auf die du projezierst), das heißt diese Können gar nicht mit in das Bild aufgenommen werden. Wenn du dir vorstellest, dass du an der Stelle der Leinwand stehst und in Richtung positiver z-Achse schaust, dann sind diese Objekte hinter dir. Objekte mit z = 0 wären "in" dir, d.h. dort wo du stehst und Objekte mit z -> 0 (z geht gegen 0) ganz nahe vor dir, so dass die teilweise mit dir überlappen.
Was man dagegen tut hat dir rapso ja schon gesagt.
-
In Ordnung, aber dann habe ich noch eine Frage zur Projektion selbst, ich projeziere ich Vertices nämlich momentan noch so:
X2d = X / Z * (ScreenWidth/2) + ScreenWidth /2; Y2d = - Y / Z * (ScreenWidth/2) + ScreenHeight/2;
Wie soll das jetzt aussehen mit einer Projektions Matrix, wie eine Projektions Matrix generiert wird weiß ich, aber ich weiß nicht wie man die mit den Vertices Multiplizieren muss, damit am Ende 2D Coordinaten raus kommen.
Wenn ich das so mache, wie wenn ich die Vectoren bzw. Vertices (X, Y, Z) mit der Modelview Matrix multipliziere kommt nur Unfug dabei heraus - jedenfalls bei mir.