Projektionsprobleme

Hallo
Ich möchte in meinem Spiel auch 3D-Items anzeigen lassen. da das Inventar allerdings in der 2D Ebene liegt, habe ich die Slots transparent gemacht, damit ich sozusagen in die welt hinter den Slots skaliert die 3D-Items zeichnen kann. Dabei traten zwei Probleme auf:

  1. Der skalierungsfaktor
    Um zu berechnen, wie ein beliebig großes Objekt skaliert werden muss, filtere ich die kleinsten und die größten X/Y Werte des Objekts raus, projeziere sie und den Abstand der projezierten teile ich durch die Slotbreite, und das ist der Skalierungsfaktor. Dieser ist aber viiieeel zu klein.

public void reloadBounds(Point2D.Float d){
		FloatBuffer distanz_1 = BufferUtils.createFloatBuffer(3);
		FloatBuffer distanz_2 = BufferUtils.createFloatBuffer(3);
		Vector3f[] minmax = getMinMax();
		GLU.gluProject(minmax[1].x, minmax[1].y, minmax[1].z, Main.putFloatCoords(Main.einheitsMatrix()), m.projMatrix, m.viewPort, distanz_1);
		GLU.gluProject(minmax[0].x, minmax[0].y, minmax[0].z, Main.putFloatCoords(Main.einheitsMatrix()), m.projMatrix, m.viewPort, distanz_2);
		scaleFactor = ((distanz_2.get(0)-distanz_1.get(0))/d.x);
	}

	public Vector3f[] getMinMax(){
		Float maxX = Float.MIN_VALUE;
		Float maxY = Float.MIN_VALUE;
		Float maxZ = Float.MIN_VALUE;
		Float minX = Float.MAX_VALUE;
		Float minY = Float.MAX_VALUE;
		Float minZ = Float.MAX_VALUE;
		for(int m = 0; m < o.meshes.size(); m++){
			for(int i = 0; i < o.meshes.get(m).vertexBuffer.capacity(); i+=3){
				if(o.meshes.get(m).vertexBuffer.get(i) >= maxX){
					maxX = o.meshes.get(m).vertexBuffer.get(i);
				}
				if(o.meshes.get(m).vertexBuffer.get(i+1) >= maxY){
					maxY = o.meshes.get(m).vertexBuffer.get(i+1);
				}
				if(o.meshes.get(m).vertexBuffer.get(i+2) >= maxZ){
					maxZ = o.meshes.get(m).vertexBuffer.get(i+2);
				}
				
				if(o.meshes.get(m).vertexBuffer.get(i) <= minX){
					minX = o.meshes.get(m).vertexBuffer.get(i);
				}
				if(o.meshes.get(m).vertexBuffer.get(i+1) <= minY){
					minY = o.meshes.get(m).vertexBuffer.get(i+1);
				}
				if(o.meshes.get(m).vertexBuffer.get(i+2) <= minZ){
					minZ = o.meshes.get(m).vertexBuffer.get(i+2);
				}
			}
		}
		Vector3f v1 = new Vector3f(maxX, maxY, maxZ);
		Vector3f v2 = new Vector3f(minX, minY, minZ);
		return new Vector3f[]{v1, v2};
	}

  1. Die Positionierung
    Es geht darum, das Objekt genau so zu platzieren, dass es so aussieht, als wäre es “im Slot”. Genau das habe ich schon einmal gemacht und auch schon in einem anderen Thread herausgefunden. Also habe ich GENAU das kopiert. Jetzt ist es aber so, dass, wenn sich der Spieler bewegt, auch das Objekt sich um den Slot herum bewegt(bei dem von dem ich es KOPIERT habe nicht). Im Code ist der Parameter f die Position(linke obere ecke des Slots) und d die Breite/Höhe des Slots; “m” ist die Instanz der Hauptklasse, wo das ganze Matrizen-Zeug berechnet wird(deswegen holt sich das Item das von da).

