JOGL로 한 그래픽스 실습 <Lighitng>
Sorce Bank 2010. 6. 1. 20:46
import java.awt.*; import java.awt.event.*; import com.sun.opengl.util.Animator; import javax.media.opengl.GL; import javax.media.opengl.glu.GLU; import javax.media.opengl.GLCanvas; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLEventListener; public class Lighting extends Frame implements GLEventListener, KeyListener { 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 Lighting() { super("Lighting and Shading"); setLayout(new BorderLayout()); setSize(400, 400); setLocation(40, 40); setVisible(true); setupJOGL(); } /** * Called by the drawable immediately after the OpenGL context is * initialized; the GLContext has already been made current when * this method is called. * * @param drawable The display context to render to */ public void init(GLAutoDrawable drawable) { GL gl = drawable.getGL(); gl.glClearColor(1, 1, 1, 1); gl.glEnable(GL.GL_DEPTH_TEST); float light0_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f}; float light0_diffuse[] = {0.4f, 0.6f, 0.0f, 1.0f}; float light0_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; float light0_position[] = {1.0f, 1.0f, 1.0f, 0.0f}; gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, light0_ambient, 0); gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, light0_diffuse, 0); gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, light0_specular, 0); gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, light0_position, 0); gl.glEnable(GL.GL_LIGHTING); gl.glEnable(GL.GL_LIGHT0); float mat_ambient[] = {0.8f, 0.8f, 0.2f, 1.0f}; float mat_diffuse[] = {0.1f, 0.5f, 0.8f, 1.0f}; float mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; float mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; float mat_shininess = 50.0f; gl.glLightfv(GL.GL_FRONT, GL.GL_AMBIENT, mat_ambient, 0); gl.glLightfv(GL.GL_FRONT, GL.GL_DIFFUSE, mat_diffuse, 0); gl.glLightfv(GL.GL_FRONT, GL.GL_SPECULAR, mat_specular, 0); gl.glLightfv(GL.GL_FRONT, GL.GL_EMISSION, mat_emission, 0); gl.glLightf(GL.GL_FRONT, GL.GL_SHININESS, mat_shininess); drawable.addKeyListener(this); } /** * Called by the drawable when the surface resizes itself. Used to * reset the viewport dimensions. * * @param drawable The display context to render to */ public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { } /** * Called by the drawable when the display mode or the display device * associated with the GLDrawable has changed */ public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { } /** * Called by the drawable to perform rendering by the client. * * @param drawable The display context to render to */ public void display(GLAutoDrawable drawable) { GL gl = drawable.getGL(); GLU glu = new GLU(); // clear the frame buffer and the depth buffer gl.glClear(GL.GL_COLOR_BUFFER_BIT); gl.glClear(GL.GL_DEPTH_BUFFER_BIT); // set intrinsic properties of the camera gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(45.0f, 1.0f, 0.0001, 100000.0); // set extrinsic properties of the camera gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); glu.gluLookAt(3.0f, 3.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); gl.glEnable(GL.GL_LIGHTING); gl.glEnable(GL.GL_LIGHT0); /// draw objects draw_cube(drawable); // swap buffers (double buffering) //glutSwapBuffers(); } public void draw_cube(GLAutoDrawable drawable) { // TODO: set a proper normal for each face GL gl = drawable.getGL(); gl.glBegin(GL.GL_QUADS); // front gl.glNormal3f(0.0f, 0.0f, 1.0f); gl.glVertex3f(1.0f, 1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f); // back gl.glNormal3f(0.0f, 0.0f, -1.0f); gl.glVertex3f(1.0f, -1.0f, -1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); gl.glVertex3f(1.0f, 1.0f, -1.0f); // right gl.glNormal3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(1.0f, 1.0f, 1.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f); gl.glVertex3f(1.0f, -1.0f, -1.0f); gl.glVertex3f(1.0f, 1.0f, -1.0f); // left gl.glNormal3f(-1.0f, 0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); // top gl.glNormal3f(0.0f, 1.0f, 0.0f); gl.glVertex3f(1.0f, 1.0f, 1.0f); gl.glVertex3f(1.0f, 1.0f, -1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); // bottom gl.glNormal3f(0.0f, -1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); gl.glVertex3f(1.0f, -1.0f, -1.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f); gl.glEnd(); } private void setupJOGL() { GLCapabilities caps = new GLCapabilities(); caps.setDoubleBuffered(true); caps.setHardwareAccelerated(true); GLCanvas canvas = new GLCanvas(caps); canvas.addGLEventListener(this); add(canvas, BorderLayout.CENTER); Animator anim = new Animator(canvas); anim.start(); } public static void main(String[] args) { Lighting demo = new Lighting(); demo.setVisible(true); } }
'Sorce Bank' 카테고리의 다른 글
B-Tree (0) | 2010.05.15 |
---|---|
그래픽스 : Solar System (0) | 2010.05.11 |
Python BST + AVL (0) | 2010.05.08 |
Python HW 2번문제 (0) | 2010.05.06 |
Python HW 1번문제 (0) | 2010.05.06 |