public void initScene() {
      //
      // -- Pack all textures in the "assets/atlas" folder into an 1024x1024 atlas
      // -- this should be used to simplify implementation of multiple textures
      // -- and to reduce texture binding calls to the GPU for increased performance
      //
      mAtlas = new TexturePacker(mContext).packTexturesFromAssets(1024, 1024, 0, false, "atlas");

      mAtlasMaterial = new Material();
      mSphereMaterial = new Material();
      mCubeMaterial = new Material();
      mPlaneMaterial = new Material();

      try {
        //
        // -- Add the entire atlas to a material so it can be shown in the example
        // -- this is not necessary in typical use cases
        //
        mAtlasMaterial.addTexture(new Texture("atlasTexture", mAtlas.getPages()[0]));
        mAtlasMaterial.setColorInfluence(0);
        //
        // -- Add each target texture to the material
        // -- they are pulled from the atlas by their original resource name
        //
        mSphereMaterial.addTexture(new Texture("earthtruecolor_nasa_big", mAtlas));
        mSphereMaterial.setColorInfluence(0);
        mCubeMaterial.addTexture(new Texture("camden_town_alpha", mAtlas));
        mCubeMaterial.setColorInfluence(0);
        mPlaneMaterial.addTexture(new Texture("rajawali", mAtlas));
        mPlaneMaterial.setColorInfluence(0);
      } catch (TextureException e) {
        e.printStackTrace();
      }

      //
      // -- Show the full atlas for demonstration purposes
      //
      mAtlasPlane = new Plane(Axis.Z);
      mAtlasPlane.setMaterial(mAtlasMaterial);
      mAtlasPlane.setY(1);
      addChild(mAtlasPlane);

      mTileSphere = new Sphere(.35f, 20, 20);
      mTileSphere.setMaterial(mAtlasMaterial);
      //
      // -- The method 'setAtlasTile' is used to scale the UVs of the target object
      // -- so that the appropriate image within the atlas is displayed
      //
      mTileSphere.setAtlasTile("earthtruecolor_nasa_big", mAtlas);
      mTileSphere.setPosition(0, -.1f, 0);
      addChild(mTileSphere);

      mTileCube = new Cube(.5f);
      mTileCube.setMaterial(mAtlasMaterial);
      mTileCube.setAtlasTile("camden_town_alpha", mAtlas);
      mTileCube.setPosition(-.5f, -1f, 0);
      mTileCube.setRotX(-1);
      addChild(mTileCube);

      mTilePlane = new Plane(.6f, .6f, 1, 1);
      mTilePlane.setMaterial(mAtlasMaterial);
      mTilePlane.setAtlasTile("rajawali", mAtlas);
      mTilePlane.setPosition(.5f, -1f, 0);
      addChild(mTilePlane);
    }
  public void initScene() {
    SimpleMaterial material = new SimpleMaterial();
    material.setUseSingleColor(true);

    // -- "curve1" will be the original curve. Note that we create two curves for
    //    demonstration purposes only. You'd typically create one curve and then
    //    reparametrize it.
    CatmullRomCurve3D curve1 = new CatmullRomCurve3D();
    CatmullRomCurve3D curve2 = new CatmullRomCurve3D();

    for (int i = 0; i < 16; i++) {
      // -- generate a random point within certain limits
      Vector3 pos = new Vector3(-1 + (Math.random() * 2), -1.2f + (Math.random() * 2.4f), 0);
      curve1.addPoint(pos);
      curve2.addPoint(pos);

      // -- add a wireframe cube so we can see what the original
      //    points were
      Cube s = new Cube(.06f);
      s.setMaterial(material);
      s.setColor(CURVE1_COLOR);
      s.setPosition(pos);
      s.setDrawingMode(GLES20.GL_LINES);
      addChild(s);
    }

    // -- draw the first curve
    drawCurve(curve1, CURVE1_COLOR, new Vector3());

    BaseObject3D pathFollowObject = new Sphere(.04f, 16, 16);
    pathFollowObject.setColor(CURVE1_COLOR);
    pathFollowObject.setMaterial(material);
    addChild(pathFollowObject);

    // -- animate a sphere that follow the first curve.
    //    This shows the non constant speed of a non parametrized curve.
    TranslateAnimation3D anim = new TranslateAnimation3D(curve1);
    anim.setDuration(ANIMATION_DURATION);
    anim.setTransformable3D(pathFollowObject);
    anim.setRepeatMode(RepeatMode.REVERSE_INFINITE);
    registerAnimation(anim);
    anim.play();

    // -- reparametrize the curve for uniform distribution
    curve2.reparametrizeForUniformDistribution(curve2.getPoints().size() * 4);
    List<Vector3> points = curve2.getPoints();

    // -- put spheres on the curve where the new points are
    for (int i = 0; i < points.size(); i++) {
      Vector3 pos = points.get(i);
      Sphere s = new Sphere(.02f, 4, 4);
      s.setMaterial(material);
      s.setColor(CURVE2_COLOR);
      s.setPosition(pos);
      addChild(s);
    }

    // -- draw the second, reparametrized, curve
    drawCurve(curve2, CURVE2_COLOR, new Vector3());

    pathFollowObject = new Sphere(.04f, 16, 16);
    pathFollowObject.setColor(CURVE2_COLOR);
    pathFollowObject.setMaterial(material);
    addChild(pathFollowObject);

    // -- animate a sphere on the second curve.
    //    This shows a more or less constant speed of a parametrized curve.
    anim = new TranslateAnimation3D(curve2);
    anim.setDuration(ANIMATION_DURATION);
    anim.setTransformable3D(pathFollowObject);
    anim.setRepeatMode(RepeatMode.REVERSE_INFINITE);
    registerAnimation(anim);
    anim.play();
  }
 @Override
 public void onDrawFrame(GL10 glUnused) {
   super.onDrawFrame(glUnused);
   mTileCube.setRotY(mTileCube.getRotY() + 1);
   mTileSphere.setRotY(mTileSphere.getRotY() + 1);
 }