Perspektivenprojektion - wie projiziere ich Punkte, die hinter "Kamera" stehen?

8

Ich schreibe meinen eigenen Software-Rasterizer in Java, und ich habe damit einige Probleme bekommen ... werfen Sie einen Blick auf ein Beispielbild:

Bild

Dieses Beispiel zeichnet einfach ein einfaches quadratisches Gitter auf einer Ebene. Alles funktioniert gut, bis ich die Kamera nah genug für einige Punkte bewegen, um sich dahinter zu bewegen. Danach werden sie nicht mehr korrekt projiziert, wie Sie sehen können (vertikale Linien - Punkte, die hinter der Kamera liegen sollten, werden oben auf den Bildschirm projiziert).

Meine Transformationsmatrizen und Vektoren sind dieselben, die DirectX verwendet (PerspectiveFovLH für die Projektion, LookAtLH für die Kamera).

Ich verwende folgende Transformationsmethode, um einen 3D-Punkt zu projizieren:

  1. Der zu transformierende 3D-Vektor wird erstellt.
  2. Vektor wird mit ViewProjection-Matrix multipliziert.
  3. Danach wird der Punkt mit der folgenden Methode in den Bildschirm umgewandelt:

    %Vor%

Wie ich bereits sagte, es funktioniert gut, bis sich der Punkt hinter der Kamera bewegt. Tatsache ist, ich kann herausfinden, wenn der Punkt hinter der Kamera ist (indem ich den Z-Wert nach der letzten Transformation teste), aber da ich Linien und andere linienbasierte Objekte zeichne, kann ich diesen Punkt nicht einfach überspringen.

>

Dann habe ich versucht, meine Transformationspipeline nach Der Direct3D Transformation Pipeline -Artikel auf MSDN zu setzen.

Leider hatte ich damit auch kein Glück (gleiche Ergebnisse), daher würde jede Hilfe sehr geschätzt werden, da ich bei dieser Sache ein wenig feststecke.

Danke.

Mit freundlichen Grüßen, Alex

    
Alex 25.07.2010, 13:16
quelle

1 Antwort

7

Sie müssen die Linie mit der vorderen Schnittebene im 3D-Raum schneiden und die Linie abschneiden, so dass Sie nur das sichtbare Liniensegment zeichnen:

%Vor%

Sie haben eine Zeile xo mit x vor der Clipping-Ebene und o dahinter. Schneiden Sie diese Linie mit der Schnittebene, um den Punkt + zu erzeugen. Sie wissen, welche von x und o sichtbar ist, also zeichnen Sie die Linie von x nach + .

Auf diese Weise projizieren Sie keine Punkte, die sich hinter der Kamera befinden.

    
ChrisF 26.07.2010, 20:05
quelle