SpotLightDemoCanvas.java
上传用户:gyyuli
上传日期:2013-07-09
资源大小:3050k
文件大小:8k
源码类别:

J2ME

开发平台:

Java

  1. import javax.microedition.lcdui.*;
  2. import javax.microedition.lcdui.game.*;
  3. import javax.microedition.m3g.*;
  4. class SpotLightDemoCanvas extends GameCanvas implements Runnable{
  5.   
  6.     private Graphics3D g3d; // Graphics object used to render the world.
  7.     private World world; // This world contains the camera and the pyramidMesh.
  8.     private Camera camera; // the camera in the scene
  9.     private Mesh pyramidMesh; // the pyramid in the scene
  10.     private Mesh icosahedronMesh; // the icosahedron in the scene
  11.     private Light light;
  12.     private int meshIndex = 0;
  13.     
  14.     private javax.microedition.midlet.MIDlet midlet;
  15.     private final int SCREEN_WIDTH;
  16.     private final int SCREEN_HEIGHT;
  17.     
  18.     public SpotLightDemoCanvas(javax.microedition.midlet.MIDlet m){
  19.         super(false);
  20.         
  21.         midlet = m;
  22.       
  23.        setFullScreenMode(true);
  24.         SCREEN_WIDTH = getWidth();
  25.         SCREEN_HEIGHT = getHeight(); 
  26.        
  27.         g3d = Graphics3D.getInstance();
  28.         world = new World();
  29.         camera = new Camera();
  30.         world.addChild(camera); // add the camera to the world.
  31.         light = new Light();                    // Create a new light
  32.         light.translate(0.0f, 0.0f, -1.0f); // The light position
  33.         light.setMode(Light.SPOT);   // Light Mode
  34.         light.setColor(0xFFFFFF);           // The color of the light 'WHITE'
  35.         light.setSpotExponent(10.0f); // splot light concentration 0 to 128
  36.         light.setSpotAngle(30.0f);
  37.         world.addChild(light);                // Add the light to the world to be rendered.
  38.         // Constructs a perspective projection matrix and sets that as the current projection matrix.
  39.         camera.setPerspective(60.0f, (float)SCREEN_WIDTH / (float)SCREEN_HEIGHT, 0.1f, 50f);
  40.         
  41.         pyramidMesh = createpyramid(); // create our pyramid.
  42.         pyramidMesh.setTranslation(0.0f, 0.3f, -3.0f); // move the pyramid 3 units into the screen.
  43.         
  44.         world.addChild(pyramidMesh);
  45.         world.setActiveCamera(camera);
  46.         
  47.         Thread t = new Thread(this);
  48.         t.start();
  49.     }
  50.     
  51.     public void keyPressed(int keyCode){
  52.         switch(keyCode){
  53.         }
  54.     }
  55.     
  56.     /*
  57.      * Change the Light Mode to be used.
  58.      */
  59.     
  60.     
  61.     public void draw3D(Graphics g){
  62.         g.setColor(0x000000);
  63.         g.fillRect(0, 0, getWidth(), getHeight());
  64.         try{
  65.             g3d.bindTarget(g); // Binds the given Graphics or mutable Image2D as the rendering target of this Graphics3D
  66.             g3d.render(world); // Render the world
  67.         }finally{
  68.             g3d.releaseTarget();
  69.         }
  70.     }
  71.     private void draw2D(Graphics g){
  72.         g.setColor(0xFFFFFF);
  73.         /*switch(lightIndex){
  74.             case 0:
  75.                 g.drawString("Ambient", 0, 0, 0);
  76.                 break;
  77.             case 1:
  78.                 g.drawString("Directional", 0, 0, 0);
  79.                 break;
  80.             case 2:
  81.                 g.drawString("Omni", 0, 0, 0);
  82.                 break;
  83.             case 3:
  84.                 g.drawString("Spot", 0, 0, 0);
  85.                 break;
  86.         }*/
  87.         
  88.        // g.drawImage(SwapImage, 0, SCREEN_HEIGHT, Graphics.LEFT | Graphics.BOTTOM);
  89.        // g.drawImage(NextImage, SCREEN_WIDTH, SCREEN_HEIGHT, Graphics.RIGHT | Graphics.BOTTOM);
  90.     }
  91.     
  92.     public void run() {
  93.         Graphics g = getGraphics();
  94.         while(true){
  95.             
  96.       /*  switch(meshIndex){
  97.             case 0:
  98.                 icosahedronMesh.postRotate(1.0f, 0.0f, 1.0f, 0.0f);
  99.                 break;
  100.             case 1:
  101.                 // rotate the pyramid 1 degree around the Y-axis.
  102.                 pyramidMesh.postRotate(1.0f, 0.0f, 1.0f, 0.0f);
  103.                 break;
  104.         }*/
  105.         pyramidMesh.postRotate(1.0f, 0.0f, 1.0f, 0.0f);
  106.        light.postRotate(1.0f, 1.0f, 0.0f, 0.0f); //enable this to make the light rotate around it's x-axis
  107.         
  108.             draw3D(g);
  109.             draw2D(g);
  110.             
  111.             flushGraphics();
  112.         }
  113.     }
  114.     
  115.     // this method creates a colored pyramid.
  116.     private Mesh createpyramid(){
  117.         
  118.         // The vertices used by the pyramid. x, y, z
  119.         short []POINTS = new short[] {-1, -1, 1,    1, -1, 1,   0, 1, 0,     // front
  120.                                                            1, -1, 1,    1, -1, -1,  0, 1, 0,    // right
  121.                                                            1, -1, -1,  -1, -1, -1,  0, 1, 0,    // back
  122.                                                           -1, -1, -1,  -1, -1, 1,   0, 1, 0,    // left
  123.                                                           -1, -1, 1,    1, -1, 1,   1, -1, -1,  // bottom right
  124.                                                           -1, -1, 1,    1, -1, -1, -1, -1, -1}; // bottom left
  125.                                                          
  126.         // The wall angle of the pyramid is 70