Rotacionar Circulo no Eixo usando OpenGL

0 respostas
F

Estou desenhando um carro controlado por teclado em open gl utilizando push e popMatrix, como faço para rotacionar as rodas no eixo ao acionar o movimento do carro ?
Desde ja, agradeço;

public class teste implements GLEventListener, KeyListener, MouseListener {

double mov;
boolean fimTela = false;
int ct;
int r = 0, g = 0, b = 255;

//variaveis de desenho do circulo
int numLinhas = 50;
double angle;
float raio;

public static void main(String[] args) {

    GLProfile glp = GLProfile.getDefault();
    GLCapabilities caps = new GLCapabilities(glp);
    GLCanvas canvas = new GLCanvas(caps);

    Frame frame = new Frame("OpenGL");
    frame.setSize(800, 800);
    frame.add(canvas);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });

    teste car = new teste();

    canvas.addGLEventListener(car);
    canvas.addKeyListener(car);
    canvas.addMouseListener(car);
    canvas.setVisible(true);

    FPSAnimator animacao = new FPSAnimator(canvas, 60);
    animacao.start();
}

@Override
public void init(GLAutoDrawable drawable) {
    // TODO Auto-generated method stub
}

@Override
public void display(GLAutoDrawable drawable) {
    // TODO Auto-generated method stub

    final GL2 gl2 = drawable.getGL().getGL2();

    gl2.glBegin(GL2.GL_POLYGON);
    gl2.glColor3f(0,255,0);
    gl2.glVertex2d(-1, -1);
    gl2.glVertex2d(-1, 1);
    gl2.glVertex2d(1, 1);
    gl2.glVertex2d(1, -1);
    gl2.glEnd();

    this.desenhaCarro(gl2);

    ct++;
    if (ct == 30) {
        ct = 0;
    }
}

/*
 * Método criado para desenhar um carro na tela.
 */
private void desenhaCarro(GL2 gl2) {
    //carro
    gl2.glPushMatrix();
        //carroceria
        gl2.glPushMatrix();
            gl2.glBegin(GL2.GL_POLYGON);
                desenhaCarroceria(gl2);
            gl2.glEnd();
        gl2.glPopMatrix();
        
        //vidro janela
        gl2.glPushMatrix();
            desenhaVidro(gl2);
        gl2.glPopMatrix();
        
        //roda
        gl2.glPushMatrix();
            desenhaRoda(gl2);
            gl2.glPushMatrix();
                desenhaParafuso(gl2);
        gl2.glPopMatrix();
        gl2.glPopMatrix();
    gl2.glPopMatrix();
       
    gl2.glFlush();
}

public void desenhaCarroceria (GL2 gl2) {
    gl2.glColor3f(r, g, b);
    gl2.glVertex2d(-0.2 + mov, -0.05);
    gl2.glVertex2d(-0.2 + mov, 0.2);
    gl2.glVertex2d(-0.1 + mov, 0.2);
    gl2.glVertex2d(0.03 + mov, 0.3);
    gl2.glVertex2d(0.25 + mov, 0.3);
    gl2.glVertex2d(0.25 + mov, 0.2);
    gl2.glVertex2d(0.6 + mov, 0.2);
    gl2.glVertex2d(0.6 + mov, -0.05);
}

public void desenhaVidro (GL2 gl2) {
    gl2.glBegin(GL2.GL_POLYGON);
        gl2.glColor3f(0, 0, 0);
        gl2.glVertex2d(-0.08 + mov, 0.2);
        gl2.glVertex2d(0.03 + mov, 0.29);
        gl2.glVertex2d(0.1 + mov, 0.29);
        gl2.glVertex2d(0.1 + mov, 0.2);
    gl2.glEnd();
}