public void draw(Point2D.Float f, Point2D.Float d) {
		float transx, transy, transz;
    	FloatBuffer buff = BufferUtils.createFloatBuffer(3);
        FloatBuffer buff1 = BufferUtils.createFloatBuffer(3);
        GLU.gluUnProject(f.x+d.x/2, Display.getHeight()-(f.y+d.y), 0f, m.viewMatrix, m.projMatrix, m.viewPort, buff);
        Vector3f point0 = new Vector3f(-1*buff.get(0), -1*buff.get(1), -1*buff.get(2));
        GLU.gluUnProject(f.x+d.x/2, Display.getHeight()-(f.y+d.y), 1f, m.viewMatrix, m.projMatrix, m.viewPort, buff1);
        Vector3f point1 = new Vector3f(-1*buff1.get(0), -1*buff1.get(1), -1*buff1.get(2));
        Vector3f delta = new Vector3f(point1.x-point0.x, point1.y-point0.y, point1.z-point0.z);
        delta.normalise();
        transx = m.spieler.posX+delta.x;
        transy = m.spieler.posY+delta.y;
        transz = m.spieler.posZ+delta.z;
		m.shader.use();
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.translate(-transx, -transy, -transz)));
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.scale(scaleFactor, scaleFactor, scaleFactor)));
		o.draw();
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.translate(transx, transy, transz)));
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.scale(1/scaleFactor, 1/scaleFactor, 1/scaleFactor)));
	}

Ihr könnt diese Methoden ja mal mit einer beliebigen 2D-Position und einem Mesh testen.

OK, vergesst alles, was ich bisher schrieb. Ich hab’s jetzt anders gemacht:
Eine Sache, die in einem anderen Thread erarbeitet wurde, um Punkte mit der Maus zu verschieben.(Leider bekomme ich kein KSKB hin):

		float transx, transy, transz;
		Vector3f v = m.computePickingRay((int)(f.x+d.x*0.5f), (int)(Display.getHeight()-(f.y+d.x*0.5f)));
        v.scale(1);
        Vector3f eyeInWorldPos = m.computeWorldPosition(m.w/2, m.h/2);
        Vector3f p = new Vector3f(
            eyeInWorldPos.x + v.x,
            eyeInWorldPos.y + v.y,
            eyeInWorldPos.z + v.z);
        transx = p.x;
        transy = p.y;
        transz = p.z;
		m.shader.use();
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.translate(transx, transy, transz)));
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.scale(scaleFactor, scaleFactor, scaleFactor)));
		o.draw();
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.translate(-transx, -transy, -transz)));
		m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.scale(1/scaleFactor, 1/scaleFactor, 1/scaleFactor)));
	}

public Vector3f computePickingRay(int x, int y)
    {
        FloatBuffer buf0 = BufferUtils.createFloatBuffer(3);
        FloatBuffer buf1 = BufferUtils.createFloatBuffer(3);
        GLU.gluUnProject(x, y, 0, Main.matrixMultiply(viewMatrix, modelMatrix), projMatrix, viewPort, buf0);
        GLU.gluUnProject(x, y, 1, Main.matrixMultiply(viewMatrix, modelMatrix), projMatrix, viewPort, buf1);
        Vector3f punkt0 = new Vector3f(buf0.get(0), buf0.get(1), buf0.get(2));
        Vector3f punkt1 = new Vector3f(buf1.get(0), buf1.get(1), buf1.get(2));
        Vector3f delta = new Vector3f(punkt1.x-punkt0.x, punkt1.y-punkt0.y, punkt1.z-punkt0.z);
        delta.normalise();
        return delta;
    }
	public Vector3f computeWorldPosition(int x, int y)
    {
        FloatBuffer buf0 = BufferUtils.createFloatBuffer(3);
        GLU.gluUnProject(x, y, 0, Main.matrixMultiply(viewMatrix, modelMatrix), projMatrix, viewPort, buf0);
        Vector3f punkt0 = new Vector3f(buf0.get(0), buf0.get(1), buf0.get(2));
        return punkt0;
    }

