ich meine eigene Software Rasterizer in Java zu schreiben, und ich lief in einige Probleme mit ihm ... werfen Sie einen Blick auf ein Beispielbild, bitte:Perspektivenprojektion - wie projiziere ich Punkte, die hinter "Kamera" stehen?
Diese Probe nur einfache quadratische Gitter zeichnen in einem Flugzeug. 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 dem 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 3D-Punkt zu projizieren:
- 3D-Vektor zu transformierenden erstellt wird.
- Vektor wird mit ViewProjection Matrix multipliziert. mit folgenden Methode zum Screenen
Danach wird Punkt verwandelt:
// 'vector' is input vector in projection space // projection to screen double vX = vector.x/vector.z; double vY = vector.y/vector.z; //translate //surfaceW is width and surfaceH is height of the rendering window. vX = ((vX + 1.0f)/2.0f) * surfaceW; vY = ((-vY + 1.0f)/2.0f) * surfaceH; return new Vector3(vX, vY, vector.z);
Wie ich bereits sagte, ist es, bis dem Punkt bewegt mich hinter der Kamera einwandfrei funktioniert. Tatsache ist, dass ich herausfinden kann, wenn der Punkt hinter der Kamera liegt (indem ich den Z-Wert nach der letzten Transformation teste), aber da ich Linien und andere linienbasierte Objekte zeichne, kann ich diesen Punkt nicht überspringen.
Dann habe ich versucht, meine Transformation Pipeline nach Der Direct3D Transformation Pipeline Artikel auf MSDN.
Leider hatte ich damit auch kein Glück (gleiche Ergebnisse), also würde jede Hilfe sehr geschätzt werden, da ich ein bisschen auf diesem einen stecke.
Vielen Dank.
Mit besten Grüßen, Alex
Richten Sie die vordere Clipping-Ebene Ihrer Kamera korrekt ein? Und dann beim Rendern berücksichtigen? – ChrisF
Meine zNear Ebene ist auf 1 gesetzt, und zFar Ebene auf 1000 Einheiten. Ich habe versucht, die Werte zu ändern, aber das Problem bleibt bestehen. Irgendwelche Vorschläge? – Alex
Es ist eine Weile her, seit ich so etwas gemacht habe, aber Sie müssen eine Schnittmenge mit der vorderen Clipping-Ebene * vor * der Projektion der Linie durchführen. – ChrisF