Zentralprojektion - Tiefe eines Punkts berechnen



  • Hallo,

    Ich versuche, eine kleine einfache 3D-Engine in Eigenregie zu programmieren, um Objekte - ganz nach dem Stil von 3D-CAD-Programmen - aus verschiedenen Perspektiven darstellen zu können ("Kameraflug"). Mir geht es nicht um das Ergebnis selbst, sondern in erster Linie um den Weg dorthin, weshalb ich auch nicht eine fertige 3D-Engine verwenden möchte.

    Nun, es ist bereits möglich, zuvor in der 3D-Welt erstellte Objekte (Würfel), aus beliebigen Kamerapositionen zu betrachten - allerdings nur als Drahtmodell. Um nun die, Objekte bildenden Polygone mit Farbe zu füllen, muss ich das Sichtbarkeitsproblem lösen. Da ich, nicht zuletzt aus Geschwindigkeitsgründen, das Sichtbarkeitsproblem nicht auf Pixelebene (z.B. z-Buffer) lösen möchte, habe ich mich für den einfachen Maleralgorithmus entschlossen, bei dem hintere Polygone zuerst gezeichnet werden, um anschließend von näher bei der Kamera liegende Polygonen überzeichnet zu werden.

    Um nun die Polygon nach ihrer Tiefe zu sortieren, prüfe ich im 2D-Bereich, also nach der Zentralprojektion, ob ein Eckpunkt des zu vergleichenden Polygons in einem zweiten Polygon liegt. Ist dem nicht der Fall, prüfe ich, ob sich eine Kante des zu vergleichenden Polygons mit einer Kante eines zweiten Polygons schneidet. Sollte einer der beiden Fälle eintreten, überschneiden sich die Flächen im 2D-Bereich - zumindest an diesem Punkt. Damit nun bestimmt werden kann, welches Polygon im Vordergrund liegt, muss die Tiefe dieses 2D-Schnittpunktes (Überlagerungspunkt) für die beiden beteiligten Polygone berechnet werden.

    Und genau hierin besteht mein Problem. Wie berechne ich die Tiefe dieses Punktes? Würden die xy-Koordinaten dieses Punktes im 3D-Bereich bekannt sein, so könnte ich diese einfach in die Ebenengleichung des jeweiligen Polygons einsetzen und die z-Koordinate berechnen. Da mir für diesen Punkt jedoch nur die 2D-xy-Koordinaten zu Verfügung stehen, weiß ich nicht, wie ich vorgehen soll, da für das Umrechnen in 3D-xy-Koordinaten ja wider die z-Koordinate fehlt, welche ja wiederum genau die große Unbekannte ist.

    Vielen Dank im Voraus fürs Lesen.

    Beste Grüße,
    Roland



  • Du kannst dir z.B. ausrechnen, wo der durch den Bildpunkt definierte Strahl das Polygon trifft. Oder du merkst dir einfach die z-Koordinate im Viewspace. Oder du machst das alles in homogenen Koordinaten...

    Allerdings wäre eine Lösung per z-Buffer vermutlich wesentlich einfacher und effizienter. Der Painters Algorithm wird in seiner Implementierung potentiell sehr komplex. Wenn du z.B. Polygone hast, die sich gegenseitig durchdringen oder zyklisch überlappen, ist es nur mit Sortieren nicht getan. Dann musst du anfangen, Polygone zu zerteilen und dann wirds erst richtig hässlich, wenn dann plötzlich float Ungenauigkeiten zum Problem werden...



  • Hallo,

    vielen Dank für Deine Antwort.

    Meinst Du mit "berechnen wo der durch den Bildpunkt definierte Strahl das Polygon trifft", dass ich mit Hilfe der 2D-xy-Koordinaten des Schnittpunkts (oder Überlappungspunkt) die Winkel für einer Geraden durch das Projektionszentrum im 3D Raum berechnen soll, um anschließend mit dieser Geraden den 3D-Schnittpunkt mit der Ebene - aufgespannt durch das Polygon - ermitteln zu können? Oder meinst Du damit die Technik des Raytracking, was ja wieder eine Berechnung auf Pixelebene àla z-Puffer wäre?

    Den Ansatz finde ich gut, und werde das auf jeden Fall versuchen.

    Welche z-Koordinate im Viewspace meinst Du? Zu den Polygon-Eckpunktkoordinaten im 2D die z-Koordinate im 3D-Raum zu ermitteln ist zwar trivial, jedoch eben nicht für das zweite Polygon, von dem die xy-Koordinate des Schnittpunktes eben "irgendwo" in der Mitte des Polygons im 3D-Raum liegt.

    Ja, mir ist klar, dass zyklisch überlappende und durchdringende Polygone den Maleralgorithmus in seiner Grundform an seine Grenzen bringen. Die Erweiterung um auch diese Fälle zu behandeln ist bestimmt sehr komplex, und von mir auch nicht geplant.

    Danke und Beste Grüße.



  • Hallo, nochmal.

    Die Methode mit einer Geraden vom Projektionszentrum und dem Berechnen des Schnittpunktes mit der Ebene im 3D-Raum funktioniert perfekt!

    Auch ist der Umweg über das Berechnen der Winkel nicht nötig, da ich ohnedies zwei Stützpunkte für die Gerade habe: Das Projektionszentrum und die 2D-xy-Koordinaten, erweitert um die Entfernung der Projektionseben (z-Koordinate).

    Durch das Gleichsetzen der Gleichung für diese Gerade und der Gleichung für die Ebene des Polygons kann der Schnittpunkt und somit die Entfernung zu diesem Punkt berechnet werden, exakt das, was ich wollte!

    Vielen Dank nochmal für diese wirklich hilfreiche Idee, Perfekt!


Anmelden zum Antworten