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) {
}
}