Java JOGL2 и слушатели мыши - PullRequest
0 голосов
/ 08 марта 2012

Я использую JOGL2 с Java, и у меня действительно есть проблема со слушателями событий мыши. Я могу заставить слушателя мыши обновлять свои позиции x и y, если я использую public void mouseDragged (MouseEvent e), но он не будет перерисовываться на публичном void дисплее (GLAutoDrawable gLDrawable)

Вот как работает мой код: Это мой основной метод, когда окно и слушатели построены

 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;

 import javax.media.opengl.GL2;
 import javax.media.opengl.GLCapabilities;
 import javax.media.opengl.GLEventListener;
 import javax.media.opengl.GLProfile;
 import javax.media.opengl.awt.GLCanvas;
 import javax.swing.JFrame;

 import javax.media.opengl.GLAutoDrawable;

 public class HelloWorld 
 {
     public static void main(String[] args) 
     {
      // setup OpenGL Version 2
    GLProfile profile = GLProfile.get(GLProfile.GL2);
    GLCapabilities capabilities = new GLCapabilities(profile);
    Renderer render = new Renderer();

    // The canvas is the widget that's drawn in the JFrame
    GLCanvas glcanvas = new GLCanvas(capabilities);
    glcanvas.addGLEventListener(render);
    glcanvas.addMouseListener(render);
    glcanvas.addMouseMotionListener(render);
    glcanvas.setSize( 800, 600 );

      JFrame frame = new JFrame( "Graphics Demo" );

      frame.getContentPane().add( glcanvas);

     // shutdown the program on windows close event
     frame.addWindowListener(new WindowAdapter() 
     {
          public void windowClosing(WindowEvent ev) {
            System.exit(0);
         }
     });

    frame.setSize( frame.getContentPane().getPreferredSize() );
    frame.setVisible( true );
   }
 }

Вот мой класс рендеринга OpenGL, он рендерит только ОДИН кадр, и он не будет рендериться, пока я по какой-то причине не отрегулирую размер окна. Если я решу использовать прослушиватель мыши, он обновит значения, но не обновит рендеринг. Почему это?

 import java.io.*;
 import javax.imageio.ImageIO;
 import javax.media.opengl.GL2;
 import javax.media.opengl.GLAutoDrawable;
 import javax.media.opengl.GLEventListener;
 import javax.media.opengl.glu.GLU;
 import java.awt.Dimension;
 import java.awt.Frame;
 import java.awt.event.MouseEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import javax.media.opengl.GLAutoDrawable;
 import javax.media.opengl.GLCapabilities;
 import javax.media.opengl.GLEventListener;
 import javax.media.opengl.GLProfile;
 import javax.media.opengl.awt.GLCanvas;
 import com.jogamp.opengl.util.FPSAnimator;

 import javax.media.opengl.glu.GLUquadric;

 import java.awt.Graphics2D;
 import java.awt.color.ColorSpace; 
 import java.awt.image.BufferedImage;
 import java.awt.image.ComponentColorModel;
 import java.awt.image.DataBuffer;
 import java.awt.image.DataBufferByte;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.awt.event.*;

 class Renderer implements GLEventListener, MouseListener, MouseMotionListener
 {

    private GLU glu = new GLU();
    float x = 1;
    float y = 1;
    float z = 1;

    private GLUquadric quadric;
    GLCanvas canvas;

public void init(GLAutoDrawable gLDrawable) 
{
    System.out.println("INIT CALLED");
}

public void display(GLAutoDrawable gLDrawable) 
{

    final GL2 gl = gLDrawable.getGL().getGL2();
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

    /*MODELS LOADED HERE*/
    gl.glLoadIdentity();
    gl.glTranslatef(0.0f, -9.0f, -150.0f); //-1.5f 0.0f -6.0f
    gl.glRotatef(15f+x, 45f+x, 0f+y,0f); //15 45 0 0 

    OBJloader playingField = new OBJloader("PlayingField.obj", "Crema_Timber.jpg");
    OBJloader coin = new OBJloader("coin.obj","early_shilling.jpg");
    OBJloader tower = new OBJloader("Tower1.obj","stone.jpg");
    OBJloader tower2 = new OBJloader("Tower2.obj","stone.jpg");

    /* 3D RENDERING COMPUTED HERE */
    playingField.DrawModel(gl);
    coin.DrawModel(gl);     
    tower.DrawModel(gl);
    tower2.DrawModel(gl);

 }




 public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged) 
{
    System.out.println("displayChanged called");
}



public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) 
{
    System.out.println("reshape() called: x = "+x+", y = "+y+", width = "+width+", height = "+height);
     final GL2 gl = gLDrawable.getGL().getGL2();

     if (height <= 0)
     {
        height = 1;
     }

    final float h = (float) width / (float) height;

    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL2.GL_PROJECTION);
    gl.glLoadIdentity();
    glu.gluPerspective(45.0f, h, 1.0, 200.0);
    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
}


 public void dispose(GLAutoDrawable arg0) 
 {
System.out.println("dispose() called");
 }



 @Override
 public void mouseClicked(MouseEvent arg0) 
 {  
     // TODO Auto-generated method stub
     System.out.println("Mouse Clicked");
 }


 @Override
 public void mouseEntered(MouseEvent arg0) 
 {
     // TODO Auto-generated method stub
     System.out.println("Mouse Entered Frame");
 }


 @Override
 public void mouseExited(MouseEvent arg0) 
 {
     // TODO Auto-generated method stub
     System.out.println("Mouse Exited Frame");
 }


 @Override
 public void mousePressed(MouseEvent arg0) 
 {
     // TODO Auto-generated method stub
     System.out.println("Mouse is pressed.");
 }


 @Override
 public void mouseReleased(MouseEvent arg0) 
 {
// TODO Auto-generated method stub
System.out.println("Mouse has been released");
 }

 //HERE IS THE PROBLEM, THE DISPLAY WILL NOT UPDATE THIS INPUT
 @Override
 public void mouseDragged(MouseEvent e) 
 {
// TODO Auto-generated method stub
System.out.println("Mouse is being dragged");
x = e.getX();
y = e.getY();

System.out.println("x = "+x);
System.out.println("y = "+y);   
 }


 @Override
 public void mouseMoved(MouseEvent arg0) 
 {
// TODO Auto-generated method stub
System.out.println("Mouse has moved.");
 }

 }

Вы можете заметить, что есть определенные функции, которые говорят: OBJloader SOMETHING = новый OBJloader ("SOMETHING.obj", "SOMETHING.jpg");

У меня есть другой класс, который загружает файлы OBJ и текстурирует их, его функция рисования проста, он просто читает данные в массивах и вызывает glDrawArrays (также обратите внимание на все операции импорта, которые фактически будут использоваться позже).

Последнее, что мне нужно сделать, это найти способ заставить эту мышь обновиться

1 Ответ

0 голосов
/ 10 мая 2012

в вашем классе HelloWorld вы должны запустить аниматора:

FPSAnimator animator = new FPSAnimator(canvas, 60);
animator.start();
...