# Computer Graphics

## Perspective Projection

Special Case -- zvp = zp = 0

 xprp=0.0 yprp=0.0 zprp=-3.0 xprp=1.0 yprp=0.0 zprp=-3.0 xprp=1.5 yprp=0.5 zprp=-3.0

import java.awt.*;

import java.awt.event.*;

import net.java.games.jogl.*;

public class Cube3

{

static class Renderer implements GLEventListener,KeyListener

{

public void display(GLDrawable gLDrawable)

{

final GL gl = gLDrawable.getGL();

gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

gl.glMatrixMode(GL.GL_MODELVIEW);

float [][] cube = { {1.0f, 1.0f,1.0f},{-1.0f, 1.0f, 1.0f},

{-1.0f, 1.0f, 3.0f},{1.0f, 1.0f, 3.0f},

{1.0f,-1.0f, 3.0f},{-1.0f,-1.0f, 3.0f},

{-1.0f,-1.0f,1.0f},{1.0f,-1.0f,1.0f}};

float [][] cuber = new float [8][2];

float xprp=1.5f;

float yprp=1.5f;

float zprp=-3.0f;

// Perspective Projection

for (int i =0; i<8;i++){

cuber[i][0] = cube[i][0] - cube[i][2]*((cube[i][0]-xprp)/(cube[i][2]-zprp));

cuber[i][1] = cube[i][1] - cube[i][2]*((cube[i][1]-yprp)/(cube[i][2]-zprp));

System.out.println(i+" "+cuber[i][0]+" "+cuber[i][1]);

}

gl.glLineWidth (2.0f);

gl.glBegin(GL.GL_LINES);

gl.glColor3f(0.0f,1.0f,0.0f);     // Set The Color To Green

gl.glVertex2fv(cuber[0]);         // Top Right Of The Quad (Top), 0

gl.glVertex2fv(cuber[1]);         // Top Left Of The Quad (Top), 1

gl.glVertex2fv(cuber[1]);         // Top Left Of The Quad (Top), 1

gl.glVertex2fv(cuber[2]);         // Bottom Left Of The Quad (Top), 2

gl.glVertex2fv(cuber[2]);         // Bottom Left Of The Quad (Top), 2

gl.glVertex2fv( cuber[3]);        // Bottom Right Of The Quad (Top), 3

gl.glVertex2fv(cuber[3]);         // Bottom Right Of The Quad (Top), 3

gl.glVertex2fv(cuber[0]);           // Top Right Of The Quad (Top), 0

gl.glColor3f(1.0f,0.5f,0.0f);     // Set The Color To Orange

gl.glVertex2fv( cuber[4]);        // Top Right Of The Quad (Bottom), 4

gl.glVertex2fv(cuber[5]);         // Top Left Of The Quad (Bottom), 5

gl.glVertex2fv(cuber[5]);         // Top Left Of The Quad (Bottom), 5

gl.glVertex2fv(cuber[6]);         // Bottom Left Of The Quad (Bottom), 6

gl.glVertex2fv(cuber[6]);         // Bottom Left Of The Quad (Bottom), 6

gl.glVertex2fv(cuber[7]);         // Bottom Right Of The Quad (Bottom), 7

gl.glVertex2fv(cuber[7]);         // Bottom Right Of The Quad (Bottom), 7

gl.glVertex2fv(cuber[4]);         // Top Right Of The Quad (Bottom), 4

gl.glColor3f(0.0f,0.0f,1.0f);     // Set The Color To Blue

gl.glVertex2fv(cuber[0]);         // Top Right Of The Quad (Top), 0

gl.glVertex2fv(cuber[7]);         // Bottom Right Of The Quad (Bottom), 7

gl.glVertex2fv(cuber[6]);         // Bottom Left Of The Quad (Bottom), 6

gl.glVertex2fv(cuber[1]);         // Top Left Of The Quad (Top), 1

gl.glVertex2fv(cuber[5]);         // Top Left Of The Quad (Bottom), 5

gl.glVertex2fv(cuber[2]);         // TBottom Left Of The Quad (Top), 2

gl.glVertex2fv(cuber[4]);         // Top Right Of The Quad (Bottom), 4

gl.glVertex2fv(cuber[3]);         // Bottom Right Of The Quad (Top), 3

gl.glEnd();

gl.glFlush();

}

public void displayChanged(GLDrawable gLDrawable, boolean modeChanged, boolean deviceChanged)

{

}

public void init(GLDrawable gLDrawable)

{

final GL gl = gLDrawable.getGL();

final GLU glu = gLDrawable.getGLU();

gl.glClearColor(0.0f, 0.0f, 0.0f,0.0f);    // Black Background

gl.glMatrixMode(GL.GL_PROJECTION);

glu.gluOrtho2D (-1.5f, 1.5f, -1.5f, 1.5f);  // define drawing area

}

public void reshape(GLDrawable gLDrawable, int x, int y, int width, int height)

{

}

public void keyPressed(KeyEvent e)

{

if (e.getKeyCode() == KeyEvent.VK_ESCAPE)

{

System.exit(0);

}

}

public void keyReleased(KeyEvent e) {}

public void keyTyped(KeyEvent e) {}

}

public static void main(String[] args)

{

Frame frame = new Frame("Lesson 5: 3D Shapes");

GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(new GLCapabilities());

frame.setSize(500, 500);

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

});

frame.show();

canvas.requestFocus();

}

}

## OpenGL Perspective

