为什么我无法使用箭头键移动给定的形状?

时间:2019-07-15 23:44:32

标签: java eclipse

我无法运行教授给我们的程序。运行代码没有问题,但是当我按箭头键时,应该旋转3D形状时什么也没有发生(请参见下面的屏幕截图)。我正在使用Eclipse。关于我应该做什么的任何建议?

enter image description here

给定的代码:

import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt.GLJPanel;
import javax.swing.JFrame;

/**
 * Use JOGL to draw a simple cube with each face being a different color.
 * Rotations can be applied with the arrow keys, the page up key, and the page
 * down key. The home key will set all rotations to 0. Initial rotations about
 * the x, y, and z axes are 15, -15, and 0.
 *
 * This program is meant as an example of using modeling transforms, with
 * glPushMatrix and glPopMatrix.
 *
 * Note that this program does not use lighting.
 */
public class UnlitCube extends GLJPanel implements GLEventListener, KeyListener {

    /**
     * A main routine to create and show a window that contains a panel of type
     * UnlitCube. The program ends when the user closes the window.
     */
    public static void main(String[] args) {
        JFrame window = new JFrame("A Simple Unlit Cube -- ARROW KEYS ROTATE");
        UnlitCube panel = new UnlitCube();
        window.setContentPane(panel);
        window.pack();
        window.setLocation(50, 50);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        panel.requestFocusInWindow();
    }

    /**
     * Constructor for class UnlitCube.
     */
    public UnlitCube() {
        super(new GLCapabilities(null)); // Makes a panel with default OpenGL "capabilities".
        setPreferredSize(new Dimension(500, 500));
        addGLEventListener(this); // A listener is essential! The listener is where the OpenGL programming lives.
        addKeyListener(this);
    }

    // -------------------- methods to draw the cube ----------------------

    double rotateX = 15; // rotations of the cube about the axes
    double rotateY = -15;
    double rotateZ = 0;

    private void square(GL2 gl2, double r, double g, double b) {
        gl2.glColor3d(r, g, b);
        gl2.glBegin(GL2.GL_TRIANGLE_FAN);
        gl2.glVertex3d(-0.5, -0.5, 0.5);
        gl2.glVertex3d(0.5, -0.5, 0.5);
        gl2.glVertex3d(0.5, 0.5, 0.5);
        gl2.glVertex3d(-0.5, 0.5, 0.5);
        gl2.glEnd();
    }

    private void cube(GL2 gl2, double size) {
        gl2.glPushMatrix();
        gl2.glScaled(size, size, size); // scale unit cube to desired size
        // Move the squares to offset 3,3
        gl2.glTranslated(3, 3, 0);
        square(gl2, 1, 0, 0); // red front face

        gl2.glPushMatrix();
        gl2.glRotated(90, 0, 1, 0);

        square(gl2, 0, 1, 0); // green right face
        gl2.glPopMatrix();

        gl2.glPushMatrix();
        gl2.glRotated(-90, 1, 0, 0);
        square(gl2, 0, 0, 1); // blue top face
        gl2.glPopMatrix();

        gl2.glPushMatrix();
        gl2.glRotated(180, 0, 1, 0);
        square(gl2, 0, 1, 1); // cyan back face
        gl2.glPopMatrix();

        gl2.glPushMatrix();
        gl2.glRotated(-90, 0, 1, 0);
        square(gl2, 1, 0, 1); // magenta left face
        gl2.glPopMatrix();

        gl2.glPushMatrix();
        gl2.glRotated(90, 1, 0, 0);
        square(gl2, 1, 1, 0); // yellow bottom face
        gl2.glPopMatrix();

        gl2.glPopMatrix(); // Restore matrix to its state before cube() was called.
    }

    // -------------------- GLEventListener Methods -------------------------

    /**
     * The display method is called when the panel needs to be redrawn. The is where
     * the code goes for drawing the image, using OpenGL commands.
     */
    public void display(GLAutoDrawable drawable) {

        GL2 gl2 = drawable.getGL().getGL2(); // The object that contains all the OpenGL methods.

        gl2.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

        gl2.glLoadIdentity(); // Set up modelview transform.
        gl2.glRotated(rotateZ, 0, 0, 1);
        gl2.glRotated(rotateY, 0, 1, 0);
        gl2.glRotated(rotateX, 1, 0, 0);

        cube(gl2, 1);

        // Add an Index Face set
        // Note using Graph paper is the best way to figure these vertices.
        // You can make about any shape you want this way
        double[][] vertexList = { { 1, -0.5, 1 }, { 1, -.5, -1 }, { 1, .5, -1 }, { 1, .5, 1 }, { .75, .75, 0 },
                { -.75, .75, 0 }, { -1, -.5, 1 }, { -1, .5, 1 }, { -1, .5, -1 }, { -1, -.5, -1 } };

        int[][] faceList = { { 0, 1, 2, 3 }, { 3, 2, 4 }, { 7, 3, 4, 5 }, { 2, 8, 5, 4 }, { 5, 8, 7 }, { 0, 3, 7, 6 },
                { 0, 6, 9, 1 }, { 2, 1, 9, 8 }, { 6, 7, 8, 9 } };

        for (int i = 0; i < faceList.length; i++) {
            gl2.glColor3f(1, 0, 1); // Set color for face number i.
            gl2.glBegin(GL2.GL_TRIANGLE_FAN);
            for (int j = 0; j < faceList[i].length; j++) {
                int vertexNum = faceList[i][j]; // Index for vertex j of face i.
                double[] vertexCoords = vertexList[vertexNum]; // The vertex itself.
                gl2.glVertex3dv(vertexCoords, 0);
            }
            gl2.glEnd();

            // You can add more shapes here.

        }

    } // end display()

    public void init(GLAutoDrawable drawable) {
        // called when the panel is created
        GL2 gl2 = drawable.getGL().getGL2();
        gl2.glMatrixMode(GL2.GL_PROJECTION);
        // gl2.glOrtho(-1, 1 ,-1, 1, -1, 1);
        // Changing this is your coordinate -x,x,-y,y,-z,z)
        // Larger numbers zooms out.
        // Play with this to make sure you see your shapes.
        gl2.glOrtho(-5, 5, -5, 5, -5, 5);
        gl2.glMatrixMode(GL2.GL_MODELVIEW);
        gl2.glClearColor(0, 0, 0, 1);
        gl2.glEnable(GL2.GL_DEPTH_TEST);
    }

    public void dispose(GLAutoDrawable drawable) {
        // called when the panel is being disposed
    }

    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
        // called when user resizes the window
    }

    // ---------------- Methods from the KeyListener interface --------------

    public void keyPressed(KeyEvent evt) {
        int key = evt.getKeyCode();
        if (key == KeyEvent.VK_LEFT)
            rotateY -= 15;
        else if (key == KeyEvent.VK_RIGHT)
            rotateY += 15;
        else if (key == KeyEvent.VK_DOWN)
            rotateX += 15;
        else if (key == KeyEvent.VK_UP)
            rotateX -= 15;
        else if (key == KeyEvent.VK_PAGE_UP)
            rotateZ += 15;
        else if (key == KeyEvent.VK_PAGE_DOWN)
            rotateZ -= 15;
        else if (key == KeyEvent.VK_HOME)
            rotateX = rotateY = rotateZ = 0;
        repaint();
    }

    public void keyReleased(KeyEvent evt) {
    }

    public void keyTyped(KeyEvent evt) {
    }

}

0 个答案:

没有答案