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

J2ME

开发平台:

Java

  1. import javax.microedition.lcdui.*;
  2. import javax.microedition.midlet.*;
  3. import javax.microedition.m3g.*;
  4. import javax.microedition.m3g.Camera;
  5. // The custom Canvas that handles all of the 3D rendering 
  6.  public class MyCanvas extends Canvas {
  7.      private Graphics3D      iG3D;
  8.      private Camera          iCamera;
  9.      private Light           iLight;
  10.      private float           iAngle = 0.0f;  // Starting angle for 3D object
  11.      private Transform       iTransform = new Transform();
  12.      private Background      iBackground = new Background();
  13.      private VertexBuffer    iVb;            // Vertex positions, normals, colors, texcoords
  14.      private IndexBuffer     iIb;            // Indices to VertexBuffer, forming tri-strips
  15.      private Appearance      iAppearance;    // Material, texture, compositing, etc.
  16.      private Material        iMaterial = new Material();
  17.      private Image           iImage;
  18.      private Image2D         backDrop;       // Holds background image
  19.      private Transform       transform3D;
  20.     // Construct the displayable
  21.      public MyCanvas() {
  22.          // Set up this Displayable to listen to command events
  23.          setCommandListener(new CommandListener()  {
  24.              public void commandAction(Command c, Displayable d) {
  25.                  if (c.getCommandType() == Command.EXIT) {
  26.                      RotatingCube.quitApp();   // exit the MIDlet
  27.                  } // end if
  28.              } // end commandAction()
  29.          }); // end of arguments to setCommandListener()
  30.          try {
  31.              init();
  32.          } // end try
  33.          catch(Exception e) {
  34.               e.printStackTrace();
  35.          } // end catch
  36.      } // end constructor
  37.     // Initialization of all components required to make 3D scene
  38.      private void init() throws Exception  {
  39.         // Add the Exit command
  40.         addCommand(new Command("Exit", Command.EXIT, 1));
  41.         // Get the singleton Graphics3D instance
  42.         iG3D = Graphics3D.getInstance();
  43.         // Create a camera
  44.         iCamera = new Camera();
  45.         iCamera.setPerspective( 80.0f,                                   // field of view
  46.                                 (float)getWidth() / (float)getHeight(),  // aspectRatio
  47.                                 1.0f,                                    // near clipping plane
  48.                                 1000.0f );                               // far clipping plane
  49.         // Create a light
  50.         iLight = new Light();
  51.         iLight.setColor( 0xffffff );         // White light
  52.         iLight.setIntensity(1.25f);          // overbright
  53.         // init some arrays for our object (cube)
  54.         // Each line in this array declaration represents a triangle strip for
  55.         // one side of a cube. The only primitive we can draw with is the
  56.         // triangle strip so if we want to make a cube with hard edges we
  57.         // need to construct one triangle strip per face of the cube.
  58.         // 1 * * * * * 0
  59.         //   * *     *
  60.         //   *   *   *
  61.         //   *     * *
  62.         // 3 * * * * * 2
  63.         // The ASCII diagram above represents the vertices in the first line
  64.         // (the first tri-strip).
  65.         short[] vert = {10, 10, 10,   -10, 10, 10,    10,-10, 10,   -10,-10, 10,   // front
  66.                         -10, 10,-10,    10, 10,-10,   -10,-10,-10,    10,-10,-10,   // back
  67.                         -10, 10, 10,   -10, 10,-10,   -10,-10, 10,   -10,-10,-10,   // left
  68.                         10, 10,-10,    10, 10, 10,    10,-10,-10,    10,-10, 10,   // right
  69.                         10, 10,-10,   -10, 10,-10,    10, 10, 10,   -10, 10, 10,   // top
  70.                         10,-10, 10,   -10,-10, 10,    10,-10,-10,   -10,-10,-10 }; // bottom
  71.         // Create a VertexArray to hold the vertices for the object
  72.         VertexArray vertArray = new VertexArray( vert.length / 3, 3, 2 );
  73.         vertArray.set( 0, vert.length/3, vert );
  74.         // The per-vertex normals for the cube; these match with the faces
  75.         // above. Each normal is perpendicular to the surface of the object at
  76.         // the corresponding vertex. These are used in lighting computations.
  77.         byte[] norm = {0, 0, 127,      0, 0, 127,     0, 0, 127,    0, 0, 127,
  78.                         0, 0, -127,    0, 0,-127,      0, 0,-127,    0, 0, -127,
  79.                         -127, 0, 0,     -127, 0, 0,    -127, 0,  0,   -127, 0,  0,
  80.                         127, 0, 0,     127, 0, 0,      127, 0, 0,    127, 0,  0,
  81.                         0, 127, 0,     0, 127, 0,    0, 127, 0,      0, 127, 0,
  82.                         0, -127, 0,     0, -127, 0,    0, -127, 0,    0, -127, 0};
  83.         // Create a vertex array for the normals of the object.
  84.         VertexArray normArray = new VertexArray( norm.length / 3, 3, 1 );
  85.         normArray.set( 0, norm.length/3, norm );
  86.         // Per vertex texture coordinates. These specify the coordinates on a 2-D image
  87.         // that will be painted onto a surface. The image is 128 by 128 pixels, but
  88.         // we only use a portion of the image.
  89.         short[] tex = { 96, 32,       64, 32,       96, 64,       64, 64,
  90.                         64, 32,       32, 32,       64, 64,       32, 64,
  91.                         64, 0,        32, 0,        64, 32,       32, 32,
  92.                         32, 0,         0, 0,        32, 32,        0, 32,
  93.                         32, 32,        0, 32,       32, 64,        0, 64,
  94.                         96, 0,        64, 0,        96, 32,       64, 32 };
  95.         // Create a vertex array for the texture coordinates of the object
  96.         VertexArray texArray = new VertexArray( tex.length / 2, 2, 2 );
  97.         texArray.set( 0, tex.length/2, tex );
  98.         int[] stripLen = { 4, 4, 4, 4, 4, 4 };  // The length of each triangle strip
  99.         // Create the VertexBuffer for our object
  100.         VertexBuffer vb = iVb = new VertexBuffer();
  101.         vb.setPositions( vertArray, 1.0f, null );       // Unit scale, zero bias
  102.         vb.setNormals( normArray );
  103.         vb.setTexCoords( 0, texArray, (1.0f/128.0f), null  );    // 128-pixel scale, zero bias
  104.         // Create the index buffer for the object (this tells how to create triangle
  105.         // strips from the contents of the vertex buffer).
  106.         iIb = new TriangleStripArray( 0, stripLen );
  107.         // Load the image for the texture
  108.         iImage = Image.createImage("/cubeface.png");
  109.         //         iImage = Image.createImage("/cubeface.png");
  110.         // Create the Image2D (we need this so we can make a Texture2D)
  111.         Image2D image2D = new Image2D( Image2D.RGB, iImage );
  112.         // Create the Texture2D and enable mipmapping
  113.         // Texture color is to be modulated with the lit material color
  114.         Texture2D texture = new Texture2D( image2D );
  115.         texture.setFiltering( Texture2D.FILTER_NEAREST, Texture2D.FILTER_NEAREST );
  116.         texture.setWrapping( Texture2D.WRAP_CLAMP, Texture2D.WRAP_CLAMP );
  117.         texture.setBlending( Texture2D.FUNC_MODULATE );
  118.         // Load image for the background
  119.         iImage = Image.createImage("/backdrop.png");
  120.         // iImage = Image.createImage("/backdrop.png");
  121.         backDrop = new Image2D(Image2D.RGB, iImage);
  122.         // Create the appearance
  123.         iAppearance = new Appearance();
  124.         iAppearance.setTexture( 0, texture ); // add the Texture2D to the Appearance
  125.         iAppearance.setMaterial(iMaterial);
  126.         iMaterial.setVertexColorTrackingEnable( true );     //Ttrack per-vertex colors
  127.         iMaterial.setColor(Material.SPECULAR, 0xFFFFFFFF);  // Specular = white
  128.         iMaterial.setShininess(100.0f);
  129.         PolygonMode polygonMode = new PolygonMode(); // An Appearance component encapsulating polygon-level attributes
  130.         polygonMode.setPerspectiveCorrectionEnable(true);
  131.         polygonMode.setCulling(PolygonMode.CULL_BACK); // By using CULL_NONE all faces of the pyramid will be shown.
  132.         polygonMode.setShading(PolygonMode.SHADE_SMOOTH); // use a smooth shading of the colors on the pyramid.
  133.         polygonMode.setTwoSidedLightingEnable(true);
  134.         polygonMode.setLocalCameraLightingEnable(false);
  135.         iAppearance.setPolygonMode(polygonMode);
  136.         // iBackground.setColor( 0x8833FF ); // set the background color
  137.         iBackground.setImage( backDrop ); // Set the background image
  138.         // Set up the camera in the desired position
  139.         transform3D = new Transform();
  140.         transform3D.postTranslate(0.0f, 0.0f, 50.0f);
  141.         // Binds this light for immediate mode rendering. Otherwise it won't have an effect.
  142.         iG3D.setCamera( iCamera, transform3D );
  143.         // Set up a "headlight": a directional light shining from the direction of the camera.
  144.         // Binds this camera for immediate mode rendering. Won't have an effect otherwise.
  145.         iG3D.resetLights();
  146.         iG3D.addLight(iLight, transform3D );
  147.     } // end init() 
  148.     // Paint the scene
  149.     protected void paint(Graphics g) {
  150.         // Bind the Graphics of this Canvas to our Graphics3D. The viewport
  151.         //    is automatically set to cover the entire clipping rectangle of the
  152.         //    Graphics object. The boolean parameters indicate that z-buffering,
  153.         //    dithering and true color rendering are enabled. Because render() is
  154.         //    applied to a submesh (a vertex buffer and not a Group or World node),
  155.         //    the cube is rendered in immediate mode.
  156.         iG3D.bindTarget(g, true, Graphics3D.DITHER | Graphics3D.TRUE_COLOR);
  157.         // Clear the color and depth buffers--which draws the background image
  158.         iG3D.clear( iBackground );
  159.         // Update our transform (this will give us a rotating cube)
  160.         iTransform.postRotate(3.0f, 1.0f, 1.0f, 1.0f );  // rotate around this axis
  161.         // Render our cube, immediate mode. We provide the vertex and index buffers to specify
  162.         //    the geometry; the appearance so we know what material and texture to use, and
  163.         //    the transform to tell where to render the object.
  164.         iG3D.render( iVb, iIb, iAppearance, iTransform );
  165.         // Free the graphics object
  166.         iG3D.releaseTarget();
  167.     } // end paint()
  168.      
  169.  } // end class myCanvas