package destr.jogl.camera; import javax.media.opengl.GL; import javax.media.opengl.GL2; import destr.math.Matrix4f; import destr.math.Vector3f; public class PerspectiveCamera { public Matrix4f viewport = new Matrix4f(), transform = new Matrix4f(); public Vector3f eyePosition3D = new Vector3f(), center3D = new Vector3f(), upVector3D = new Vector3f(), forward = new Vector3f(), side = new Vector3f(), up = new Vector3f(); public void viewport(float fovyInDegrees, float aspectRatio, float znear, float zfar){ float ymax = (float) (znear * Math.tan(fovyInDegrees * Math.PI / 360.0)), xmax = ymax * aspectRatio; viewport = Matrix4f.makeFrustum(-xmax, xmax, -ymax, ymax, znear, zfar); } public void lookAt(Vector3f eyePosition3D, Vector3f center3D, Vector3f upVector3D){ System.out.println("lookAt:" + eyePosition3D); this.eyePosition3D = eyePosition3D; this.center3D = center3D; this.upVector3D = upVector3D; updateTransform(); } private void updateTransform(){ forward = center3D.clone().subtract(eyePosition3D).normalize(); side = forward.normal(upVector3D).normalize(); up = side.normal(forward); transform = Matrix4f.makeByCols( side.toArray(), up.toArray(), forward.clone().inc(-1).toArray() ); System.out.println("t-update:" + eyePosition3D); } public void update(GL gl){ //if(needUpdate) { updateTransform(); //} Matrix4f result = viewport.multiply(transform); gl.getGL2().glLoadMatrixf(result.toArray(), 0); gl.getGL2().glTranslatef(-eyePosition3D.x(), -eyePosition3D.y(), -eyePosition3D.z()); } public void moveUp(GL gl, float delta){ GL2 gl2 = gl.getGL2(); gl2.glTranslatef(0,-delta,0); eyePosition3D.x(eyePosition3D.x()+delta); System.out.println("move:" + eyePosition3D); } }