OpenGL Lighting Position
-
Kann man, wenn ja dann wie, in OpenGL das Licht (glLight) mit Funktionen wie 'glTranslate' und 'glRotate' in eine bestimmte Richtung Bewegen?
Wenn es mit diesen Funktionen nicht geht, wie dann?
Wichtig ist mir dass ich die Berechnung für 'Rotate' und 'Translate' nicht selbst machen muss weil es sonst zu langsam wird.
-
Die Position des Lichts kannst du ja mit
glLightfv(GL_LIGHT0, GL_POSITION, light_position);angeben, und die aktuelle Modelview wird afaik auch darauf angewendet.
-
Was meinst du mit 'afaik'?

Soll das heißen das die Position ebenfalls abhängig von der letzten Rotation ist?
-
afaik bedfeutet so viel wie as far as i know = soweit ich weiß
-
Okay, aber wie bereits gefragt: bedeutet das, dass die Position ebenfalls abhängig von der letzten Rotation ist?
-
LukasBanana schrieb:
Okay, aber wie bereits gefragt: bedeutet das, dass die Position ebenfalls abhängig von der letzten Rotation ist?
Alles Tranformationen, welche du vor dem Setzen des Lichtes gemacht hast, wirken sich auch auf das Licht aus.
Also wenn deine "letzte Rotation" vor dem Setzen der Lichtquelle stattfindet, dann ja, wirkt sich das auch auf deine Lichtposition aus.
-
Alles klar, danke!

PS: Wundert mich halt nur warum man ausgerechnet Licht mit 'glLightfv(GL_LIGHT0, GL_POSITION, ...)' setzten muss?!
-
Naja irgendwo muss das Ding halt hin
Allerdings kannst du wirklich "gerichtetes" Licht eigentlich nur mit einem Spotlight erstellen.
-
Ja stimmt

Aber wenn ich als Licht Typ 'GL_SPOT_EXPONENT' oder 'GL_SPOT_CUTOFF' sehe ich nicht viel von dem Licht?!
-
dann schau doch mal nach, wofuer 'GL_SPOT_EXPONENT' oder 'GL_SPOT_CUTOFF' gut sind...
-
Ich hab mir mal ein DGL Wiki Tutorial zu Licht in OpenGL angesehen. Da ist das relativ gut beschrieben. Allerdings hab ich das mit den Vektor-Kreuzprodukt für glNormal nicht verstanden. Wenn da wenichsten ein Code Beispiel dazu gewesen wäre. Wie berechnet ihr denn, abhängig von jedem Vertex, die Normalen?
-
eigentlich speichert deine 3d-modelling-software die normalen pro vertex mit ab

wenn du diese trotzdem selber berechnen moechtest, mittelst du einfach die normalen aller(*) flaechen die an einem eckpunkt anliegen.
die normale (senkrechte) einer flaeche erhaelst du per kreuzprodukt zweier vektoren die in der flaeche liegen, vorzugsweise zwei kanten.
bei einem dreieck mit den eckpunkten (v1),(v2),(v3) waere das zb (v2-v1) x (v3-v1)(*) man beachte dass kanten jenseits eines gewissen winkels evtl erhalten bleiben sollten (zb. zylinderdeckel)
-
Ich hab jetzt ein gutes Codebeispiel dafür gefunden.
Allerdings hab ich im Bezug zu glNormal noch eine kleine Frage.
Ich erstelle meine Objekte alle mit glGenList ... glNewList usw. damit ich das nicht andauernd neu rendern muss (ist vermutlich auch schneller wenn ich das nicht selber mache)
Aber meine Frage ist:
wenn ich diese Objekte mit glCallList aufrufe und dann rotiere muss ich dann auch jedes mal die Normalen neu berechnen oder wird dass, wenn ich 'glNormal' zwischen 'glNewList' und 'glEndList' verwendet habe, automatisch aktualisiert?
-
LukasBanana schrieb:
Ich hab jetzt ein gutes Codebeispiel dafür gefunden.
Allerdings hab ich im Bezug zu glNormal noch eine kleine Frage.
Ich erstelle meine Objekte alle mit glGenList ... glNewList usw. damit ich das nicht andauernd neu rendern muss (ist vermutlich auch schneller wenn ich das nicht selber mache)
Aber meine Frage ist:
wenn ich diese Objekte mit glCallList aufrufe und dann rotiere muss ich dann auch jedes mal die Normalen neu berechnen oder wird dass, wenn ich 'glNormal' zwischen 'glNewList' und 'glEndList' verwendet habe, automatisch aktualisiert?Wird automatisch gemacht
wenn du skalierst, solltest du GL_NORMALIZE einschalten.
-
[...]muss ich dann auch jedes mal die Normalen neu berechnen oder wird dass [...] automatisch aktualisiert?
du musst ja die eckpunkte auch nicht neu angeben wenn du rotiert hast

-
Wunderbar

Muss ich 'GL_NORMALIZE' nur beim skalieren akrivieren oder grund sätzlich bei rotation?
-
LukasBanana schrieb:
Wunderbar

Muss ich 'GL_NORMALIZE' nur beim skalieren akrivieren oder grund sätzlich bei rotation?
Weder noch! Man sollte die Normalen gleich normalisiert, also mit der Länge 1, an das System übergeben und GL_NORMALIZE deaktiviert lassen! Das frisst nur Leistung.
Intern wird da mit der Transponierten von der inversen oberen 3x3-Matrix der Normal-Vektor transfomiert. Dadurch verändert Skalierung nicht die Länge des Vektors.Näheres dazu hier:
http://developer.nvidia.com/object/mathematicsofperpixellighting.html
-
Dadurch verändert Skalierung nicht die Länge des Vektors
du schreibst selbst, dass mit der transponierten inversen matrix multipliziert wird. dabei bleibt die rotation erhalten und die skalierung invertiert, die laenge der normalen aendert sich bei skalierung also sehr wohl.
-
LukasBanana schrieb:
Wunderbar

Muss ich 'GL_NORMALIZE' nur beim skalieren akrivieren oder grund sätzlich bei rotation?
wie helli schon sagt, veraendert sich die laenge der normalen beim skalieren. du kannst an sich immer GL_NORMALIZE eingeschaltet lassen. ich denken einen performanceunterschied wirst du nicht messen koennen heutzutage, aber wenn das aus ist, wirst du sehr wohl falsche beleuchtung sehen sofern du mal skalierst.
-
Okay, aber nur bei skalierung, richtig?
-
edit2: hat sich erledigt