I cannot really get it to work properly, but with gluLookAt I was pretty successfull:
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.*;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.util.vector.Vector3f;
public class test {
static Vector3f camPos = new Vector3f();
static float distance = 4.0f;
static float angleY = 0.0f;
static float angleX = 0.0f;
public static void main(String[] args){
try {
DisplayMode displayMode = null;
Display.setFullscreen(false);
DisplayMode[] d = Display.getAvailableDisplayModes();
for (int i = 0; i < d.length; i++) {
if (d[i].getWidth() == 640 && d[i].getHeight() == 480 && d[i].getBitsPerPixel() == 32) {
displayMode = d[i];
break;
}
}
Display.setDisplayMode(displayMode);
Display.setTitle("test");
Display.create();
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GL11.glClearDepth(1.0f);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45.0f, (float) displayMode.getWidth() / (float) displayMode.getWidth(),0.1f,100.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
boolean running = true;
Mouse.create();
while(running){
if(Mouse.isButtonDown(0)){
angleY += Mouse.getDX() * 0.5f;
angleX += Mouse.getDY() * 0.5f;
}
if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { // Exit if Escape is pressed
running = false;
}
if(Display.isCloseRequested()) { // Exit if window is closed
running = false;
}
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
float camX = (float) (distance * Math.sin(angleY * Math.PI / 180.0));
float camZ = (float) (distance * Math.cos(angleY * Math.PI / 180.0));
Vector3f rotY = new Vector3f(camX, camPos.y, camZ);
float camY = (float) (distance * Math.sin(angleX * Math.PI / 180.0));
camZ = (float) (distance * Math.cos(angleX * Math.PI / 180.0));
Vector3f rotX = new Vector3f(camPos.x, camY, camZ);
//Take the Y rotation
camPos.x = rotY.x;
camPos.z = rotY.z;
//Take the X rotation
//camPos.y = rotX.y;
//camPos.z = rotX.z;
GLU.gluLookAt(camPos.x, camPos.y, camPos.z, 0, 0, 0, 0, 1, 0);
GL11.glBegin(GL11.GL_TRIANGLES);
GL11.glColor3f(1.0f,0.0f,0.0f);
GL11.glVertex3f( 0.0f, 1.0f, 0.0f);
GL11.glColor3f(0.0f,1.0f,0.0f);
GL11.glVertex3f(-1.0f,-1.0f, 1.0f);
GL11.glColor3f(0.0f,0.0f,1.0f);
GL11.glVertex3f( 1.0f,-1.0f, 1.0f);
GL11.glColor3f(1.0f,0.0f,0.0f);
GL11.glVertex3f( 0.0f, 1.0f, 0.0f);
GL11.glColor3f(0.0f,0.0f,1.0f);
GL11.glVertex3f( 1.0f,-1.0f, 1.0f);
GL11.glColor3f(0.0f,1.0f,0.0f);
GL11.glVertex3f( 1.0f,-1.0f, -1.0f);
GL11.glColor3f(1.0f,0.0f,0.0f);
GL11.glVertex3f( 0.0f, 1.0f, 0.0f);
GL11.glColor3f(0.0f,1.0f,0.0f);
GL11.glVertex3f( 1.0f,-1.0f, -1.0f);
GL11.glColor3f(0.0f,0.0f,1.0f);
GL11.glVertex3f(-1.0f,-1.0f, -1.0f);
GL11.glColor3f(1.0f,0.0f,0.0f);
GL11.glVertex3f( 0.0f, 1.0f, 0.0f);
GL11.glColor3f(0.0f,0.0f,1.0f);
GL11.glVertex3f(-1.0f,-1.0f,-1.0f);
GL11.glColor3f(0.0f,1.0f,0.0f);
GL11.glVertex3f(-1.0f,-1.0f, 1.0f);
GL11.glEnd();
Display.update();
}
Display.destroy();
} catch (LWJGLException ex) {
Logger.getLogger(test.class.getName()).log(Level.SEVERE, null, ex);
System.exit(0);
}
}
}
The only problem wich remains with this, is how to combine the X and Y rotations properly?
I tried matrices and quaternions, but couldn't get the results I expected.