nun soweit ich das verstanden habe ist das so das ich die Projektionsmatrix ja garnicht verändere. Ich drehe, skaliere zuerst meine "Welt", dann meine Scheinwerfer und dann das dranhängende Licht. Genau dann, bin ich ja quasi genau in der "Camera-Position", welche ich für meine Projektion brauche..
also ich krieg den Projektor einfach nicht in die richtige Position.. ich habe versucht die gesicherte ModelViewMatrix, welche ich beim Rendern des Scheinwerfers mit glGet... erzeugt habe, mit der IdentityMatrix zu multiplizieren, doch er projeziert immernoch wild woanders hin... bzw. wenn ich garnichts multipliziere, projeziert er immer dahin wo ich hingucke..
Nun die projektion realisiere ich genau wie in Sasha seinem Beispiel. Doch an der Stelle (ProjectedTex1.pas Zeile 147) weis ich nicht wie ich meinen "Projektor" richtig ausrichten soll.. Ich habe die Matrix des Scheinwerfers, während er gerendert wird so gesichert:
Code:
glGetFloatv(GL_MODELVIEW_MATRIX, @TexMatrix);
meine Renderproc sieht vereinfacht so aus:
Code:
try glMatrixMode(GL_PROJECTION); // Identitätsmatrix laden glLoadIdentity; // Viewport an Clientareal des Fensters anpassen glViewPort(0, 0, Panel1.Width, Panel1.Height);
Jetzt hab ichs so hinbekommen, das die Projektion "fest" an der Wand projeziert wird. Nun muss ich das ganze nur noch vom Scheinwerfer abhängig machen..
1. Ich Rotiere & Transformiere meine ModelViewMatrix zur Ansicht 2. popMatrix 3. Ich Rotiere & Transformiere meine "LampenMatrix" 4. Ich speichere diese "LampenMatrix" mittels glGetFloatv(GL_MODELVIEW_MATRIX, @TexMatrix); 4. pushMatrix 5. Ich zeichne meine Objekte und will hier projezieren
In meiner "LampenMatrix" (Sicht aus der Lampe) steckt also schon die Rot&Trans aus Schritt 1.. Um meinem Projektor in Schritt 5 in die Lampenposition zu bringen kann ich also nicht einfach mit meiner LampenMatrix multiplizieren, denn in Schritt 5 ist Schritt 1 auch schon drin...
Ich vermute du hast hier push/popMatrix vertauscht, oder?
Code:
1. Ich Rotiere & Transformiere meine ModelViewMatrix zur Ansicht 2. pushMatrix 2.5. glLoadIdentity(); 3. Ich Rotiere & Transformiere meine "LampenMatrix" 4. Ich speichere diese "LampenMatrix" mittels glGetFloatv(GL_MODELVIEW_MATRIX, @TexMatrix); 4. popMatrix 5. Ich zeichne meine Objekte und will hier projezieren
Jedenfalls sollte ein glLoadIdentity dafür sorgen das in der Lampenmatrix nur das gewünschte drin ist.
ja hatte ich vertauscht. So ganz kann ich das auch nicht machen, denn ich zeichne in Schritt 3 ja auch die Lampengehäuse, welche ja auch in die Richtige Richtung blicken müssen..
nun ich hab die Rotationen erstmal für die TexMatrix wiederholt... zum testen reichts erstmal. Jetzt bin ich allerdings auf 2 neue Probleme gestossen...
1. die Größe des projezierten bildes ändert sich nicht entsprechend der Entfernung zum projector... (Siehe Bilder) 2. Ich habe eine Rückprojektion, wie bekomme ich die weg?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Thmfrnk hat geschrieben:
1. die Größe des projezierten bildes ändert sich nicht entsprechend der Entfernung zum projector... (Siehe Bilder)
Das ist normal so. OpenGL projeziert die Textur zwar auf die Geometrie, aber mehr auch nicht. Du musst also die Entfernung messen und entsprechend dann die Textur z.b. via Texturmatrix skalieren.
Thmfrnk hat geschrieben:
2. Ich habe eine Rückprojektion, wie bekomme ich die weg?
Wenn du die feste Funktionspipeline nutzt musst du diese mit einer Clippingplane entfernen. Geht ganz einfach, da du diese Fläche ja direkt am Projektor ausrichten kannst.
Das ist normal so. OpenGL projeziert die Textur zwar auf die Geometrie, aber mehr auch nicht. Du musst also die Entfernung messen und entsprechend dann die Textur z.b. via Texturmatrix skalieren.
Bei Anwendung der Texturmatrix wird doch sicher irgendwo durch w geteilt? Es sollte reichen die z-Achse in die w-Achse zu packen, dann wird durch die Entfernung (z) geteilt.
Problem hab 1 hab ich schon in den griff bekommen... aber irgendwie bekomme ich das mit dem clipping nicht so ganz hin.. verstehe auch nicht wirklich was ich da als geometrie übergeben sollte..
Geometrie gibt man dafür keine an, sondern nur die Schnittfläche, und Flächen haben ja eine unendliche Ausdehnung. Alles was dann "jenseits" dieser Fläche liegt wird abgeschnitten, genauso wie bei den 6 Schnittflächen die standardmäßig das Frustum (sichtbarer Bereich) beschreiben.
hab ich mir schon durchgelesen, doch irgendwie nicht ganz verstanden.. Verstehe nicht wie ich mit den 4 Werten angeben kann was er nicht rendern soll..
Das dürfte eine Ebenengleichung sein, also a*x + b*y + c*z + d = 0. Dabei sind abcd deine vier Werte und xyz ein Punkt. Je nach dem ob dann das Ergebnis größer oder kleiner Null ist wird der Punkt dann gerendert oder halt nicht.
Edit: Dabei ist abc die Normale der Ebene. d kannst du berechnen indem du einen Punkt xyz der auf der Ebene sein soll in die Gleichung einsetzt, also: d = -(a*x + b*y + c*z)
In deinem Fall ist die Normale die Blickrichtung der Lichtquelle und du setzt dann die Position der Lichtquelle ein um d zu berechnen.
also muss ich quasi den Vektor des Projektors übergeben (Pos + Richtung). Den bekomm ich doch bestimmt ebenfalls aus der ModelViewMatrix aus sicht der Lichtquelle oder?
Mitglieder in diesem Forum: Google [Bot] und 13 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.