import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
import javax.media.opengl.glu.GLUquadric;
import javax.swing.JFrame;
import com.sun.opengl.util.Animator;
public class Start{
static Animator animator = null;
static class Zeichenfläche extends GLCanvas implements GLEventListener, KeyListener {
private GL gl;
private GLU glu;
float X = 0.0f;
float Y = 0.0f;
public Zeichenfläche() {
super();
}
public Zeichenfläche(GLCapabilities cap) {
super(cap);
}
void spin() {
X += 0.01f;
}
@Override
public void display(GLAutoDrawable arg0) {
gl = arg0.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glLoadIdentity();
glu = new GLU();
glu.gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
gl.glRotatef(Y, X, 0, 0);
gl.glFlush();
setLight(gl);
gl.glColor3f(1, 1, 1);
drawFigure(gl, glu, Y, X);
glu.gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
gl.glRotatef(Y, X, 1, 1);
gl.glFlush();
spin();
}
public void drawFigure(GL gl, GLU glu, float x, float z) {
gl.glPushMatrix();
gl.glTranslated(x, 0.5, z);
GLUquadric qobj = glu.gluNewQuadric();
// mitte
glu.gluQuadricDrawStyle(qobj, GLU.GLU_FILL);
glu.gluQuadricNormals(qobj, GLU.GLU_SMOOTH);
glu.gluSphere(qobj, 0.35f, 30, 30);
// unten
gl.glRotated(100, 1, 0, 0);
glu.gluQuadricDrawStyle(qobj, GLU.GLU_FILL);
glu.gluQuadricNormals(qobj, GLU.GLU_SMOOTH);
glu.gluCylinder(qobj, 0.2, 0.1, 1.5, 30, 30);
// // vorne
// gl.glRotated(100, 1, 0, 0);
// glu.gluQuadricDrawStyle(qobj, GLU.GLU_FILL);
// glu.gluQuadricNormals(qobj, GLU.GLU_SMOOTH);
// glu.gluCylinder(qobj, 0.1, 0.4, 1.2, 30, 30);
//
// // oben
// gl.glRotated(100, 1, 0, 0);
// glu.gluQuadricDrawStyle(qobj, GLU.GLU_FILL);
// glu.gluQuadricNormals(qobj, GLU.GLU_SMOOTH);
// glu.gluCylinder(qobj, 0.1, 0.4, 1.2, 30, 30);
//
// // hinten
// gl.glRotated(100, 1, 0, 0);
// glu.gluQuadricDrawStyle(qobj, GLU.GLU_FILL);
// glu.gluQuadricNormals(qobj, GLU.GLU_SMOOTH);
// glu.gluCylinder(qobj, 0.1, 0.4, 1.2, 30, 30);
gl.glPopMatrix();
}
private void setLight(GL gl) {
gl.glLightf(GL.GL_LIGHT1, GL.GL_CONSTANT_ATTENUATION, 1.0f);
gl.glLightf(GL.GL_LIGHT1, GL.GL_LINEAR_ATTENUATION, 1.0f);
gl.glLightf(GL.GL_LIGHT1, GL.GL_QUADRATIC_ATTENUATION, 1.0f);
gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_SMOOTH);
}
@Override // nicht implementiert
public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
}
@Override // nicht initialisieren
public void init(GLAutoDrawable arg0) {
arg0.addKeyListener(this);
}
@Override // keine Fenstereigenschaften
public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
gl = arg0.getGL();
glu = new GLU();
gl.glViewport(0, 0, arg3, arg4);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(100, 1, 1, 100);
gl.glMatrixMode(GL.GL_MODELVIEW);
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyChar()) {
case '8':
X -= 0.1f;
this.repaint();
break;
case '2':
X += 0.1f;
this.repaint();
break;
case '4':
Y -= 0.1f;
this.repaint();
break;
case '6':
Y += 0.1f;
this.repaint();
break;
case '5':
animator.start();
this.repaint();
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
public static void main(String[] args) {
GLCapabilities cap = new GLCapabilities();
cap.setDoubleBuffered(true);
cap.setSampleBuffers(true);
Zeichenfläche canva = new Zeichenfläche(cap);
canva.addGLEventListener(canva);
animator = new Animator(canva);
JFrame fenster = new JFrame("Ein leeres Fenster");
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenster.add(canva);
fenster.setSize(640, 480);
fenster.setVisible(true);
canva.requestFocus();
}
}