public void desenhaRoda (GL2 gl2) {
        raio = .13f;
    
        //roda
        gl2.glBegin(GL2.GL_POLYGON);
            for (int i = 0; i < numLinhas; i++) {
               angle = 2 * Math.PI * i / numLinhas;
               gl2.glVertex2d(raio * Math.cos(angle) + 0.0 + +mov, raio * Math.sin(angle) + (-0.05));
            }
        gl2.glEnd();

        //roda
        gl2.glBegin(GL2.GL_POLYGON);
        for (int i = 0; i < numLinhas; i++) {
            angle = 2 * Math.PI * i / numLinhas;
            gl2.glVertex2d(raio * Math.cos(angle) + 0.4 + +mov, raio * Math.sin(angle) + (-0.05));
        }
        gl2.glEnd();
    
}

public void desenhaParafuso (GL2 gl2) {
        raio = .015f;

        //parafuso roda
        gl2.glColor3f(255, 255, 255);
        gl2.glBegin(GL2.GL_POLYGON);
        for (int i = 0; i < numLinhas; i++) {
            angle = 2 * Math.PI * i / numLinhas;
            gl2.glVertex2d(raio * Math.cos(angle) + 0.07 + mov, raio * Math.sin(angle) + (-0.05));
        }
        gl2.glEnd();

        //parafuso roda
        gl2.glBegin(GL2.GL_POLYGON);
        for (int i = 0; i < numLinhas; i++) {
            angle = 2 * Math.PI * i / numLinhas;
            gl2.glVertex2d(raio * Math.cos(angle) + (-0.07) + mov, raio * Math.sin(angle) + (-0.05));
        }
        gl2.glEnd();

        //parafuso roda
        gl2.glBegin(GL2.GL_POLYGON);
        for (int i = 0; i < numLinhas; i++) {
            angle = 2 * Math.PI * i / numLinhas;
            gl2.glVertex2d(raio * Math.cos(angle) + 0.33 + mov, raio * Math.sin(angle) + (-0.05));
        }
        gl2.glEnd();

        //parafuso roda
        gl2.glBegin(GL2.GL_POLYGON);
        for (int i = 0; i < numLinhas; i++) {
            angle = 2 * Math.PI * i / numLinhas;
            gl2.glVertex2d(raio * Math.cos(angle) + 0.47 + mov, raio * Math.sin(angle) + (-0.05));
        }
        gl2.glEnd();
}

@Override
public void keyPressed(KeyEvent key) {
    switch (key.getKeyCode()) {
        case KeyEvent.VK_LEFT:
            if (mov >= -0.8) {
                mov -= 0.015;
            } else {
                mov += 0;
            }
            break;
        case KeyEvent.VK_RIGHT:
            if (mov <= 0.4) {
                mov += 0.015;
            } else {
                mov += 0;
            }
            break;
        case KeyEvent.VK_A:
            if (mov >= -0.8) {
                mov -= 0.05;
            } else {
                mov += 0;
            }
            break;
        case KeyEvent.VK_S:
            mov += 0;
            break;
        case KeyEvent.VK_D:
            if (mov <= 0.4) {
                mov += 0.05;
            } else {
                mov += 0;
            }
            break;
    }
}

@Override
public void mouseClicked(MouseEvent mouse) {
    switch (mouse.getButton()) {
        case MouseEvent.BUTTON1:
            mov += 0;
            break;
        case MouseEvent.BUTTON3:
            r = 255;
            g = 0;
            b = 0;
            break;
    }
}

@Override
/**
 * Método utilizado para notificar o listener para realizar a liberação de
 * recursos, como memória
 */
public void dispose(GLAutoDrawable arg0) {
    // TODO Auto-generated method stub
}

@Override
/**
 * Chamado após o redimensionamento do componente ou da janela de
 * visualização
 */
public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
    // TODO Auto-generated method stub
}

@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub
}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub
}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub
}

@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub
}

@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub
}

@Override
public void mousePressed(MouseEvent e) {
}

}

Criado 20 de abril de 2016
Respostas 0
Participantes 1