Expandable
2006-03-09, 14:31:57
Hallo allerseits,
ich brauche jetzt mal eure Hilfe. Seit Tagen schon suche ich eine Lösung für dieses Problem, hatte schon mehrere verschiedene Ansätze, die alle samt mal mehr oder weniger gut funktionierten - jedoch noch nie zufriedenstellend.
Okay, also worum geht's? Ich habe eine kleine Engine, die Portals für Sichtbarkeitstests verwendet. Welche Portals sichtbar sind, prüfe ich mit Occlusion Queries. Das funktioniert einwandfrei und ist sehr rigoros, die zu den Portals gehörenden Areas werden wirklich nur berechnet, wenn man das entsprechende Portal auf dem Bildschirm sieht.
Nun mein Problem: Wenn ich mit der Kamera durch ein Portal fliege, kommt es ja vor, dass das Portal zwischen der Near Clipping Plane des OpenGL View Frustums und meiner Camera liegt (Abstand Kamera - Near Clipping Plane ist 1.0f). Wenn man nun in einem entsprechend blöden Winkel (sprich senkrecht) auf das Portal sieht, liefert mir das Occlusion Query 0 zurück - denn das Portal wird ja komplett von OpenGL weggeclippt.
Ich brauche also eine Möglichkeit herauszufinden, ob ein Portal zwischen der Near Clipping Plane und meiner Kamera liegt. Nur - wie mache ich das? Ich dachte einfach, ich erstelle ein "rückwärtiges" View Frustum, sprich ich nehme die Left, Right, Top, Bottom Clipping Planes wie gehabt, drehe die Normale der Near Clipping Plane um und berechne eine Camera Plane, welche letztlich die Near Clipping Plane mit umgekehrter Normalen (sprich in Blickrichtung) und einem um 1 verringerten Abstand ist.
In sagen wir 99% der Fällen funktioniert das, aber manchmal habe ich immer noch einen schwarzen Schirm beim Durchfliegen eines Portals.
Andere Möglichkeit: Ich erstelle die Ebene des Portals und eine Gerade aus Kameraposition als Aufpunkt und Kamerablickrichtung als Richtungsvektor. Ich berechne den Schnittpunkt. Man könnte jetzt testen, ob das Lambda (Koeffizient vor dem Richtungsvektor der Geraden) positiv oder negativ ist und entsprechend entscheiden, ob das Portal noch vor der Kamera liegt. Das Problem ist aber: Ich weiß nicht, in welche Richtung die Normale des Portals zeigt und weiß auch nicht, wie ich das rausfinden soll. Und wenn die Normale mal in die und mal in die Richtung zeigt, dreht sich natürlich auf das Vorzeichen von Lambda um und der ganze Test ist für die Katz.
So, hoffentlich konnte ich mein Problem klarmachen. Wäre für jede Idee dankbar. Am besten wär's natürlich, wenn man das irgendwie auf über das Occlusion Query lösen könnte, aber mir fällt da einfach nichts ein.
Danke schonmal!
ich brauche jetzt mal eure Hilfe. Seit Tagen schon suche ich eine Lösung für dieses Problem, hatte schon mehrere verschiedene Ansätze, die alle samt mal mehr oder weniger gut funktionierten - jedoch noch nie zufriedenstellend.
Okay, also worum geht's? Ich habe eine kleine Engine, die Portals für Sichtbarkeitstests verwendet. Welche Portals sichtbar sind, prüfe ich mit Occlusion Queries. Das funktioniert einwandfrei und ist sehr rigoros, die zu den Portals gehörenden Areas werden wirklich nur berechnet, wenn man das entsprechende Portal auf dem Bildschirm sieht.
Nun mein Problem: Wenn ich mit der Kamera durch ein Portal fliege, kommt es ja vor, dass das Portal zwischen der Near Clipping Plane des OpenGL View Frustums und meiner Camera liegt (Abstand Kamera - Near Clipping Plane ist 1.0f). Wenn man nun in einem entsprechend blöden Winkel (sprich senkrecht) auf das Portal sieht, liefert mir das Occlusion Query 0 zurück - denn das Portal wird ja komplett von OpenGL weggeclippt.
Ich brauche also eine Möglichkeit herauszufinden, ob ein Portal zwischen der Near Clipping Plane und meiner Kamera liegt. Nur - wie mache ich das? Ich dachte einfach, ich erstelle ein "rückwärtiges" View Frustum, sprich ich nehme die Left, Right, Top, Bottom Clipping Planes wie gehabt, drehe die Normale der Near Clipping Plane um und berechne eine Camera Plane, welche letztlich die Near Clipping Plane mit umgekehrter Normalen (sprich in Blickrichtung) und einem um 1 verringerten Abstand ist.
In sagen wir 99% der Fällen funktioniert das, aber manchmal habe ich immer noch einen schwarzen Schirm beim Durchfliegen eines Portals.
Andere Möglichkeit: Ich erstelle die Ebene des Portals und eine Gerade aus Kameraposition als Aufpunkt und Kamerablickrichtung als Richtungsvektor. Ich berechne den Schnittpunkt. Man könnte jetzt testen, ob das Lambda (Koeffizient vor dem Richtungsvektor der Geraden) positiv oder negativ ist und entsprechend entscheiden, ob das Portal noch vor der Kamera liegt. Das Problem ist aber: Ich weiß nicht, in welche Richtung die Normale des Portals zeigt und weiß auch nicht, wie ich das rausfinden soll. Und wenn die Normale mal in die und mal in die Richtung zeigt, dreht sich natürlich auf das Vorzeichen von Lambda um und der ganze Test ist für die Katz.
So, hoffentlich konnte ich mein Problem klarmachen. Wäre für jede Idee dankbar. Am besten wär's natürlich, wenn man das irgendwie auf über das Occlusion Query lösen könnte, aber mir fällt da einfach nichts ein.
Danke schonmal!