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.Animation;
009 import de.rico.engine.geometry.modelloader.ms3d.ModelMS3DAscii;
010 import de.rico.engine.geometry.modelloader.threeds.Model3DS;
011
012 /**
013 * A class that shows how to add 3d models from certain 3d model files.
014 * @author Frank Bruns
015 *
016 */
017 public class Add3DModel extends AbstractBaseGame
018 {
019 private ModelMS3DAscii milkshape = null; // animated model
020 private Model3DS threeDS = null; // static model
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 Add3DModel(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 // Create the model object. Be aware that a lot more options are
041 // available than shown in this little tutorial
042
043 // create a smooth shaded 3ds model object of a plant with a sphere as a bounding volume
044 // 3ds models are always static (no animations!) in this engine
045 this.threeDS = new Model3DS(true,BoundingVolume.SPHERE);
046 // load the model data from the specified file and scale it
047 // by the specified factor
048 this.threeDS.load("./models/3ds/plants/plant01a.3ds", 0.1f);
049 // assign a rotated and flipped texture to the model --> optional!
050 // texture get rotated and flipped by default. use an overloaded
051 // method (-->see milkshape object) that allows you to explicitly disable rotation and flipping for
052 // a texture
053 this.threeDS.setTexUnit0("./models/3ds/plants/plant01a.jpg", true);
054 // set the position (default would be (0f,0f,0f))
055 this.threeDS.setPosition(-5f, 0f, 0f);
056
057
058 // create a MilkShape3D Ascii model of a man. Such models can
059 // be animated. MD2 models work the same way as MilkShape3D models.
060 this.milkshape = new ModelMS3DAscii(BoundingVolume.BOX);
061 this.milkshape.load("./models/ms3d/recke/recke.txt", 0.1f);
062 // don't rotate and flip the texture. It depends on the model, if rotation and flipping is needed
063 this.milkshape.setTexUnit0("./models/ms3d/recke/recke.jpg", true, false, false);
064 // define a "walk" animation to the model. The animation ranges from frames 2 to 7.
065 // Each frame will be displayed for 100 miliseconds.
066 // Make sure that the range of frames is available in the model file.
067 this.milkshape.addAnimation(new Animation("walk",2,7,100));
068 // set the model animation to the "walk" animation
069 this.milkshape.setAnimation("walk");
070 this.milkshape.setPosition(0f, 0f, 0f);
071
072
073 // create a simple white light to illuminate the scene
074 this.light = new PositionalLight(0);
075 this.light.setPosition(0f, 50f, 100f);
076 }
077
078 /* (non-Javadoc)
079 * @see de.rico.engine.game.AbstractBaseGame#update(long)
080 */
081 @Override
082 public void update(long elapsedTime)
083 {
084 this.threeDS.update(elapsedTime);
085 this.milkshape.update(elapsedTime);
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 this.threeDS.draw(gl);
098 this.milkshape.draw(gl);
099
100 // release the light again
101 this.light.release(gl);
102 }
103
104 /**
105 * The usual main method. It's the entry point to the application.
106 * @param args argument string
107 */
108 public static void main(String args[])
109 {
110 // create a new game
111 Add3DModel game = new Add3DModel("Test Game", 100);
112
113 // initialise the camera --> needs to be done!
114 game.initCamera(0f, 5f, 20f, 0f, 0f, 0.1f, 200f);
115
116 // show framerate --> this is optional
117 game.setDisplayFPS(true);
118
119 // finally start the game
120 game.start(game);
121 }
122 }
|