Check if the mouse is located over a 3d model

The following code demonstrates how to check if the mouse is located over a 3d model, or more precisely its bounding volume.


001 package tutorial;
002 import javax.media.opengl.GL;
003 import javax.media.opengl.GLDrawable;
004 
005 import de.rico.engine.effect.light.ogllight.PositionalLight;
006 import de.rico.engine.enums.BoundingVolume;
007 import de.rico.engine.game.AbstractBaseGame;
008 import de.rico.engine.geometry.modelloader.ms3d.ModelMS3DAscii;
009 import de.rico.engine.input.InputManager;
010 
011 /**
012  * A class that shows how to determine whether or not the mouse is located
013  * over a 3d model.
014  @author Frank Bruns
015  *
016  */
017 public class CheckMouseOverModel extends AbstractBaseGame
018 {
019   private ModelMS3DAscii model = null;
020   
021   private InputManager inputManager = null;
022   
023   private PositionalLight light = null;
024   
025   /**
026    * Constructor for the new game.
027    @param title title for the window bar
028    @param maxFps maximum possible framerate
029    */
030   public CheckMouseOverModel(String title, int maxFps)
031   {
032     super(title, maxFps);
033   }
034 
035   /* (non-Javadoc)
036    * @see de.rico.engine.game.AbstractBaseGame#initResources(javax.media.opengl.GLDrawable, javax.media.opengl.GL, int, int)
037    */
038   @Override
039   public void initResources(GLDrawable gld, GL gl, int width, int height)
040   {      
041     // create the input manager object that allows you to
042     // retrieve the current mouse coordinates
043     this.inputManager = new InputManager(this.getOGLCanvas());
044     
045     this.model = new ModelMS3DAscii(BoundingVolume.BOX);
046     this.model.load("./models/ms3d/recke/recke.txt"0.1f);
047     this.model.setTexUnit0("./models/ms3d/recke/recke.jpg", true, false, false);
048     
049     // create a simple white light to illuminate the scene
050     this.light = new PositionalLight(0);
051     this.light.setPosition(0f50f100f);
052   }
053 
054   /* (non-Javadoc)
055    * @see de.rico.engine.game.AbstractBaseGame#update(long)
056    */
057   @Override
058   public void update(long elapsedTime)
059   {
060     // update the models
061     this.model.update(elapsedTime);
062     
063     // retrieve the current mouse screen coordinates in pixels
064     int x = this.inputManager.getMouseX();
065     int y = this.inputManager.getMouseY();
066     
067     // check if the mouse coordinates are located over the model.
068     // Actually it is tested, if the coordinates are over the bounding
069     // volume of the model, so there can be inaccuracies if the
070     // model bounding volume doesn't fit that well to its dimensions.
071     // Before actually checking the mouse coordinates, I recommend
072     // to check if the model isn't occluded by another one.
073     boolean mouseOverModel = false;
074     
075     if(this.model.isOccluded() == false)    
076       mouseOverModel = this.model.isMouseOverMesh(x, y);
077                  
078     System.out.println("Is the mouse positioned over the model?: "+mouseOverModel);
079     
080     // Instead of simply asking whether the mouse is located over the
081     // model's bounding volume you can also ask where exactly in
082     // 3d space the mouse is intersecting with the bounding volume
083     // of the mesh. Just use the getMouseOverMesh(x,y) method in that case.
084     
085     // For more information on finding intersection points, please have a closer 
086     // look at the methods of the CollisionFinder class.
087   }
088 
089   /* (non-Javadoc)
090    * @see de.rico.engine.game.AbstractBaseGame#draw(javax.media.opengl.GL)
091    */
092   @Override
093   public void draw(GL gl)
094   {
095     // bind the light for illumination of the scene
096     this.light.bind(gl);
097     
098     // draw the model
099     this.model.draw(gl);
100     
101     // release the light again
102     this.light.release(gl);
103   }
104   
105   /**
106    * The usual main method. It's the entry point to the application.
107    @param args argument string
108    */
109   public static void main(String args[])
110   {
111     // create a new game
112     CheckMouseOverModel game = new CheckMouseOverModel("Test Game"100);
113     
114     // initialise the camera --> needs to be done!
115     game.initCamera(0f7.5f20f0f0f0.1f200f);
116     
117     // show framerate --> this is optional
118     game.setDisplayFPS(true);
119     
120     // finally start the game
121     game.start(game);
122   }
123 }
Java2html