OpenGL LWJGL Kamera

Hallo
Ich habe mit OpenGL bisher nur in Android gearbeitet und möchte es jetzt auch am PC mal versuchen mit LWJGL.
Das funktioniert eigentlich ganz gut, ich möchte bloss noch eine Kamrea mit Bewegung machen. In Android geht das mit GLU.gluLookAt, aber wenn ich das am PC so mache wird nichts angezeigt, nur schwarz.Ohne diese Methode wirds schon angezeigt. Warum ? Immerhin gibt es diese Methode und wenn sie zu nichts gut wäre würde es sie ja nicht geben.

Hm. Wieder mal eine Frage, wo man nur händewedelnd-nebulös sagen kann: Joa, dann stimmt da wohl irgendwas nicht. Ist es NUR der GLU-Aufruf, der es kaputt macht? Welche Kameramatrix verwendest du sonst? Was passiert bei einem händischen

    /**
     * Computes a look-at-transformation matrix
     * 
     * @param eye The eye position
     * @param center The view center
     * @param up The up vector
     * @return The matrix
     */
    private static Matrix4f computeLookAtMatrix(
        Tuple3f eye, Tuple3f center, Tuple3f up)
    {
        Matrix4f m = new Matrix4f();

        Vector3f forward = new Vector3f();
        Vector3f side = new Vector3f();
        Vector3f upV = new Vector3f(up);

        forward.sub(center, eye);
        
        forward.normalize();
        side.cross(forward, upV);
        side.normalize();
        upV.cross(side, forward);

        m.setIdentity();
        
        m.m00 = side.x;
        m.m01 = side.y;
        m.m02 = side.z;

        m.m10 = upV.x;
        m.m11 = upV.y;
        m.m12 = upV.z;

        m.m20 = -forward.x;
        m.m21 = -forward.y;
        m.m22 = -forward.z;

        return m;
    }

?!

Der Code funktioniert gar nicht und selbst wenn ichs anpasse:

private static Matrix4f computeLookAtMatrix(
	        Vector3f eye, Vector3f center, Vector3f up)
	    {
	        Matrix4f m = new Matrix4f();
	        Vector3f forward = new Vector3f();
	        Vector3f side = new Vector3f();
	        Vector3f upV = new Vector3f(up);
	 
	        Vector3f.sub(center, forward, eye);
	        forward.normalise();
	        Vector3f.cross(forward, side, upV);
	        side.normalise();
	        Vector3f.cross(side, upV, forward);
	 
	        m.setIdentity();
	       
	        m.m00 = side.x;
	        m.m01 = side.y;
	        m.m02 = side.z;
	 
	        m.m10 = upV.x;
	        m.m11 = upV.y;
	        m.m12 = upV.z;
	 
	        m.m20 = -forward.x;
	        m.m21 = -forward.y;
	        m.m22 = -forward.z;
	 
	        return m;
	    }