Jetzt bewegt sich das Objekt nicht mehr umher, aber es wird etwas oberhalb/links des Slots angezeigt, obwohl Vector3f v = m.computePickingRay((int)(f.x+d.x0.5f), (int)(Display.getHeight()-(f.y+d.x0.5f))); ja eigentlich auf den Mittelpunkt des Slots abzielt. Ich hoffe es kommen Antworten, denn ich habe jetzt nur noch statt *0.5f dort irgensowas wie *0.0009f und *1.1f zu schreiben was ja eigentlich Humbug ist.

und wieso sollte bei deinem neuen Posting anders sein? :wink:

ich leiste mir diesen schalen Witz, da ich die Gelegenheit habe, moderatorisch darauf hinzuweisen, doch lieber JAVA-Tags statt CODE-Tags zu verwenden,
mit 500±Postings wäre das doch langsam angebracht

Code/ Problem für mich leider zu fern

Ja, stimmt, dieses ```-Ding könnte ich verwenden, aber irgendwie hab ich mir das angewöhnt

 zu schreiben. Wo liegt denn der Unterschied(Also außer, dass das eine Code und das andere Java heißt, vor allem, wenn man sich denkt, dass alles Java ja Code ist)? Und der erste Post ist wie gesagt völlig bedeutungslos, da ich die Praktik darin überarbeitet habe und er irgendwie auch viel zu lang ist. Das einzige was man da mitnehmen sollte, ist, dass es hier um 3D-Items in einem 2D-Inventar geht.(Vorschläge, wie das anders geht, als ich es gemacht habe, sind auch erwünscht)

ich habe einen der Code-Blocks editiert, siehe dort,
Zeilennummern nun dabei, wobei das auch für CODE an sich nicht unbedingt falsch wäre, je nach Möglichkeit,
und bisschen Formatierung, Schlüsselwörter andere Farbe,

hilft bei deinen Code-Wüsten mit nur einer Methode freilich nicht so sehr wie allgemein,
ich verstehe und mag das Syntax-Highlighting hier im Forum auch nicht komplett, dennoch stark auffällig wenn fehlend

benutzt du eine IDE oder einen Texteditor? :wink:
denke immer daran dass es weniger nach dir geht als nach den Lesern und da ist Verzicht auf alles leicht Mögliche evtl. eine gewisse Beleidigung

wenn zu diesem Punkt alles fertig besprochen (ohne Zwang zur Überzeugung) kann ich immerhin die Postings dazu morgen wieder abräumen,
sofern ich es nicht vergesse

Mehr als dass der Code gräßlich aussieht (egal, mit welchem Tag), kann ich leider mal wieder nicht sagen, aber das ist bei einem Zusammenhangslos geposteten Fetzen, zusammen mit der Aussage dass da “irgendwas nicht so ganz richtig angezeigt wird” vermutlich sogar für @Fancy schwierig…

Ja, ich versuche gerade ein übersichtliches KSKB zu erstellen, das funktioniert. Ich poste es, wenn’s fertig ist.

Ok, hier ist das KSKB: Wie sei sehen, sehen sie nichts, denn der „scaleFactor“ ist 0. Also sollte das Problem zuerst behandelt werden.(Das rote Quadrat soll den Slot darstellen)

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.geom.Point2D;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;

import javax.swing.JFrame;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.util.vector.Vector3f;

public class KSKB {

	private JFrame f;
	private IntBuffer viewPort = BufferUtils.createIntBuffer(16);
	private FloatBuffer viewMatrix = BufferUtils.createFloatBuffer(16);
	private FloatBuffer projMatrix = BufferUtils.createFloatBuffer(16);
	private float transX, transY, transZ;
	float[] coords = {
			0.5f, -0.5f, -0.5f,
			0.5f, -0.5f, 0.5f,
			-0.5f, -0.5f, 0.5f,
			-0.5f, -0.5f, -0.5f,
			
			0.5f, 0.5f, -0.5f,
			0.5f, 0.5f, 0.5f,
			-0.5f, 0.5f, 0.5f,
			-0.5f, 0.5f, -0.5f,
	};
	int[] indecies = {
		1, 2, 3,
		7, 6, 5,
		4, 5, 1,
		5, 6, 2,
		2, 6, 7,
		0, 3, 7,
		0, 1, 3,
		4, 7, 5,
		0, 4, 1,
		1, 5, 2,
		3, 2, 7,
		4, 0, 7
	};
	private IntBuffer indexBuffer;
	private int vbo;
	private float scaleFactor = 1;
	private FloatBuffer vertexBuffer;

	public KSKB(){
		f = new JFrame("KSKB");
        f.setPreferredSize(new Dimension(800, 600));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocation(800, 150);
        Canvas canvas = new Canvas();
        f.add(canvas);
        try {
        Display.setParent(canvas);
        f.setVisible(true);
        Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }
        
        indexBuffer = putIntCoords(indecies);
        vertexBuffer = putFloatCoords(coords);
        vbo = createVBO(vertexBuffer, vbo);
        
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glViewport(0, 0, Display.getWidth(), Display.getHeight());
        glGetInteger(GL_VIEWPORT, viewPort);
        while(!Display.isCloseRequested()){
        	projMatrix = putFloatCoords(projection(45, Display.getWidth()/Display.getHeight(), 0.1f, 1000));
        	viewMatrix = putFloatCoords(einheitsMatrix());
        	glMatrixMode(GL_PROJECTION);
        	glLoadMatrix(projMatrix);
        	glMatrixMode(GL_MODELVIEW);
        	glLoadMatrix(viewMatrix);
        	reloadPos(new Point2D.Float(100, 100), new Point2D.Float(75, 75));
        	reloadScale(new Point2D.Float(75, 75));
        	glClear(GL_DEPTH_BUFFER_BIT);
        	glTranslatef(transX, transY, transZ);
        	glScalef(scaleFactor, scaleFactor, scaleFactor);
        	glRotatef(45, 1, 1, 0);
        	glColor4f(1, 1, 1, 1);
        	drawCube();
        	glRotatef(-45, 1, 1, 0);
        	glScalef(1/scaleFactor, 1/scaleFactor, 1/scaleFactor);
        	glTranslatef(-transX, -transY, -transZ);
        	
        	glMatrixMode(GL_PROJECTION);
        	projMatrix = putFloatCoords(ortho(0, 0, Display.getWidth(), Display.getHeight(), -1, 1));
        	glLoadMatrix(projMatrix);
        	glMatrixMode(GL_MODELVIEW);
        	glLoadIdentity();
        	glColor4f(1, 0, 0, 0.5f);
        	glBegin(GL_TRIANGLES);
        	glVertex3f(100, 100, 0);
        	glVertex3f(100+75, 100, 0);
        	glVertex3f(100, 100+75, 0);
        	
        	glVertex3f(100, 100+75, 0);
        	glVertex3f(100+75, 100, 0);
        	glVertex3f(100+75, 100+75, 0);
        	glEnd();
        	Display.update();
        }
	}
	
	private void reloadScale(Point2D.Float d) {
		FloatBuffer distanz_1 = BufferUtils.createFloatBuffer(3);
		FloatBuffer distanz_2 = BufferUtils.createFloatBuffer(3);
		Vector3f[] minmax = getMinMax();
		GLU.gluProject(minmax[1].x, minmax[1].y, minmax[1].z, viewMatrix, projMatrix, viewPort, distanz_1);
		GLU.gluProject(minmax[0].x, minmax[0].y, minmax[0].z, viewMatrix, projMatrix, viewPort, distanz_2);
		scaleFactor = (d.x/Math.abs((distanz_2.get(0)-distanz_1.get(0))));
	}
	
	public Vector3f[] getMinMax(){
		Float maxX = Float.MIN_VALUE;
		Float maxY = Float.MIN_VALUE;
		Float maxZ = Float.MIN_VALUE;
		Float minX = Float.MAX_VALUE;
		Float minY = Float.MAX_VALUE;
		Float minZ = Float.MAX_VALUE;
		for(int i = 0; i < vertexBuffer.capacity(); i+=3){
				if(vertexBuffer.get(i) >= maxX){
					maxX = vertexBuffer.get(i);
				}
				if(vertexBuffer.get(i+1) >= maxY){
					maxY = vertexBuffer.get(i+1);
				}
				if(vertexBuffer.get(i+2) >= maxZ){
					maxZ = vertexBuffer.get(i+2);
				}
				
				if(vertexBuffer.get(i) <= minX){
					minX = vertexBuffer.get(i);
				}
				if(vertexBuffer.get(i+1) <= minY){
					minY = vertexBuffer.get(i+1);
				}
				if(vertexBuffer.get(i+2) <= minZ){
					minZ = vertexBuffer.get(i+2);
				}
		}
		Vector3f v1 = new Vector3f(maxX, maxY, maxZ);
		Vector3f v2 = new Vector3f(minX, minY, minZ);
		return new Vector3f[]{v1, v2};
	}

	private void reloadPos(Point2D.Float f, Point2D.Float d) {
		Vector3f v = computePickingRay((int)(f.x+d.x*0.5f), (int)(Display.getHeight()-(f.y+d.x*0.5f)));
        v.scale(1);
        Vector3f eyeInWorldPos = computeWorldPosition(Display.getWidth()/2, Display.getHeight()/2);
        Vector3f p = new Vector3f(
            eyeInWorldPos.x + v.x,
            eyeInWorldPos.y + v.y,
            eyeInWorldPos.z + v.z);
        transX = p.x;
        transY = p.y;
        transZ = p.z;
	}

	private void drawCube() {
		glEnableClientState(GL_VERTEX_ARRAY);
		glBindBuffer(GL_ARRAY_BUFFER, vbo);
		glVertexPointer(3, GL_FLOAT, 0, 0);
		glDrawElements(GL_TRIANGLES, indexBuffer);
		glDisableClientState(GL_VERTEX_ARRAY);
	}

	public static void main(String[] args){
		new KSKB();
	}
	
	public static float[] ortho(float x, float y, float w, float h, float zNear, float zFar){
		float[] m = new float[16];
		m[0] = 2/(w-x);
		m[5] = 2/(y-h);
		m[10] = -2/(zFar-zNear);
		m[12] = -1*((w+x)/(w-x));
		m[13] = -1*((y+h)/(y-h));
		m[14] = -1*((zFar+zNear)/(zFar-zNear));
		m[15] = 1;
		return m;
	}
	
	public Vector3f computePickingRay(int x, int y)
    {
        FloatBuffer buf0 = BufferUtils.createFloatBuffer(3);
        FloatBuffer buf1 = BufferUtils.createFloatBuffer(3);
        GLU.gluUnProject(x, y, 0, viewMatrix, projMatrix, viewPort, buf0);
        GLU.gluUnProject(x, y, 1, viewMatrix, projMatrix, viewPort, buf1);
        Vector3f punkt0 = new Vector3f(buf0.get(0), buf0.get(1), buf0.get(2));
        Vector3f punkt1 = new Vector3f(buf1.get(0), buf1.get(1), buf1.get(2));
        Vector3f delta = new Vector3f(punkt1.x-punkt0.x, punkt1.y-punkt0.y, punkt1.z-punkt0.z);
        delta.normalise();
        return delta;
    }
	public Vector3f computeWorldPosition(int x, int y)
    {
        FloatBuffer buf0 = BufferUtils.createFloatBuffer(3);
        GLU.gluUnProject(x, y, 0, viewMatrix, projMatrix, viewPort, buf0);
        Vector3f punkt0 = new Vector3f(buf0.get(0), buf0.get(1), buf0.get(2));
        return punkt0;
    }
	
	public static int createVBO(FloatBuffer b, int id){
		GL15.glDeleteBuffers(id);
		id = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, id);
        glBufferData(GL_ARRAY_BUFFER, b, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
		return id;
	}
	
	public static IntBuffer putIntCoords(int[] ints){
		ByteBuffer vbb = ByteBuffer.allocateDirect(ints.length * 4);
	    vbb.order(ByteOrder.nativeOrder());
	    IntBuffer vertexBuffer = vbb.asIntBuffer();
	    vertexBuffer.put(ints);
	    vertexBuffer.position(0);
	    return vertexBuffer;
	}
	
	public static FloatBuffer putFloatCoords(float[] coords){
		ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4);
	    vbb.order(ByteOrder.nativeOrder());
	    FloatBuffer vertexBuffer = vbb.asFloatBuffer();
	    vertexBuffer.put(coords);
	    vertexBuffer.position(0);
	    return vertexBuffer;
	}
	
	public static float[] projection(final float fovy, final float aspect, final float zNear, final float zFar) {
		 
        final double f = (1.0 / Math.tan(Math.toRadians(fovy / 2.0)));
 
        final float[] m = new float[16];
 
        m[0] = (float) (f / aspect);
        m[5] = (float) (f);
        m[10] = (zFar + zNear) / (zNear - zFar);
        m[11] = (-1);
        m[14] = (2 * zFar * zNear) / (zNear - zFar);
        m[15] = 0;
 
        return m;
    }
	
	public static float[] einheitsMatrix(){
		float[] m = new float[16];
		m[0] = 1;
		m[1] = 0;
		m[2] = 0;
		m[3] = 0;
		
		m[4] = 0;
		m[5] = 1;
		m[6] = 0;
		m[7] = 0;
		
		m[8] = 0;
		m[9] = 0;
		m[10] = 1;
		m[11] = 0;
		
		m[12] = 0;
		m[13] = 0;
		m[14] = 0;
		m[15] = 1;
		return m;
	}
}

Ja, in Java :wink:

Ähm, kann jetzt jemand was damit anfangen?

tl;dr/scnr/Sry (Zu Slater schau)

Man müsste deinen Code einfach mal laufen lassen, um das ‘zu beurteilen’. Vielleicht kann ich das später machen.

Muss nochmal mehr Zeit investieren, um

  1. Zu wissen, was die Frage ist
  2. Woran das beobachtete Verhalten liegt
  3. Wie man das gewünschte Verhalten erreichen kann
    Kurz getested fällt auf, dass das Quadrat BREITER wird, wenn man das Fenster SCHMALER macht - soll das so sein?

Die Frage ist, warum der Würfel nicht schön innerhalb des roten Quadrats angezeigt wird.
Das liegt 1. daran, dass der Skalierungsfaktor irgenwie falsch berechnet wird(Methode: reloadScale) und 2. daran, dass die Position im 3D-Raum falsch berechnet wird(Mathode: reloadPos). Ich glaube, diese Probleme kommen daher, dass diese Project Methoden nicht richtig funktionieren.
Wie man das erreichen kann, weiß ich nicht, inzwischen funktionieren in meinem eigentlichen Projekt die ganzen “glu(Un)Project” Methoden nicht.
Das Quadrat ist mit absoluten Punkten gemacht, daran könnte es liegen. Einfach das Fenster nicht verkleinern/vergrößern.

Kann ich aus dem “Schweigen” schließen, dass keiner eine Ahnung hat?

Ja, wir sind alle blöd :sick:

Mal im Ernst: Ich hätte schwören können, schon geantwortet zu haben, meine jetzt aber, mich zu erinnern, dass da mein Chef dazwischengefunkt hat, und es dann untergegangen ist.

Wenn du etwas in einen “kleinen Bereich auf dem Bildschirm” rendern willst (quasi in ein kleines Unter-Fenster - oder “Slot”, wie du es nennst), dann beitet sich dafür glViewport an. Man KÖNNTE zwar auch versuchen, alle Matrizen so umzubiegen, dass alles in diesem Bereich landet, aber … das ist ggf. ziemlich krampfig.

Wenn man den Display-Loop so ändert…

    while(!Display.isCloseRequested()){
            projMatrix = putFloatCoords(projection(45, Display.getWidth()/Display.getHeight(), 0.1f, 1000));
            viewMatrix = putFloatCoords(einheitsMatrix());
            glMatrixMode(GL_PROJECTION);
            glLoadMatrix(projMatrix);
            glMatrixMode(GL_MODELVIEW);
            glLoadMatrix(viewMatrix);
            //reloadPos(new Point2D.Float(100, 100), new Point2D.Float(75, 75));
            //reloadScale(new Point2D.Float(75, 75));
            
            glViewport(100, Display.getHeight()-100-75, 75, 75);
            
            glClear(GL_DEPTH_BUFFER_BIT);
            //glTranslatef(transX, transY, transZ);
            //glScalef(scaleFactor, scaleFactor, scaleFactor);
            glPushMatrix();
            glTranslatef(0,0,-5);
            glRotatef(45, 1, 1, 0);
            glColor4f(1, 1, 1, 1);
            drawCube();
            glPopMatrix();
            //glRotatef(-45, 1, 1, 0);
            //glScalef(1/scaleFactor, 1/scaleFactor, 1/scaleFactor);
            //glTranslatef(-transX, -transY, -transZ);
           
            glViewport(0, 0, Display.getWidth(), Display.getHeight());

            ...

kommt das vermutlich schon recht nah an das, was du willst. Der Vorteil dabei ist: Man kann in diesen kleinen Viewport reinrendern, wie in ein ganz normales GL-Fenster (ggf. muss die Projektionsmatrix dann nicht mehr “Display.getWidth()/Display.getHeight()” verwenden, sondern “75.0f/75.0f”, für den aktuellen Viewport)

Nebenbei: WENN man schon die veraltete Fixed-Function-Pipeline mit glRotate & Co verwendet, dann sollte man das auch richtig machen: Rotationen, Translationen und Skalierungen “rückgängig” zu machen, indem man die “inversen Operationen” ausführt, ist ein Krampf. Genau dafür ist (bzw. waren) glPushMatrix und glPopMatrix da.

// Start
glPushMatrix();
machIrgendwelcheAbsurdenTransformationen();
malIrgendwasTransformiertes();
glPopMatrix();
// Jetzt ist die Matrix wieder die gleiche, wie beim "glPushMatrix" -
// egal, welche AbsurdenTransformationen dort gemacht wurden

Ja, daran hab ich gar nicht gedacht, das mit dem Viewport ist genial, ich werde es mal ausprobieren. Dieses Veraltete Zeug hab ich nur verwendet, weil ich der Meinung war, dass es für ein KSKB wesentlich kürzer und einfacher ist, ich kenne mich damit aber nicht so aus, was aber ja nicht so schlimm ist, da ich das normalerweise nicht verwende.

Das stimmt natürlich, und ist eine IMHO völlig valide Rechtfertigung. (Was wäre auch die Alternative? Kompletten Shader-Code und seine eigene Matrix-Lib mal kurz hochladen?!)

Das funktioniert tatsächlich, aber nur, wenn die Viewmatrix gleich der Einheitsmatrix ist. Aber das ist nur im KSKB so. Ich habe das mal ergänzt und der Würfel bewegt sich immer nur durch “dieses Fensterchen”, wenn man sich bewegt. Also muss man diese Transformationen doch machen, damit dieser Würfel da auch im Miniviewport gezeichnet wird, oder?

“Dieses Fensterchen” und den “Miniviewprt” (bzw. den Unterschied dazwischen) müßtest du erklären. Bisher dachte ich, dass irgendwas in diesen kleinen Bereich gerendert werden sollte. Soll es jetzt woanders sein?

Ja, das soll beides das selbe bedeuten, ich dachte nur, das macht das ganze anschaulicher. Es ist das Quadrat gemeint, wo das Ding reingezeichnet werden soll.

Hm. Eine Vermutung, was du meinen könntest: Wenn dort in dieses kleine Fensterchen etwas reingerendert werden soll, dann wird dafür natürlich üblicherweise eine andere View-Matrix verwendet, als für den Rest der Szene.

void maleDasZeugInsKleineFenster()
{
    glViewport(10,20,30,40);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrix(projectionFürItem);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glMultMatrix(transformation);
    drawCube();
}

void maleDieEigentlicheSzene()
{
    glViewport(0,0,displayW, displayH);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrix(projectionFürSzene);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glMultMatrix(andereTransformation);
    drawCube();
}