Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 04:15

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Sep 28, 2010 13:16 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Moin,

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?

Grüße
Thomas


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 28, 2010 13:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Vielleicht hilft dir mein Kegelvolumen-Schatten-Shader.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 28, 2010 13:22 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 28, 2010 13:42 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Also eine Boundingbox hab ich schon... mir fehlts halt nur an dem besagten Matheteil ;-)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 28, 2010 13:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hier gibt es eine ausführliche Tabelle mit allen möglichen Objektintersektionen und den passenden Quellen (oft auch Quellcodes) : http://www.realtimerendering.com/intersections.html

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 28, 2010 14:22 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
leider steht da bei Cone nix und der Rest fehlt auch grösstenteils..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 28, 2010 14:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 28, 2010 15:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 28, 2010 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
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 :lol: )
angle_tan ist der Tangens vom Öffnungswinkel des Kegels (echt? :wink: ).


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]