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

J2ME

开发平台:

Java

  1. import javax.microedition.m3g.*;
  2. /**
  3.  * Picking test.
  4.  *
  5.  * The scene contains three balls and a sprite rotating around
  6.  * them. On Java Standard Edition platform, the mouse can be used to
  7.  * move the picking point. When picker hits something, normal at the
  8.  * impact point is shown with an elongated box. If the picker hits a
  9.  * ball, the ball turns red.
  10.  *
  11.  */
  12. public class Example5 extends ExampleBase
  13. {
  14.     private static final String FILE_NAME = "pallot";
  15.     private static final String TEXTURE_NAME = "/textures/pukki_small.png";
  16.     
  17.     private static final int IMAGE_BASE_SIZE = 128;
  18.     private Fog iFog;
  19.     private World iWorld;
  20.     private Appearance iPickedAppearance;
  21.     private Mesh iPointer;
  22.     private Group iAligner;
  23.     private Image2D iImage;
  24.     private Sprite3D iSprite;
  25.     private Group iGroup;
  26.     private Group boxGroup;
  27.     private float[] boxSpeed = { 1.f, 1.2f, 2.1f };
  28.     private Mesh[] box = new Mesh[3];
  29.     public Example5()
  30.     {
  31.         super(SHOW_RENDER_TIME | USES_CURSOR);
  32.     }
  33.     protected void render(int time)
  34.     {
  35.         Node picked = null;
  36.         Appearance oldAppearance = null;
  37.         RayIntersection ray = new RayIntersection();
  38.         iWorld.pick(-1, getMouseX(), getMouseY(), iWorld.getActiveCamera(), ray);
  39.         if (ray.getIntersected() != null)
  40.         {
  41.             picked = ray.getIntersected();
  42.             if (picked instanceof Mesh)
  43.             {
  44.                 oldAppearance = ((Mesh)picked).getAppearance(0);
  45.                 ((Mesh)picked).setAppearance(0, iPickedAppearance);
  46.             }
  47.             else if (picked == iSprite)
  48.             {
  49.                 boxGroup.setRenderingEnable(true);
  50.             }
  51.             
  52.             float[] f = new float[6];
  53.             float dist = ray.getDistance();
  54.             ray.getRay(f);
  55.             iPointer.setTranslation(
  56.                 f[0] + f[3] * dist,
  57.                 f[1] + f[4] * dist,
  58.                 f[2] + f[5] * dist);
  59.             Transform xform = new Transform();
  60.             ray.getIntersected().getTransformTo(iWorld, xform);
  61.             float[] dir = new float[]{ray.getNormalX(), ray.getNormalY(), ray.getNormalZ(), 0.0f};
  62.             xform.transform(dir);
  63.             iAligner.setTranslation(
  64.                 f[0] + f[3] * dist + dir[0],
  65.                 f[1] + f[4] * dist + dir[1],
  66.                 f[2] + f[5] * dist + dir[2]);
  67.             iPointer.setRenderingEnable(true);
  68.             Material mat = iPointer.getAppearance(0).getMaterial();
  69.             int s = (int)(ray.getTextureS(0) * 256.0f) & 0xff;
  70.             int t = (int)(ray.getTextureT(0) * 256.0f) & 0xff;
  71.             mat.setColor(Material.AMBIENT, 0xff555555);
  72.             mat.setColor(Material.DIFFUSE, 0xff000077 + (s << 16) + (t << 8));
  73.         }
  74.         else
  75.         {
  76.             iPointer.setRenderingEnable(false);
  77.         }
  78.         
  79.         float angle = time * 0.0005f;
  80.         float radius = 100.0f;
  81.         iGroup.setTranslation((float)Math.sin(angle) * radius, 0.0f, (float)Math.cos(angle) * radius);
  82.         
  83.         float boxAngle = time * 0.003f;
  84.         float boxRadius = 30.f;
  85.         box[0].setTranslation((float)Math.sin(boxSpeed[0]*boxAngle) * boxRadius, (float)Math.cos(boxSpeed[0]*boxAngle) * boxRadius,  0.f);
  86.         box[1].setTranslation((float)Math.sin(boxSpeed[1]*boxAngle) * boxRadius, 0.f, (float)Math.cos(boxSpeed[1]*boxAngle) * boxRadius);
  87.         box[2].setTranslation(0.f, (float)Math.sin(boxSpeed[2]*boxAngle) * boxRadius, (float)Math.cos(boxSpeed[2]*boxAngle) * boxRadius);
  88.         
  89.         iWorld.align(null); // throws IllegalStateException on WTK22b
  90.         Graphics3D.getInstance().render(iWorld);
  91.         if (picked != null)
  92.         {
  93.             if (picked instanceof Mesh)
  94.             {
  95.                 ((Mesh)picked).setAppearance(0, oldAppearance);
  96.             }
  97.             else if (picked == iSprite)
  98.             {
  99.                 boxGroup.setRenderingEnable(false);
  100.             }
  101.         }
  102.     }
  103.     private void traverse(Node aNode)
  104.     {
  105.         if (aNode instanceof Mesh)
  106.         {
  107.             Mesh mesh = (Mesh)aNode;
  108.             for (int i = 0; i < mesh.getSubmeshCount(); i++)
  109.             {
  110.                 Appearance app = mesh.getAppearance(i);
  111.                 app.setFog(iFog);
  112.             }
  113.         }
  114.         if (aNode instanceof Group)
  115.         {
  116.             Group group = (Group)aNode;
  117.             for (int i = 0; i < group.getChildCount(); i++)
  118.             {
  119.                 traverse(group.getChild(i));
  120.             }
  121.         }
  122.     }
  123.     
  124.     protected void initialize()
  125.     {
  126.         iFog = new Fog();
  127.         iFog.setColor(0xFF204080);
  128.         iFog.setMode(Fog.LINEAR);
  129.         iFog.setLinear(170.0f, 320.0f);
  130.         iWorld = (World)load(FILE_NAME)[0];
  131.         traverse(iWorld);
  132.         
  133.         Material mat = new Material();
  134.         mat.setColor(Material.AMBIENT, 0xff000000);
  135.         mat.setColor(Material.DIFFUSE, 0xffff0000);
  136.         iPickedAppearance = new Appearance();
  137.         iPickedAppearance.setMaterial(mat);
  138.         iPickedAppearance.setFog(iFog);
  139.         iAligner = new Group();
  140.         iWorld.addChild(iAligner);
  141.         iPointer = createBox();
  142.         Transform xform = new Transform();
  143. //      xform.postScale(0.03f, 0.03f, 0.15f);
  144.         xform.postScale(0.3f, 0.3f, 1.5f);
  145. //      xform.postScale(2.0f, 2.0f, 10.0f);
  146.         xform.postTranslate(0.0f, 0.0f, 10.0f);
  147.         iPointer.setTransform(xform);
  148.         iPointer.setRenderingEnable(false);
  149.         iPointer.setPickingEnable(false);
  150.         iPointer.setAlignment(iAligner, Node.ORIGIN, iAligner, Node.Y_AXIS);
  151.         iWorld.addChild(iPointer);
  152.         // Texture options (choose one):
  153.         
  154.         // 1. load image TEXTURE_IMAGE
  155.         iImage = new Image2D(Image2D.RGBA, platformServices.loadImage(TEXTURE_NAME));
  156.         
  157.         // 2. create perlin noise image
  158.         //iImage = ProceduralTexture.createPerlinNoiseImage(0, 0, IMAGE_BASE_SIZE, IMAGE_BASE_SIZE, 0, IMAGE_BASE_SIZE, 0, true);
  159.         // 3. create plasma image
  160.         //iImage = ProceduralTexture.createPlasmaImage(IMAGE_BASE_SIZE, IMAGE_BASE_SIZE, true);
  161.         Appearance sapp = new Appearance();
  162.         sapp.setCompositingMode(new CompositingMode());
  163.         sapp.getCompositingMode().setAlphaThreshold(0.5f);
  164.         sapp.setFog(iFog);
  165.         iSprite = new Sprite3D(true, iImage, sapp);
  166.         iSprite.setScale(50.0f, 50.0f, 50.0f);
  167.         iGroup = new Group();
  168.         boxGroup = new Group();
  169.         boxGroup.setRenderingEnable(false);
  170.         iGroup.addChild(iSprite);
  171.         for (int i = 0; i < box.length; i++)
  172.         {
  173.             box[i] = createBox();
  174.             box[i].setScale(0.3f, 0.3f, 0.3f);
  175.             box[i].getAppearance(0).setFog(iFog);
  176.             box[i].setPickingEnable(false);
  177.             boxGroup.addChild(box[i]);
  178.         }
  179.         
  180.         iGroup.addChild(boxGroup);
  181.         iWorld.addChild(iGroup);
  182.     }
  183. }