Ich bin noch nich lange mit OGL am Werkeln und hab Probleme mit dem Frustum-Culling Tutorial von wikigl.
Ich habe den Quelltext umgeschrieben (bin C++ Anhänger) und in ein Programm eingebaut. In diesem habe ich für jedes
geladene Modell eine Kugel (xm,ym,zm und den Radius). Diese Kugel prüfe ich dann mit der Frustum Fkt. aus dem Tutorial.
Mein Problem besteht jetzt darin, dass es anscheind nicht richtig funktioniert. Ich kann mich bewegen und auf einmal ist ein Modell
weg, rotiere ich ein kleines Stück um eine Achse ist es wieder da, ein Stück weiter und es ist wieder weg.
Hat jemand eine Ahnung, wieso?
Mit Bild is gerade nen bisschen ungünstig Ich kanns aber beschreiben:
Man sieht normal ein Terrain: Hügel, ein paar kleine Figuren und im Hintergrund eine Skybox.
Wenn man nun die Kamera ein Stück bewegt, isr die Skybox weg, wie abgeschnitten, nur noch schwarz, als wenn man über die Alpen guckt, und der Himmel
fehlt :-\
Das Problem ist deine BoxInside Funktion.
Ich kenn mich zwar nicht mit c aus, aber du lieferst false, wenn keiner der Punkte im Frustum ist. Dies ist nur die halbe Wahrheit. Das mit dem 'mindestens ein punkt liegt im Frustum' ist nur einer der Fälle, die zu prüfen sind.
Schreib die Funktion mal so um:
Jeder Punklt wird gegen die Ebenen des Frustums geprüft und für jede Ebene gibst Du ein Flag zurück, ob er innerhalb oder ausserhalb dieser Ebene liegt (Abstand <=0 oder >0). Die Ergebnisse schreibst Du in ein Bitfeld, und zwar nach dem Schema:
ist er oben auserhalb, setzt Du das erste Bit, rechts das zweite, unten das dritte, links das vierte, vorne das fünfte und hinten das sechste.
Jetzt ist die Box im Frustum, wenn:
a) mindestens ein Ergebnis=0; // hier ist ein Punkt innerhalb
b) alle Ergebnise &-Verknüpft =0; // hier liegen zwar alle Punkte auserhalb, aber mindestens zwei an verschiedenen Seiten und mindestens eine Kante verläuft teilweise innerhalb
[/pascal]
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Danke euch erstmal. Das mit der BoxInside Fkt. is mir noch gar nich aufgefallen, aber die benutzte ich ja auch nicht . Es wird jedes Modell durch eine Kugel repräsentiert und dann mit der SphereInside Fkt. überprüft. Die Skybox besteht dann aus 6 Quads, also auch 6 "Kugeln".
Und hier tritt dieses merkwürdige Verhalten auf
Ich täusch mich sicher, aber Du benutzt für die Ebenendarstellung die Achsenschnittpunkte (normalisiert).
Bei der sphere_inside- Funktion nimmst Du diese Koordinaten dann als Vektor und berechnest den Abstand des Ursprungs der sphäre zu diesem Vektor, also Abstand Vektor-Vektor. Falls das überhaupt funktionieren kann, musst Du vorher den Mittelpunkt und Radius der Kugel normalisieren, also mit projektions-und Modelmatrix verrechnen.
Ich würde die Parameterdarstellung für die Ebenen (A+rB+sC, 3x3 Matrix: 1.Spalte Ankerpunkt, 2.Spalte 1. Richtungsvektor, 3.Spalte 2.Richtungsvektor) wählen (und zwar nicht normalisiert) und dann den Abstand Punkt-Ebene (siehe Formelsammlung) berechnen.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Danke dir Sidorion, deine Einwände mit dem Normalisieren sind berechtigt.
Normalisieren is ja nix anderes als
Code:
float length = sqrt(px*px + py*py + pz*pz);
und dann jeden wert durch length oder täusch ich mich wieder? Naja, auf jeden Fall ist es immer noch nich korrekt. Deinem letztem Teil kann ich gar nicht folgen. Kann das jemand für Anfänger erklären, oder gibts hier nen ausgedehntes Tut zur Matrizenrechnung in OGL? Wär super;-)[/code]
Hi ihr nochmal, mir is gerade noch was aufgefallen.
Das beschriebene Wegbleiben des Bildes passiert immer dann, wenn der Rotationswinkel um die y-Achse 0<angle_y<90 ist, könnte das jemandem helfen?
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.