STUMME quetion ziehen, aber ich kann es nicht löschen .. ich das Problem gelöst haben, bin ich ein Idiot ...: DBox2D Lichter machen zwischen scene2d Schauspieler
Ich habe Libgdx scene2d Bühne mit Schauspieler. Ich brauche die Box2D Lichter machen zwischen den Akteuren, so würde die Struktur wie folgt aussehen (v 1.4.):
Schauspieler, Schauspieler, Licht, Licht, Schauspieler
Meine Bühne machen:
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
super.render();
stage.act();
stage.draw();
Mein Box2D Code:
rayHandler = new RayHandler(world);
rayHandler.setShadows(false);
Box2D Update (ich habe eine Debug-Matrix becau Ich vergrößere es auf Pixel se der Welt der Physik in Weltkoordinaten (Meter) wiedergegeben wird, und dann):
public void updateWorld(float deltaTime) {
world.step(deltaTime, 7, 7);
// i know that this is not optimized to be called on every frame
debugMatrix = new Matrix4(stage.getCamera().combined.cpy());
debugMatrix.scale(ratio, ratio, 1);
rayHandler.setCombinedMatrix(debugMatrix);
rayHandler.updateAndRender();
}
Und das Licht:
new PointLight(rayHandler, 128, null, 10, 0, 3);
Ok, jetzt hier ist, was ich tue: Ich habe eine Gruppe mit einigen Schauspielern. Ich habe eine andere Gruppe, die die Benutzeroberfläche enthält, über die erste Gruppe gezeichnet. Ich rufe updateWorld() gleich nach dem Zeichnen der ersten Gruppe auf, also werden die Lichter über der ersten Gruppe und hinter der zweiten Gruppe stehen.Hier ist eine kurze Darstellung:
die Zeichnung der Bühne starten
Schauspieler Gruppe
Schauspieler
Schauspieler
Schauspieler
Box2D machen aufgerufen (wir zeigen die Lichter hier)
UI Gruppe
UI Darsteller Panel
UI Darsteller Panel
UI Darsteller Panel
Beenden Sie die Zeichnung der Bühne
Hier wird das Ergebnis (sehr hässlich):
Jetzt ist hier, wie es aussieht, wenn ich updateWorld() aufrufen, nachdem die Phase beendet hat Zeichnung (nicht zwischen den Akteuren):
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
super.render();
stage.act();
stage.draw();
updateWorld(deltaTime);
Es sieht so aus, wie es aussehen sollte, aber es deckt die Bühne und die Benutzeroberfläche ab.
Jetzt gehen wir zurück zum Startpunkt - rufen Sie die updateWorld() erneut nach der Schauspielergruppe auf, während die Bühne gerendert wird.Wir ändern die Projektionsmatrix des Charge der Bühne:
debugMatrix = new Matrix4(stage.getCamera().combined.cpy());
debugMatrix.scale(ratio, ratio, 1);
// this line was added
stage.getBatch().setProjectionMatrix(debugMatrix.cpy());
rayHandler.setCombinedMatrix(debugMatrix);
rayHandler.updateAndRender();
Das Ergebnis (Licht noch kühl ist, aber die scene2d gebrochen - alle Akteure aus der UI sind verschwunden):
ich habe viele, viele Dinge getestet (ich habe für 3 Tage eine Lösung zu finden versucht):
ich die Projektion verändert und die Transformationsmatrix;
Ändern Sie die Matrix, zeichnen Sie die Lichter und stellen Sie die vorherige Matrix wieder her;
Getestet mit verschiedenen Kameras und Vieports für die Bühne und die Lichter;
Und viele andere Dinge mit der Zeichnung der Bühne leuchtet Chargen- und Matrix
Ich denke, dass Libgdx die OpenGL verändert sich in irgendeiner Art und Weise zeichnen, während die Bühne gezogen wird. Ich weiß nicht, was zu tun ist, ich bin mir nicht ganz sicher, wie OpenGL funktioniert. Wie kann ich das Licht gut aussehen lassen (wie auf Screenshot 2 und 3)?
Update: Ich weiß, dass ich zwei getrennte Stufen machen und das Licht zwischen ihnen ziehen - das okay ist, aber meine Struktur ist viel komplexer (Ich habe gerade einfach es zu erklären) ... also kann ich nicht dazu (oder ich werde 4-5 verschiedene Stufen benötigen, was eine schreckliche Lösung ist)
Und bitte, schlagen Sie keine Lösungen vor, die keine Lösungen für das Problem sind. Ich kann nicht Shadern für Licht, mehr Stufen verwenden, exportierte Bilder von Lichtobjekten und so weiter ... Ich brauche eine Lösung für dieses Problem :)
Wenn Sie es gelöst haben, warum nicht Ihre eigene Frage beantworten? – Sebastian
Da ich dumm bin und das Problem nicht in opengl oder libgdx ist - es scheint, dass ich die updateWorld() -Methode aufgerufen habe/die die Lichter/10 Mal pro Frame zeichnet, nicht einmal wie ich sollte ..... –