Projektionsprobleme

Ja, ich setzte die Viewmatrix zur Einheitsmatrix. Ich habe dieses Konzept jetzt mal in mein Spiel übertragen, aber das Objekt wird über dem Slot angezeigt, obwohl die Position f die linke obere Ecke des Slots und d Länge bzw. Breite ist, so wie im KSKB, wo es funktioniert. Den folgenden Code auszuführen ist eigentlich nicht nötig, die Codes(Spiel/KSKB) im Vergleich:
Hier wird’s über dem Slot angezeigt

public void draw(Point2D.Float f, Point2D.Float d) {
		glViewport((int)f.x, (int)(Display.getHeight()-f.y), (int)d.x, (int)d.y);
		glUniformMatrix4(m.projectionMatrixLocation, false, Main.putFloatCoords(Main.projection(m.fov, d.x/d.y, 0.1f, 100)));
		glUniformMatrix4(m.viewMatrixLocation, false, Main.putFloatCoords(Main.einheitsMatrix()));
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.einheitsMatrix()));
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.translate(0, 0, -2.5f)));
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.rotate(0, 1, 0, 45.0f)));
		o.draw();
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.rotate(0, 1, 0, -45.0f)));
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.translate(0, 0, 2.5f)));
		glUniformMatrix4(m.projectionMatrixLocation, false, Main.putFloatCoords(Main.projection(m.fov, Display.getWidth()/Display.getHeight(), 0.1f, 100)));
		glUniformMatrix4(m.viewMatrixLocation, false, m.viewMatrix);
		glViewport(0, 0, Display.getWidth(), Display.getHeight());
	}

Und hier das KSKB, es wird genau im Slot angezeigt

projMatrix = putFloatCoords(projection(45, Display.getWidth()/Display.getHeight(), 0.1f, 1000));
            glMatrixMode(GL_PROJECTION);
            glLoadMatrix(projMatrix);
            glMatrixMode(GL_MODELVIEW);
            glViewport(100, Display.getHeight()-100-75, 75, 75);
            glLoadIdentity();
            glClear(GL_DEPTH_BUFFER_BIT);
            glPushMatrix();
            glTranslatef(0,0,-5);
            glRotatef(45, 1, 1, 0);
            glColor4f(1, 1, 1, 1);
            drawCube();
            glPopMatrix();

glViewport((int)f.x, (int)(Display.getHeight()-f.y), (int)d.x, (int)d.y);
–>
glViewport((int)f.x, (int)(Display.getHeight()-f.y-d.y), (int)d.x, (int)d.y);

(wie die …-100-75) ?!

Oh, das habe ich völlig übersehen. Aber die Dinger werden eher im oberen Teil des Slots angezeigt, und der obere Teil des Dings wird abgeschnitten, wieso? Hier ein Screenshot(Ich habe mal eine Auswahl an Items reingenommen)-Der Code war ja schon im letzten Post:

Hm. Sieht ja schon „fast“ richtig aus :smiley: Aber was da jetzt noch nicht stimmt … (könnte fast die Titelleiste sein, die da einen offset reinbringt (fallst du irgendwo sowas wie „frame.getHeight()“ verwendet hast))… ist schwer zu sagen - schon ob es an der Projektion oder dem viewport liegt. Kannst du diesen „Rahmen“ dort weglassen, damit man sieht, ob er die Objekte (hinter dem Rahmen) zeichnet? Wenn das so wäre, wäre der Viewport falsch. Wenn wirklich nur der Teil gezeichnet wird, der auch im Viewport liegt, stimmt wohl mal wieder irgendeine Matrix nicht.

Die Objekte werden abgeschnitten. Mir scheint es so, dass der Viewport nur die obere Hälfte des Slots ist, da das 2. Item auch unten abgeschnitten wirkt.(Das rote Quadrat dient der Orientierung, wie der Viewport sein SOLLTE)

Hmja, dann stimmt da die (View- oder) Model-Matrix nicht. Also, der Viewport ist so gesehen ja nur ein kleines, eingebettetes GL-Fensterchen, d.h. wenn du das ganze stattdessen in “glViewport(0,0,displayW,displayH)” malst, sollte es das Item bildschirmfüllend rendern. Schau halt mal, welche glTranslate’s usw. dort auf die ModelView-Matrix angewendet werden (bzw. wo die Objekte liegen, wenn sie UN-transformiert sind - wirklich im Ursprung?)

Ok, ich hab’s rausgefunden. Ich habe völlig vergessen, dass der Ursprung nicht der Mittelpunkt des Objekts ist, sondern dass das Objekt gewissermaßen auf der Fläche X/Z steht. So transformiere ich noch um die halbe Höhe des Objekts in -Y Richtung. Jetzt wird es zwar in der Mitte angezeigt, aber ein Problem bleibt. Wenn ich nahe an Weltobjekte rangehe, dann verschwindet das Item im Weltobjekt, weil es ja um 2,5 in Z Richtung transformiert wurde. Also mache ich “glDisable(GL_DEPTH_TEST)” vor dem Itemzeichnen. Aber dadurch werden die Items selbst falsch angezeigt, weil einige Flächen logischerweise vor anderen gezeichnet werden wegen diesem “glDisable(GL_DEPTH_TEST)”. Also die Frage: Gibt es eine Möglichkeit, dass die Items immer vor anderen Weltobjekten gezeichnet werden, aber in sich richtig?

Hier noch ein Screenshot(Ich stehe in einem Objekt drin, und im Vergleich zu den Items aus den anderen Screenshots sind die hier falsch):

Ja, indem du das flache UI am Ende zeichnest mit ausgeschaltetem Z-buffer (und worldmatrix natürlich).

Ein eigenes Depthsorting zu implementieren wirst du wahrscheinlich nicht drumrumkommen, denn der Z-Buffer ist bei weitem nicht ausreichend.
Dabei ist die einfachste und auch effektivste Heuristik (meiner Meinung nach)
[Solide Objekte] -> [Transparente Objekte] -> [DISABLE DEPTH TEST] -> [(Sortierte) UI]

Warum nicht einfach:

Welt -> glClear(GL_DEPTH_BUFFER_BIT); -> UI ?

Gruß
Fancy

Ok, mit dem glClear nach der Welt funktioniert’s, danke!