Wie benutze ich das(Hab damit noch nicht gearbeitet, wie gesagt gibts da diese Methode.

Moin,

poste Deinen bisherigen Versuch doch mal als KSKB, dann lässt sich der Fehler meisten schnell finden. Das alles schwarz bleibt ist bei OpenGL nichts Ungewöhnliches.

gluLookAt verhält sich bei LWJGL imho so wie man es erwartet.

Gruß
Fancy

Nun, es gibt etliche LWJGL-Beispiele wo lookAt verwendet wird, da jetzt eins hier rein zu kopieren wäre wohl nicht zielführend, … solange du nicht beschreibst/postest, wie du es bisher verwendest, wird man da wohl nicht viel machen können.

(BTW: Das gepostete war für VecMath, und auch nur aus der SGI-Referenzimplementierung von GLU geklaut… :o )

EDIT: Tja, 3 Minuten zu langsam… :rolleyes:

Im folgenden KSKB wird das Quadrat schon angezeigt, nur ändert sich der Blick nicht wenn man die Pfeiltaste “Hoch” drückt.

package zombiepriester.gl.kskb;

import java.awt.Canvas;
import java.awt.Dimension;

import javax.swing.JFrame;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;

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

public class KSKB {

	private int w, h;
	private float camX = 0;
	private float camY = 0;
	private float camZ = 5;
	private float camFocusX = 0;
	private float camFocusY = 0;
	private float camFocusZ = 0;
	private float upX = 0;
	private float upY = 1;
	private float upZ = 0;
	
	public static void main(String[] args){
		new KSKB();
	}
	
	public KSKB(){
		JFrame f = new JFrame("KSKB");
		f.setPreferredSize(new Dimension(800, 550));
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.pack();
		Canvas canvas = new Canvas();
		f.add(canvas);
		try {
		Display.setParent(canvas);
		f.setVisible(true);
		Display.create();
		} catch (LWJGLException e) {
			e.printStackTrace();
		}
		
		w = Display.getWidth();
		h = Display.getHeight();
		while(!Display.isCloseRequested()){
			glClear(GL11.GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
			glViewport(0, 0, w, h);
			glMatrixMode(GL_MODELVIEW);
			glLoadIdentity();
			GLU.gluLookAt(camX, camY, camZ, camFocusX, camFocusY, camFocusZ, upX, upY, upZ);
			glLoadIdentity();
			glBegin(GL_QUADS);
			glVertex3f(-0.1f, -0.1f, 0f);
			glVertex3f(-0.1f,  0.1f, 0f);
			glVertex3f( 0.1f,  0.1f, 0f);
			glVertex3f( 0.1f, -0.1f, 0f);
			glEnd();
			Display.update();
			if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
				camZ--;
				System.out.println("geht");
			}
		}
	}
}

Zum einem setzt Du keine Projektionsmatrix, damit bleibt diese die Einheitsmatrix und hat damit orthogonale Eigenschaften. Eine Bewegung entlang der z-Achse hat damit keine sichtbaren Auswirkungen. Zum anderen überschreibt das glLoadIdentity in Zeile 57 die durch gluLookAt gesetzte Modelview-Matrix wieder zur Einheitsmatrix, wodurch gluLookAt ebenfalls ohne Auswirkungen bleibt.

So geht es:



import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_MODELVIEW;
import static org.lwjgl.opengl.GL11.GL_PROJECTION;
import static org.lwjgl.opengl.GL11.GL_QUADS;
import static org.lwjgl.opengl.GL11.glBegin;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glEnd;
import static org.lwjgl.opengl.GL11.glLoadIdentity;
import static org.lwjgl.opengl.GL11.glMatrixMode;
import static org.lwjgl.opengl.GL11.glVertex3f;
import static org.lwjgl.opengl.GL11.glViewport;

import java.awt.Canvas;
import java.awt.Dimension;

import javax.swing.JFrame;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;


public class KSKB {

    private final int w, h;
    private final float camX = 0;
    private final float camY = 0;
    private float camZ = 5;
    private final float camFocusX = 0;
    private final float camFocusY = 0;
    private final float camFocusZ = 0;
    private final float upX = 0;
    private final float upY = 1;
    private final float upZ = 0;


    public static void main(final String[] args) {

        new KSKB();

    }


    public KSKB() {

        final JFrame f = new JFrame("KSKB");
        f.setPreferredSize(new Dimension(800, 550));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        final Canvas canvas = new Canvas();
        f.add(canvas);
        try {
            Display.setParent(canvas);
            Display.setVSyncEnabled(true);
            f.setVisible(true);
            Display.create();
        } catch (final LWJGLException e) {
            e.printStackTrace();
        }

        w = Display.getWidth();
        h = Display.getHeight();
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        GLU.gluPerspective(45.0f, (float) w / (float) h, 0.1f, 1000);
        while (!Display.isCloseRequested()) {
            glClear(GL11.GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glViewport(0, 0, w, h);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            GLU.gluLookAt(camX, camY, camZ, camFocusX, camFocusY, camFocusZ, upX, upY, upZ);
            // glLoadIdentity();
            glBegin(GL_QUADS);
            glVertex3f(-0.1f, -0.1f, 0f);
            glVertex3f(-0.1f, 0.1f, 0f);
            glVertex3f(0.1f, 0.1f, 0f);
            glVertex3f(0.1f, -0.1f, 0f);
            glEnd();
            Display.update();
            if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
                camZ -= 0.005f;
                System.out.println("geht");
            }
        }
    }
}

Gruß
Fancy

Danke funktioniert.