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

J2ME

开发平台:

Java

  1. import javax.microedition.m3g.*;
  2. import java.util.*;
  3. /**
  4.  * Scene graph fractal test.
  5.  * 
  6.  * This example should draw a whirling cloud of white cubes
  7.  * transformed with hierarchial transforms. One of the cubes is bigger
  8.  * than the rest. The camera should follow that cube.
  9.  * 
  10.  */
  11. public class Example2 extends ExampleBase
  12. {
  13.     private static final String BACKGROUND_TEXTURE = "/textures/pukki_small_cg2.png";
  14.     public void test1()
  15.     {
  16.         int a = 4;
  17.         int b = a & 0xf;
  18.     }
  19.     private World iWorld;
  20.     private Vector iNodes;
  21.     private Vector iAxis;
  22.     public Example2()
  23.     {
  24.         super(SHOW_RENDER_TIME);
  25.     }
  26.     protected void render(int time)
  27.     {
  28.         iWorld.animate(time);
  29.         float angle = time * 0.1f;
  30.         for (int i = 0; i < iNodes.size(); i++)
  31.         {
  32.             Node node = (Node)iNodes.elementAt(i);
  33.             float[] axis = (float[])iAxis.elementAt(i);
  34.             node.setOrientation(angle * axis[3], axis[0], axis[1], axis[2]);
  35.         }
  36.         iWorld.align(null); // throws IllegalStateException on WTK22b
  37.         Graphics3D.getInstance().render(iWorld);
  38.     }
  39.     protected void initialize()
  40.     {
  41.         iWorld = new World();
  42.         iNodes = new Vector();
  43.         iAxis = new Vector();
  44.         Mesh box = createBox();
  45.         Background bg = new Background();
  46.         Image2D image = new Image2D(Image2D.RGB, platformServices.loadImage(BACKGROUND_TEXTURE));
  47.         bg.setColor(0xff204080);
  48.         bg.setImage(image);
  49.         int b = 16;
  50.         bg.setCrop(-b, -b, 64+2*b, 64+2*b);
  51.         iWorld.setBackground(bg);
  52.         Camera camera = new Camera();
  53.         camera.setPerspective(90.0f, 1.0f, 1.0f, 100.0f);
  54.         camera.setTranslation(0.0f, 0.0f, 30.0f);
  55.         iWorld.addChild(camera);
  56.         iWorld.setActiveCamera(camera);
  57.         Light light = new Light();
  58.         light.setTranslation(0.0f, 0.0f, 30.0f);
  59.         iWorld.addChild(light);
  60.         Node ground = (Node)box.duplicate();
  61.         ground.setTranslation(0.0f, -20.0f, 0.0f);
  62.         ground.setScale(2.0f, 0.1f, 2.0f);
  63.         iWorld.addChild(ground);
  64.         Node fractal = createRecursive(box, 5);
  65.         iWorld.addChild(fractal);
  66.         Node target = fractal;
  67.         while (target instanceof Group)
  68.         {
  69.             target = ((Group)target).getChild((int)(random() * 2.0f));
  70.         }
  71.         target.scale(3.0f, 3.0f, 3.0f);
  72.         camera.setScale(-1.0f, 1.0f, -1.0f);
  73.         camera.setAlignment(target, Node.ORIGIN, iWorld, Node.Y_AXIS);
  74.         for (int i = 0; i < 1; i++)
  75.         {
  76.             int num = 25;
  77.             int duration = 3000;
  78.             int comps = 4;
  79. //          KeyframeSequence seq = new KeyframeSequence(num, comps, KeyframeSequence.LINEAR);
  80. //          KeyframeSequence seq = new KeyframeSequence(num, comps, KeyframeSequence.SLERP);
  81.             KeyframeSequence seq = new KeyframeSequence(num, comps, KeyframeSequence.SPLINE);
  82. //          KeyframeSequence seq = new KeyframeSequence(num, comps, KeyframeSequence.SQUAD);
  83. //          KeyframeSequence seq = new KeyframeSequence(num, comps, KeyframeSequence.STEP);
  84. //          seq.setRepeatMode(KeyframeSequence.CONSTANT);
  85.             seq.setRepeatMode(KeyframeSequence.LOOP);
  86.             seq.setDuration(duration);
  87.             for (int j = 0; j < num; j++)
  88.             {
  89.                 float[] value = new float[comps];
  90.                 for (int k = 0; k < comps; k++)
  91.                 {
  92.                     if (k <= 1)
  93.                         value[k] = ((float)random() - 0.5f) * 32.0f;
  94.                     else
  95.                         value[k] = ((float)random() + 1.0f) * 48.0f;
  96.                 }
  97.                 seq.setKeyframe(j, (j * 2 + 1) * duration / (num * 2), value);
  98.             }
  99.             AnimationController ctrl = new AnimationController();
  100.             AnimationTrack track = new AnimationTrack(seq, AnimationTrack.CROP);
  101.             track.setController(ctrl);
  102.             bg.addAnimationTrack(track);
  103.         }
  104.     }
  105.     private Node createRecursive(Mesh aBox, int aCounter)
  106.     {
  107.         float scale = 0.7f;
  108.         float offset = 8.0f;
  109.         Node result;
  110.         if (aCounter == 0)
  111.         {
  112.             result = (Node)aBox.duplicate();
  113.         } else
  114.         {
  115.             Node left = createRecursive(aBox, aCounter - 1);
  116.             Node right = createRecursive(aBox, aCounter - 1);
  117.             left.translate(-offset, 0.0f, 0.0f);
  118.             left.scale(scale, scale, scale);
  119.             right.translate(offset, 0.0f, 0.0f);
  120.             right.scale(scale, scale, scale);
  121.             Group group = new Group();
  122.             group.addChild(left);
  123.             group.addChild(right);
  124.             result = group;
  125.         }
  126.         iNodes.addElement(result);
  127.         float[] axis = new float[4];
  128.         axis[0] = (float)random() - 0.5f;
  129.         axis[1] = (float)random() - 0.5f;
  130.         axis[2] = (float)random() - 0.5f;
  131.         axis[3] = (float)random();
  132.         iAxis.addElement(axis);
  133.         return result;
  134.     }
  135. }