1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| package Test1;
import com.sun.opengl.util.Animator; import com.sun.opengl.util.GLUT; import java.awt.Dimension; import java.awt.Frame; import java.awt.Insets; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.media.opengl.*; import javax.media.opengl.glu.*; import javax.swing.SwingUtilities;
public class TestAPoster extends Frame implements GLEventListener {
private final GLU GLU = new GLU(); private final GLUT GLUT = new GLUT(); private final Dimension CLIENT_MINIMUM_DIMENSION = new Dimension(640, 480);
final float[] CAMERA_POSITION = new float[]{0F, 5F, 15F}; final float[] CAMERA_DIRECTION = new float[]{0F, 0F, 0F}; final float[] SPOT_POSITION = new float[]{0F, 5F, 15F, 1F}; final float[] SPOT_DIRECTION = new float[]{0F, 0F, -1F, 1F};
public TestAPoster() {
GLCapabilities glCapabilities = new GLCapabilities(); glCapabilities.setDoubleBuffered(true); glCapabilities.setHardwareAccelerated(true);
GLCanvas canvas = new GLCanvas(); canvas.addGLEventListener(this); canvas.setPreferredSize(CLIENT_MINIMUM_DIMENSION); add(canvas);
setTitle(getClass().getSimpleName()); setLocation(20, 20); setVisible(true); final Insets insets = getInsets(); setMinimumSize(new Dimension(CLIENT_MINIMUM_DIMENSION.width + insets.left + insets.right, CLIENT_MINIMUM_DIMENSION.height + insets.top + insets.bottom)); pack();
final Animator animator = new Animator(canvas); addWindowListener(new WindowAdapter() {
@Override public void windowClosing(WindowEvent e) { new Thread(new Runnable() {
@Override public void run() { animator.stop(); System.exit(0); } }).start(); } }); animator.start(); }
@Override public void init(GLAutoDrawable _glDrawable) { }
@Override public void display(GLAutoDrawable _glDrawable) { final GL gl = _glDrawable.getGL(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); GLUT.glutSolidTeapot(3); }
@Override public void reshape(GLAutoDrawable _glDrawable, int _x, int _y, int _width, int _height) { final GL gl = _glDrawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); gl.glClearDepth(1.0f);
gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); GLU.gluPerspective(45, (double) ((double) _width / (double) _height), 0.1D, 100D); GLU.gluLookAt(CAMERA_POSITION[0], CAMERA_POSITION[1], CAMERA_POSITION[2], CAMERA_DIRECTION[0], CAMERA_DIRECTION[1], CAMERA_DIRECTION[2], 0D, 1D, 0D);
gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity();
gl.glShadeModel(GL.GL_SMOOTH); gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, SPOT_POSITION, 0); gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPOT_DIRECTION, SPOT_DIRECTION, 0); gl.glLightf(GL.GL_LIGHT0, gl.GL_SPOT_CUTOFF, 60F); gl.glLightf(GL.GL_LIGHT0, GL.GL_SPOT_EXPONENT, 3.0F);
gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1F}, 0); gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, new float[]{1F, 0F, 0F, 1F}, 0); gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, new float[]{1F, 1F, 1F, 1F}, 0);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1F}, 0); gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, new float[]{1F, 0F, 0F, 1F}, 0); gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, new float[]{1F, 1F, 1F, 1F}, 0); gl.glMaterialfv(GL.GL_FRONT, GL.GL_SHININESS, new float[]{30F}, 0);
gl.glEnable(GL.GL_DEPTH_TEST); gl.glEnable(GL.GL_LIGHTING); gl.glEnable(GL.GL_LIGHT0); }
@Override public void displayChanged(GLAutoDrawable _glDrawable, boolean _modeChanged, boolean _deviceChanged) { }
public static void main(String[] _args) { final TestAPoster test = new TestAPoster(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { test.setVisible(true); } }); } } |