Frage

Ich versuche, ein Frustum -Culing in meinem OpenGL 2D -Spiel zu implementieren. Die einzige Art von geometrischen Objekten in meinem Spiel sind zu diesem Zeitpunkt Rechtecke, also dachte ich, dass dies ziemlich einfach wäre, aber ich bekomme unerwartete Ergebnisse. Ich habe eine symmetrische Perspektivprojektion mit einem Ansichtswinkel von 45 Grad und in der Nähe und weitem Flugzeuge bei 0,01 bzw. 50 eingerichtet. Der Augenvektor ist immer parallel zur Z-Achse, die Kamera kann sich nur entlang der X- und Y-Achsen bewegen.

Meine Idee war es, den rechteckigen Bereich des Weltraums zu erhalten, der derzeit für die Kamera im Z-Koordinaten des Rechtecks, das ich zu keuchen versuche, sichtbar ist. Da die Kamera in der Mitte des Frustums schaut, berechnet ich den Abstand zu den Rändern dieses sichtbaren rechteckigen Bereichs wie folgt:

GLfloat maxDistance = givenRectangle.z * tanf(0.5 * (fovAngle * M_PI/180) );

Dann füge ich diesen Abstand zu und von den x- und y -Koordinaten der Kamera hinzu und substrakt, um das maximale und minimale sichtbare X und Y zu erhalten, und testen Sie dann das angegebene Rechteck, um festzustellen, ob es zwischen diesen Werten liegt.

Meine Frage ist, ob ich hier auf dem richtigen Weg bin und warum die obige Formel einen absurd kleinen Wert (etwas*10^-37) zurückgibt, wenn ich ein Objekt bei z = 5 habe, das mit der Kamera bei ((bei der Kamera) eindeutig sichtbar sein sollte ( 0,0,0)?

War es hilfreich?

Lösung

Wenn ich das Problem von oben genommen habe, habe ich Ihre Formel überprüft. Siehe Skizze, um zu bestätigen, dass ich Sie richtig verstanden habe.

enter image description here

Angesichts der Tatsache, dass wir A und Z kennen und für X lösen wollen, schrieb ich zum ersten Mal:

tan (a) = x/z

Neuanordnung, ich bekomme:

X = z tan (a)

Da z = 5 und a = 22,5 Grad ...

X = 5* tan (22,5 Grad)

X = 2.07106781

Es scheint also so, als hätten Sie die Mathematik richtig, aber Ihr Code falsch - vielleicht erwartet Ihre Tan -Funktion Grad als Radians, oder oder Fovangle Wurde nicht gesetzt? Ich denke, Sie müssen jeden Wert debuggen und überprüft.


Wenn Sie auf das breitere Problem zurückkehren, herauszufinden, was in Ihrem Frustum liegt und nicht, können Sie feststellen, dass Sie einen anderen Test verwenden können, um dieselbe Frage eleganter zu beantworten. Viele Grafikcodierer verwenden einen "Side-of-Plane" -Test. Bedenken Sie, dass Ihr Betrachtungsmangel ein Raumvolumen ist, der von einem Satz von 6 Ebenen begrenzt ist (4 für die Seiten Ihres Ansichtsfensters, eine nahezuschnittliche Ebene und eine weitaus eingestellte Ebene).

Bei einem Punkt auf einer Ebene und einer Normalität für die Ebene können Sie die Gleichung einer Ebene leicht berechnen, was wiederum macht es trivial zu testen, ob ein bestimmter Punkt "im Inneren" ist (in Richtung der Normalen), eine bestimmte Ebene. Durch alle 6 Flugzeuge iterieren und Sie schnell einen bestimmten Punkt in oder aus Ihrem Betrachtungsvolumen aus oder aus.

Das wirklich nette Sache an diesem Test ist, wie leicht Sie ihn wiederverwenden können: Jedes einfache konvexe Polygon, auf dem Sie Tests durchführen möchten (z. B. ein Rechteck) "Insider oder Outside" -Test. Sehr allgemein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top