ich bin immernoch bei meiner Beleuchtungsengine. Um die Sache effizient zu gestalten, muss ich nur Objekte Rendern (zwecks Texturprojektion), welche auch wirklich in einem Lichtkegel sind. Liesse sich so eine Bedingung einfach errechnen? Mir fällt da auf anhieb nix ein?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Boundingboxen oder Boundingspheres (je nachdem welche Form besser passt) um die Objekte und dann prüfen pb diese den Kegel schneiden oder ausserhalb liegen. Also ganz einfach, und hat dann auch nicht direkt was mit OpenGL zu tun, sondern ist eher mathematischer Natur.
Oder wenns über OpenGL gehen soll dann halt mittels Stencil. Also den Kegel in den Stencil rendern und dann die Objekte mit passender Vergleichsfunktion (nur dort wo Stencil gesetzt ist z.b.) rendern.
leider steht da bei Cone nix und der Rest fehlt auch grösstenteils..
Nun, do könntest den Kegel mit einer (gegebenenfalls offenen) Pyramide umgeben. Dann gehts vergleichsweise einfach, weil da braucht man "nur" die Ebenen. Wenn du wirklich den Kegel haben willst, dann wirds schwierig. Ein Kegel entlang der Z Achse sieht glaub ich so aus:
Code:
Z <= sqrt(X*X + Y*Y) / tan(irgendein_wert_für_den_Oeffnungswinkel)
Die Rotation und Translation kannst du in eine Matrix schreiben, die du dann invertierst, und mit den Punkten multiplizierst, bevor du überprüfst, ob die Punkte im Kegel liegen. So kommst du mit dieser Gleichung aus, und benötigst nicht die allgemeine (die wahrscheinlich irgendwie über den Normalabstand von einer Geraden funktioniert. keine Ahnung, wie genau. Und keine Lust das jetzt herzuleiten)
Also für Kugel<->Kegel steht es auch hier im Wiki, siehe meinen Link oben. Du könntest also deine BoundingBoxen mit einer BoundingSphere umgeben oder halt direkt BoundingSpheres berechnen.
So mir ist doch noch ne Möglichkeit eingefallen, das für nen allgemeinen Kegel zu bestimmen. Vielleicht nicht ideal, sollte aber funktionieren.
Code:
function IsPointWithinCone(P: Vector3; Origin: Vector3; Direction: Vector3; angle_tan: single): boolean; var Projection: Vector3; Perpendicular: Vector3; begin P -= Origin; //Koordinatensystem so verschieben, dass Origin im Nullpunkt liegt Projection:= Direction * dot(P, Direction) / dot(Direction, Direction); //P auf Richtungsvektor projizieren. //Direction hat nicht notwendigerweise die Länge 1, daher wird durchdividiert (die Länge ist einmel in Direction und einmel in dot(P, Direction), daher Quadrat der Länge) Perpendicular:= P - Projection; //der Teil von P, der Normal auf Direction ist.
result:= VectorLength(Projection) * angle_tan >= VectorLength(Perpendicular); result:= result and (dot(P, Direction) >= 0); //wenn der Kegel nur in eine Richtung gehen soll end;
Mit ner Bounding Box sollts so gehen (halt einfach alle Ecken prüfen. Und vorher sicherstellen, dass die Box nicht zu groß/nah ist. Wenn doch dann sollts reichen, ausreichend viele Punkte zu prüfen. Zugegeben, ist nicht schnell...). P ist der Punkt, von dem man wissen will, ob er im Kegel liegt. Origin ist die Spitze des Kegels. Direction ist die Richtung, in die der Kegel zeigt (nein, wirklich ) angle_tan ist der Tangens vom Öffnungswinkel des Kegels (echt? ).
Mitglieder in diesem Forum: Bing [Bot] und 2 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.