glu.gluPerspective(angle_of_view, aspect ratio, front clipping plane, rear clipping plane);

glu.gluLookAt(x0,y0,z0,xref,yref,zref,Vx,Vy,Vz);

default:

P0 = P(x0,y0,z0) = (0,0,0)

Pref = (0,0,-1)

Vup_Vector = (Vx,Vy,Vz) = (0,1,0)

import java.awt.*;

import java.awt.event.*;

import net.java.games.jogl.*;

public class Cube2

{

static Animator animator = null;

static class Renderer

implements GLEventListener,

KeyListener

{

public void display(GLDrawable gLDrawable)

{

final GL gl = gLDrawable.getGL();

gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

float [][] cube = { {1.0f, 1.0f,-1.0f},{-1.0f, 1.0f, -1.0f},

{-1.0f, 1.0f, 1.0f},{1.0f, 1.0f, 1.0f},

{1.0f,-1.0f, 1.0f},{-1.0f,-1.0f, 1.0f},

{-1.0f,-1.0f,-1.0f},{1.0f,-1.0f,-1.0f}};

gl.glMatrixMode(GL.GL_MODELVIEW);

gl.glTranslatef(0.0f, 0.0f, -4.0f);

gl.glLineWidth (2.0f);

gl.glBegin(GL.GL_LINES);

gl.glColor3f(0.0f,1.0f,0.0f);                 // Set The Color To Green

gl.glVertex3fv(cube[0]);                // Top Right Of The Quad (Top), 0

gl.glVertex3fv(cube[1]);                // Top Left Of The Quad (Top), 1

gl.glVertex3fv(cube[1]);                // Top Left Of The Quad (Top), 1

gl.glVertex3fv(cube[2]);                // Bottom Left Of The Quad (Top), 2

gl.glVertex3fv(cube[2]);                // Bottom Left Of The Quad (Top), 2

gl.glVertex3fv( cube[3]);               // Bottom Right Of The Quad (Top), 3

gl.glVertex3fv( cube[3]);               // Bottom Right Of The Quad (Top), 3

gl.glVertex3fv(cube[0]);                  // Top Right Of The Quad (Top), 0

gl.glColor3f(1.0f,0.5f,0.0f);                 // Set The Color To Orange

gl.glVertex3fv( cube[4]);               // Top Right Of The Quad (Bottom), 4

gl.glVertex3fv(cube[5]);                // Top Left Of The Quad (Bottom), 5

gl.glVertex3fv(cube[5]);                // Top Left Of The Quad (Bottom), 5

gl.glVertex3fv(cube[6]);                // Bottom Left Of The Quad (Bottom), 6

gl.glVertex3fv(cube[6]);                // Bottom Left Of The Quad (Bottom), 6

gl.glVertex3fv(cube[7]);                // Bottom Right Of The Quad (Bottom), 7

gl.glVertex3fv(cube[7]);                // Bottom Right Of The Quad (Bottom), 7

gl.glVertex3fv( cube[4]);               // Top Right Of The Quad (Bottom), 4

gl.glColor3f(0.0f,0.0f,1.0f);                // Set The Color To Blue

gl.glVertex3fv(cube[0]);               // Top Right Of The Quad (Top), 0

gl.glVertex3fv( cube[7]);              // Bottom Right Of The Quad (Bottom), 7

gl.glVertex3fv(cube[6]);                // Bottom Left Of The Quad (Bottom), 6

gl.glVertex3fv(cube[1]);                // Top Left Of The Quad (Top), 1

gl.glVertex3fv(cube[5]);                // Top Left Of The Quad (Bottom), 5

gl.glVertex3fv(cube[2]);                // Top Right Of The Quad (Top), 0

gl.glVertex3fv( cube[4]);               // Top Right Of The Quad (Bottom), 4

gl.glVertex3fv( cube[3]);               // Bottom Right Of The Quad (Top), 3

gl.glEnd();

gl.glFlush();

}

public void displayChanged(GLDrawable gLDrawable, boolean modeChanged, boolean deviceChanged)

{

}

public void init(GLDrawable gLDrawable)

{

final GL gl = gLDrawable.getGL();

final GLU glu = gLDrawable.getGLU();

gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);  // Black Background

gl.glClearDepth(1.0f);                    // Depth Buffer Setup

gl.glEnable(GL.GL_DEPTH_TEST);            // Enables Depth Testing

gl.glDepthFunc(GL.GL_LEQUAL); // The Type Of Depth Testing To Do

gl.glMatrixMode(GL.GL_PROJECTION);

glu.gluLookAt(0.0,0.0,0.0,0.0,0.0,-1.0,0.0,1.0,0.0);

glu.gluPerspective(70.0f, 1.0, 0.0, 20.0);

}

public void reshape(GLDrawable gLDrawable, int x, int y, int width, int height)

{

}

public void keyPressed(KeyEvent e)

{

if (e.getKeyCode() == KeyEvent.VK_ESCAPE)

{

animator.stop();

System.exit(0);

}

}

public void keyReleased(KeyEvent e) {}

public void keyTyped(KeyEvent e) {}

}

public static void main(String[] args)

{

Frame frame = new Frame("Lesson 5: 3D Shapes");

GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(new GLCapabilities());

frame.setSize(300, 300);

animator = new Animator(canvas);

{

public void windowClosing(WindowEvent e)

{

animator.stop();

System.exit(0);

}

});

frame.show();

animator.start();

canvas.requestFocus();

}

}