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..
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.
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
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)
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
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.