public void onDrawFrame(GL10 glUnused) {
      super.onDrawFrame(glUnused);
      // -- no proper physics here, just a bad approximation to keep
      // this example as short as possible ;-)
      mRaptor.setZ(mRaptor.getZ() + 2f);
      mRaptor.setX((float) Math.sin(mTime) * 20f);
      mRaptor.setRotZ((float) Math.sin(mTime + 8f) * -30f);
      mRaptor.setRotY(180 + (mRaptor.getRotZ() * .1f));
      mRaptor.setRotY(180);
      mRaptor.setY((float) Math.cos(mTime) * 10f);
      mRaptor.setRotX((float) Math.cos(mTime + 1f) * -20f);

      mSphere.setZ(mRaptor.getZ());
      mTime += .01f;

      if (mRootCube.getZ() - mRaptor.getZ() <= (30 * -6)) {
        mRootCube.setZ(mRaptor.getZ());
      }
    }
    protected void initScene() {
      PointLight light = new PointLight();
      light.setZ(6);
      light.setPower(2);

      getCurrentScene().addLight(light);

      Texture jetTexture = new Texture("jetTexture", R.drawable.jettexture);
      SphereMapTexture sphereMapTexture =
          new SphereMapTexture("manilaSphereMapTex", R.drawable.manila_sphere_map);

      jetTexture.setInfluence(.8f);
      // -- important!
      sphereMapTexture.isEnvironmentTexture(true);
      sphereMapTexture.setInfluence(.2f);

      Object3D jet1 = null;
      // -- sphere map with texture

      try {
        Material material1 = new Material();
        material1.enableLighting(true);
        material1.setDiffuseMethod(new DiffuseMethod.Lambert());
        material1.addTexture(jetTexture);
        material1.addTexture(sphereMapTexture);

        ObjectInputStream ois;
        ois = new ObjectInputStream(mContext.getResources().openRawResource(R.raw.jet));
        jet1 = new Object3D((SerializedObject3D) ois.readObject());
        jet1.setMaterial(material1);
        jet1.setY(2.5f);
        addChild(jet1);
      } catch (Exception e) {
        e.printStackTrace();
      }

      Vector3 axis = new Vector3(2, -4, 1);
      axis.normalize();

      Animation3D anim1 = new RotateAnimation3D(axis, 360);
      anim1.setRepeatMode(RepeatMode.INFINITE);
      anim1.setDuration(12000);
      anim1.setTransformable3D(jet1);
      registerAnimation(anim1);
      anim1.play();

      sphereMapTexture = new SphereMapTexture("manilaSphereMapTex2", R.drawable.manila_sphere_map);
      sphereMapTexture.isEnvironmentTexture(true);
      sphereMapTexture.setInfluence(.5f);

      Material material2 = new Material();
      // -- important, indicate that we want to mix the sphere map with a color
      material2.enableLighting(true);
      material2.setDiffuseMethod(new DiffuseMethod.Lambert());
      try {
        material2.addTexture(sphereMapTexture);
      } catch (TextureException e) {
        e.printStackTrace();
      }
      material2.setColorInfluence(.5f);

      Object3D jet2 = jet1.clone(false);
      jet2.setMaterial(material2);
      // -- also specify a color
      jet2.setColor(0xff666666);
      jet2.setY(-2.5f);
      addChild(jet2);

      Animation3D anim2 = new RotateAnimation3D(axis, -360);
      anim2.setRepeatMode(RepeatMode.INFINITE);
      anim2.setDuration(12000);
      anim2.setTransformable3D(jet2);
      registerAnimation(anim2);
      anim2.play();

      getCurrentCamera().setPosition(0, 0, 14);
    }
    protected void initScene() {
      DirectionalLight light = new DirectionalLight(0, -.6f, .4f);
      light.setPower(1);
      getCurrentScene().addLight(light);

      // -- create sky sphere
      mSphere = new Sphere(400, 8, 8);
      Material sphereMaterial = new Material();
      try {
        sphereMaterial.addTexture(new Texture("skySphere", R.drawable.skysphere));
      } catch (TextureException e1) {
        e1.printStackTrace();
      }
      mSphere.setMaterial(sphereMaterial);
      mSphere.setDoubleSided(true);
      addChild(mSphere);

      try {
        // -- load gzipped serialized object
        ObjectInputStream ois;
        GZIPInputStream zis =
            new GZIPInputStream(mContext.getResources().openRawResource(R.raw.raptor));
        ois = new ObjectInputStream(zis);
        mRaptor = new Object3D((SerializedObject3D) ois.readObject());
        Material raptorMaterial = new Material();
        raptorMaterial.setDiffuseMethod(new DiffuseMethod.Lambert());
        raptorMaterial.enableLighting(true);
        raptorMaterial.addTexture(new Texture("raptorTex", R.drawable.raptor_texture));
        mRaptor.setMaterial(raptorMaterial);
        mRaptor.setScale(.5f);
        addChild(mRaptor);
      } catch (Exception e) {
        e.printStackTrace();
      }

      // -- create a bunch of cubes that will serve as orientation helpers

      mCubes = new Object3D[30];

      mRootCube = new Cube(1);
      Material rootCubeMaterial = new Material();
      rootCubeMaterial.setDiffuseMethod(new DiffuseMethod.Lambert());
      rootCubeMaterial.enableLighting(true);
      try {
        rootCubeMaterial.addTexture(new Texture("camouflage", R.drawable.camouflage));
      } catch (TextureException e) {
        e.printStackTrace();
      }
      mRootCube.setMaterial(rootCubeMaterial);
      mRootCube.setY(-1f);
      // -- similar objects with the same material, optimize
      mRootCube.setRenderChildrenAsBatch(true);
      addChild(mRootCube);
      mCubes[0] = mRootCube;

      for (int i = 1; i < mCubes.length; ++i) {
        Object3D cube = mRootCube.clone(true);
        cube.setY(-1f);
        cube.setZ(i * 30);
        mRootCube.addChild(cube);
        mCubes[i] = cube;
      }

      // -- create a chase camera
      // the first parameter is the camera offset
      // the second parameter is the interpolation factor
      ChaseCamera chaseCamera = new ChaseCamera(new Vector3(0, 3, 16), .1f);
      // -- tell the camera which object to chase
      chaseCamera.setObjectToChase(mRaptor);
      // -- set the far plane to 1000 so that we actually see the sky sphere
      chaseCamera.setFarPlane(1000);
      replaceAndSwitchCamera(chaseCamera, 0);
    }