Destrovi4 icon

destr.jogl.camera.PerspectiveCamera

Destrovi4 | PRO | 01/12/13 07:12:40 PM UTC | 0 ⭐ | 167 👁️ | Never ⏰ | []
Java |

1.87 KB

|

None

|

0 👍

/

0 👎

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