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);
}
}
Comments