Check collisions between 3d models

The following code demonstrates how easy it is to check if a collision occured between two 3d models.


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.collision.BoundingBox;
009 import de.rico.engine.geometry.collision.CollisionFinder;
010 import de.rico.engine.geometry.modelloader.ms3d.ModelMS3DAscii;
011 
012 /**
013  * A class that shows how to check for collisions between 3d models.
014  @author Frank Bruns
015  *
016  */
017 public class CheckCollisions extends AbstractBaseGame
018 {
019   private ModelMS3DAscii model1 = null;
020   private ModelMS3DAscii model2 = null;
021   
022   private PositionalLight light = null;
023   
024   /**
025    * Constructor for the new game.
026    @param title title for the window bar
027    @param maxFps maximum possible framerate
028    */
029   public CheckCollisions(String title, int maxFps)
030   {
031     super(title, maxFps);
032   }
033 
034   /* (non-Javadoc)
035    * @see de.rico.engine.game.AbstractBaseGame#initResources(javax.media.opengl.GLDrawable, javax.media.opengl.GL, int, int)
036    */
037   @Override
038   public void initResources(GLDrawable gld, GL gl, int width, int height)
039   {      
040     this.model1 = new ModelMS3DAscii(BoundingVolume.BOX);
041     this.model1.load("./models/ms3d/recke/recke.txt"0.1f);
042     this.model1.setTexUnit0("./models/ms3d/recke/recke.jpg", true, false, false);
043     // set the model to be sensitive for collisions
044     this.model1.setCollidable(true);
045     // visualize the bounding box of the model for demonstration
046     // purpose
047     this.model1.setShowBoundingVolume(true);
048     // translate the model a bit
049     this.model1.translateX(2f);
050     this.model1.translateY(3f);
051     
052     
053     this.model2 = new ModelMS3DAscii(BoundingVolume.BOX);
054     this.model2.load("./models/ms3d/recke/recke.txt"0.1f);
055     this.model2.setTexUnit0("./models/ms3d/recke/recke.jpg", true, false, false);
056     this.model2.setCollidable(true);
057     this.model2.setShowBoundingVolume(true);
058     this.model2.translateX(-1f);
059     
060     // create a simple white light to illuminate the scene
061     this.light = new PositionalLight(0);
062     this.light.setPosition(0f50f100f);
063   }
064 
065   /* (non-Javadoc)
066    * @see de.rico.engine.game.AbstractBaseGame#update(long)
067    */
068   @Override
069   public void update(long elapsedTime)
070   {
071     // update the models
072     this.model1.update(elapsedTime);
073     this.model2.update(elapsedTime);
074     
075     // check the bounding volumes for collision by using a static method
076     // of the CollisionFinder class. Only models with the same kind of bounding volume 
077     // can be checked.
078     // The CollisionFinder class has even more methods on finding 
079     // points of intersection between lines and bounding volumes, 
080     // wich can be used for picking, for example.    
081     boolean collision = CollisionFinder.collide(
082                 (BoundingBox)this.model1.getBoundingVolume()
083                 (BoundingBox)this.model2.getBoundingVolume());
084     
085     System.out.println("Do the models collide?: "+collision);
086   }
087 
088   /* (non-Javadoc)
089    * @see de.rico.engine.game.AbstractBaseGame#draw(javax.media.opengl.GL)
090    */
091   @Override
092   public void draw(GL gl)
093   {
094     // bind the light for illumination of the scene
095     this.light.bind(gl);
096     
097     // draw the models
098     this.model1.draw(gl);
099     this.model2.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     CheckCollisions game = new CheckCollisions("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

After executing the code you should see a display resolution dialog. Choose a resolution suitable for you and press "OK". If everything is correct there should be a window showing up on the screen that looks like the one in the picture below. As you can see, the two models are actually colliding and because of that the programme should print out an according message to the console.

Screenshot .