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

Aktuelle Zeit: Mi Jul 16, 2025 13:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Billboard
BeitragVerfasst: Do Feb 03, 2011 14:55 
Offline
DGL Member

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

ich versuche gerade meinen Lichtkegel als Billboard zu implementieren. Ich reichne da einfach (Matrix ist LampenMatrix) ein Dreieck mit Z nach in richtung des lichtes. Jetzt müsst ich nur noch rauskriegen wie ich um die Z Achse rotieren muss, damit das Dreieck immer auf meine Camera ausgerichtet ist.. Wie bekomm ich das raus? Hab mir schon die Billboard Tutorials durchgelesen, doch werde nicht draus schlau..

Grüße
Thomas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Billboard
BeitragVerfasst: Do Feb 03, 2011 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Vergiss die Lampenmatrix! Du willst schließlich aus Sicht der Kamera rendern, nicht aus Sicht der Lampe, richtig?

Also du brauchst:
- die Position der Spot-Lampe => nennen wir L
- die Position der Kamera => nennen wir K
- normalisierte Richtung in die deine Spot-Lampe scheint => nennen wir R
- das Wissen, dass das Kreuzprodukt zweier nicht paralleler Vektoren A und B immer im rechten Winkel zu diesen beiden Vektoren A und B steht

Code:
S = normalize(K - L);
S = cross(R,S);


=> Die Vektoren R und S spannen an der Position L eine Ebene für dein Dreieck auf. Beispiel:
Code:
P1 = L;
P2 = L + 10*R + S;
P3 = L + 10*R - S;


Beachte das es Probleme gibt wenn der Spot genau in die Kamera leuchtet, weil sich dann logischerweise keine Ebene finden lässt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Billboard
BeitragVerfasst: Do Feb 03, 2011 17:07 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
mhh so ganz hab ich noch nicht verstanden wie ich das implementieren soll..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Billboard
BeitragVerfasst: Do Feb 03, 2011 17:17 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
hier mal zur Veranschaulichung ein paar bildchen..

ADD: wenn ich jetzt z.b. von oben auf die Kegel gucke, müssten die flächen sich auch nach oben drehen..


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Billboard
BeitragVerfasst: Do Feb 03, 2011 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
mhh so ganz hab ich noch nicht verstanden wie ich das implementieren soll..

Öh? Also das was ich da oben unter "Also du brauchst:" geschrieben habe müsstest du alles irgendwo haben. Letztlich musst du nur in jedem Frame neu berechnen und das Dreieck (P1, P2, P3) irgendwie rendern, von mir aus mittels glBegin...glEnd. (Besser wäre natürlich wie immer ein gemeinsamer VBO für alle Lampen ;) )

Ich empfehle dir dringend dir ein paar grundlegende Mathe-Kenntnisse anzueignen. Deine Fragen der letzten Zeit deuten daraufhin das du nicht genau zu wissen scheinst was du da eigentlich treibst. Du scheinst immer nur die Lösung zu übernehmen ohne zu Verstehen was eigentlich passiert. Mit ein wenig Hintergrundwissen fällt einem das OpenGL-Leben um ein vielfaches leichter :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Billboard
BeitragVerfasst: Do Feb 03, 2011 19:16 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Also ich habs ja versucht aber kriegs net hin..
Code:
        glPushMatrix();

        glLoadIdentity;
        //Camera
        Kx.x := MainForm.cam_vec[0];
        Kx.y := MainForm.cam_vec[1];
        Kx.z := MainForm.cam_vec[2];

        //Lampe
        Lx.x := lightPos[0];
        Lx.y := lightPos[1];
        Lx.z := lightPos[2];

        Rx :=   normalize(Lx);

        Sx := normalize(VectorSubtract(Kx ,Lx));
        Sx := crossProduct(Rx, Sx);


        P1 := Lx;
        P2 := VectorAdd(VectorAdd(Lx, VectorMul(Rx, 10)), Sx);
        P3 := VectorSubtract(VectorAdd(Lx, VectorMul(Rx, 10)), Sx);

        glBegin(GL_TRIANGLE_STRIP);
         glColor4f(r1, g1, b1, Intensity); glVertex3f(p1.x, p1.y, P1.z);
         glColor4f(0, 0, 0, 0); glVertex3f(p2.x, p2.y, p2.z);
         glColor4f(0, 0, 0, 0); glVertex3f(p3.x, p3.y, p3.z);
        glEnd;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Billboard
BeitragVerfasst: Do Feb 03, 2011 19:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Code:
glPushMatrix();
glLoadIdentity;


Warum den das? Du renderst aus der Perspektive der Kamera. Dann brauchst du auch die entsprechenden Matrizen. Genauso als würdest du normale Geometrie der Szene rendern. Und natürlich müssen alle Daten (Lampenposition usw. im entsprechenden Koordinatensystem vorliegen)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Billboard
BeitragVerfasst: Sa Mär 12, 2011 15:59 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Ich weiß nicht ob es funktioniert hat bei dir, aber ich glaube du hast es entweder noch nicht probiert, es nicht hingekriegt oder du hast deine Korrektur nicht erwähnt.

Falls mit Ausnahme von letzterem eines zutrifft dann hab ich glaube hier die Lösung für dich:

Code:
Rx :=   normalize(Lx);


R sollte die Richtung in die deine Lampe zeigt normalisieren, nicht die Position der Lampe.

Beispiel:
Lampe befindet sich auf [-1, 0, -5]. Das ist die Position. Sie befindet sich also vor dir leicht links versetzt auf gleicher Höhe (wir gehen der Einfachheit davon aus das die sich im Ursprung Kamera befindet).
Die "Leuchtrichtung" der Lampe kann aber eine ganz andere sein, z. B. [5.962, 0, 0], sie leuchtet somit nach rechts. Diesen Wert solltest du normalisieren (in diesem Beispiel wäre das [1, 0, 0].

Oder kurz:
Ersetze dies:
Code:
Rx :=   normalize(Lx);//Lx ist die Position deiner Lampe

durch dies:
Code:
Rx :=   normalize(RichtungInDieDeineLampeOderWasAuchImmerZeigt);


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 22 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 18 Queries | GZIP : On ]