private void Handle3DControl(Object3D obj, float originZ) {
    switch (Activity3Page.currentActionType) {
      case Move:
        // ---處理移動(Translate Position: X,Y)---begin
        SimpleVector transPos =
            new SimpleVector(
                obj.getTranslation().x + deltaTranslatePositionX,
                obj.getTranslation().y + deltaTranslatePositionY,
                obj.getTranslation().z);

        SimpleVector projectScreenV3 =
            Interact2D.project3D2D(
                world.getCamera(), frameBuffer, transPos); // (重要!!!)這可以知道3D物件在2D畫面的投影

        if (projectScreenV3.x >= 0
            && projectScreenV3.y >= 0
            && projectScreenV3.x <= frameBuffer.getWidth()
            && projectScreenV3.y <= frameBuffer.getHeight()) {
          obj.translate(deltaTranslatePositionX, deltaTranslatePositionY, 0);
        }
        deltaTranslatePositionX = 0;
        deltaTranslatePositionY = 0;
        // ---處理移動(Translate Position: X,Y)---end

        // ---處理放大縮小(Scale)---begin
        if (deltaScale != 0) {
          float currentScale = obj.getScale() + deltaScale;
          if (currentScale <= 0.5f) {
            obj.setScale(0.5f);
          } else if (currentScale >= 1.5f) {
            obj.setScale(1.5f);
          } else {
            obj.setScale(currentScale);
          }
          deltaScale = 0;
        }
        // ---處理放大縮小(Scale)---end
        break;

      case Rotate:
        // ---處理旋轉(Rotate)---begin
        if (deltaRotateAngleX != 0) {
          obj.rotateY(deltaRotateAngleX);
          deltaRotateAngleX = 0;
        }
        if (deltaRotateAngleY != 0) {
          obj.rotateX(deltaRotateAngleY);
          deltaRotateAngleY = 0;
        }
        // ---處理旋轉(Rotate)---end
        break;

      case Depth:
        // ---處理深度(Translate Depth: Z軸)---begin
        float currentPosZ = obj.getTranslation().z + deltaTranslatePositionZ;
        if (currentPosZ > originZ - ZaxisCanMoveDistance
            && currentPosZ < originZ + ZaxisCanMoveDistance) {
          obj.translate(0, 0, deltaTranslatePositionZ);
        }
        deltaTranslatePositionZ = 0;
        // ---處理深度(Translate Depth: Z軸)---end
        break;
    }
  }
  public void onDrawFrame(GL10 gl) {

    // 程式已精簡過,備註:此部分必須寫在GL端,getPixel不能跳脫GL執行緒內
    // 錯誤內容call to OpenGL ES API with no current context (logged once per
    // thread)

    if (combineImage) {
      FrameBuffer fb = frameBuffer;
      GLBitmap =
          Bitmap.createBitmap(fb.getPixels(), fb.getWidth(), fb.getHeight(), Config.ARGB_8888);

      Bitmap combineBitmap;
      combineBitmap =
          Bitmap.createBitmap(GLBitmap.getWidth(), GLBitmap.getHeight(), Bitmap.Config.ARGB_8888);
      Canvas comboImage = new Canvas(combineBitmap);
      comboImage.drawBitmap(GLBitmap, 0f, 0f, null);
      comboImage.drawBitmap(Activity3Page.Activity3BitmapPaint, 0f, 0f, null);
      saveImage(combineBitmap);

      combineImage = false;
    }

    if (Activity3Page.currentEditStatus == EditStatus.Mode3D) {

      gl.glShadeModel(GL10.GL_SMOOTH);
      gl.glEnable(GL10.GL_DEPTH_TEST); // 啟動深度檢測(沒有看到的面就不會被畫)

      float deltaTime = (System.currentTimeMillis() - currentSystemTime) / 1000.0f;
      currentSystemTime = System.currentTimeMillis();
      if (colorValue >= 255) {
        colorValue = 255;
        colorChangeSpeed = -colorChangeSpeed;
      } else if (colorValue <= 0) {
        colorValue = 0;
        colorChangeSpeed = -colorChangeSpeed;
      }
      colorValue += (deltaTime * colorChangeSpeed);

      switch (Activity3Page.currentAction3DObject) {
        case DetectObject:
          SimpleVector ray =
              Interact2D.reproject2D3D(world.getCamera(), frameBuffer, (int) PointX, (int) PointY)
                  .normalize();
          Object[] res =
              world.calcMinDistanceAndObject3D(world.getCamera().getPosition(), ray, 1000);
          if (res[1] != null) {
            String name = null;
            name = ((Object3D) res[1]).getName();
            if (name == "Arch") {
              Activity3Page.currentAction3DObject = Action3DObject.Arch;
            } else if (name == "Box") {
              Activity3Page.currentAction3DObject = Action3DObject.Box;
            } else if (name == "Cylinder") {
              Activity3Page.currentAction3DObject = Action3DObject.Cylinder;
            }
          }
        case NoAction:
          arch.setAdditionalColor(new RGBColor(0, 0, 0, 0)); // 原色
          box.setAdditionalColor(new RGBColor(0, 0, 0, 0)); // 原色
          cylinder.setAdditionalColor(new RGBColor(0, 0, 0, 0)); // 原色
          break;
        case Arch:
          arch.setAdditionalColor(new RGBColor((int) colorValue, 0, 0, 255)); // 提示色
          box.setAdditionalColor(new RGBColor(0, 0, 0, 0)); // 原色
          cylinder.setAdditionalColor(new RGBColor(0, 0, 0, 0)); // 原色
          Handle3DControl(arch, archOriginPosition.z);
          break;

        case Box:
          arch.setAdditionalColor(new RGBColor(0, 0, 0, 0)); // 原色
          box.setAdditionalColor(new RGBColor((int) colorValue, 0, 0, 255)); // 提示色
          cylinder.setAdditionalColor(new RGBColor(0, 0, 0, 0)); // 原色
          Handle3DControl(box, boxOriginPosition.z);
          break;

        case Cylinder:
          arch.setAdditionalColor(new RGBColor(0, 0, 0, 0)); // 原色
          box.setAdditionalColor(new RGBColor(0, 0, 0, 0)); // 原色
          cylinder.setAdditionalColor(new RGBColor((int) colorValue, 0, 0, 255)); // 提示色
          Handle3DControl(cylinder, cylinderOriginPosition.z);
          break;
      }
    }
    frameBuffer.clear(backgroundColor);

    world.renderScene(frameBuffer);
    world.draw(frameBuffer);
    frameBuffer.display();
  }