[SOLVED] Move camera position by right click

I want moving my ChaseCamera with the right mouse button. Zoom and rotate works well.
I think that’s a very common issue. In each 3D viewer one can move your object with the right mouse button.
If the right button clicked and the mouse moves then the view point to object is changing.
I hope there’s a simple solution.

public class TestChaseCamera extends SimpleApplication {

  private Geometry teaGeom;
  private ChaseCamera chaseCam;

  public static void main(String[] args) {
    TestChaseCamera app = new TestChaseCamera();
    app.start();
  }

  @Override
  public void simpleInitApp() {
    // Load a teapot model
    teaGeom = (Geometry) assetManager.loadModel("Models/Teapot/Teapot.obj");
    Material mat_tea = new Material(assetManager, "Common/MatDefs/Misc/ShowNormals.j3md");
    teaGeom.setMaterial(mat_tea);
    rootNode.attachChild(teaGeom);
    flyCam.setEnabled(false);
    chaseCam = new ChaseCamera(cam, teaGeom, inputManager);
    chaseCam.setSmoothMotion(true);
    initRaw();
  }

  public void initRaw(){
      inputManager.addRawInputListener(new RawInputListener() {
          private boolean isRightButtonPressed = false;
          @Override
          public void beginInput() { }

          @Override
          public void endInput() { }

          @Override
          public void onJoyAxisEvent(JoyAxisEvent evt) { }

          @Override
          public void onJoyButtonEvent(JoyButtonEvent evt) { }

          @Override
          public void onMouseMotionEvent(MouseMotionEvent evt) {
            if(isRightButtonPressed) {
              // here the camera must be moved
            }
          }

          @Override
          public void onMouseButtonEvent(MouseButtonEvent evt) { 
              isRightButtonPressed = evt.getButtonIndex() == MouseInput.BUTTON_RIGHT && evt.isPressed();
          }

          @Override
          public void onKeyEvent(KeyInputEvent evt) { }

          @Override
          public void onTouchEvent(TouchEvent evt) { }
      });
  }
}

There is ChaseCameraAppState where you can call the setToggleRotationTrigger method with the correct trigger(s).
You can use ‘new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)’ as trigger.

2 Likes

@remy_vd
Thank you very much for that hint. Due to your hint I found this solution:

public class TestConeVSFrustum extends SimpleApplication {

    public static void main(String[] args) {
        TestConeVSFrustum app = new TestConeVSFrustum();
        app.start();
    }

    @Override
    public void simpleInitApp() {
        inputManager.addMapping("click", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT));
        inputManager.addMapping("middleClick", new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE));
        inputManager.addMapping("up", new MouseAxisTrigger(MouseInput.AXIS_Y, false));
        inputManager.addMapping("down", new MouseAxisTrigger(MouseInput.AXIS_Y, true));
        inputManager.addMapping("left", new MouseAxisTrigger(MouseInput.AXIS_X, true));
        inputManager.addMapping("right", new MouseAxisTrigger(MouseInput.AXIS_X, false));


        final Node camTarget = new Node("CamTarget");
        rootNode.attachChild(camTarget);

        ChaseCameraAppState chaser = new ChaseCameraAppState();
        chaser.setTarget(camTarget);
        chaser.setMaxDistance(150);
        chaser.setDefaultDistance(70);
        chaser.setDefaultHorizontalRotation(FastMath.HALF_PI);
        chaser.setMinVerticalRotation(-FastMath.PI);
        chaser.setMaxVerticalRotation(FastMath.PI * 2);
        chaser.setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
        stateManager.attach(chaser);
        flyCam.setEnabled(false);

        inputManager.addListener(new AnalogListener() {
            public void onAnalog(String name, float value, float tpf) {
                float mult = 1;
                if ((moving || panning)) {
                    
                        value *= MOVE_SPEED * mult;
                        if (name.equals("up")) {
                            tmp.set(cam.getUp()).multLocal(value);
                            camTarget.move(tmp);
                        }
                        if (name.equals("down")) {
                            tmp.set(cam.getUp()).multLocal(-value);
                            camTarget.move(tmp);
                        }
                        if (name.equals("left")) {
                            tmp.set(cam.getLeft()).multLocal(value);
                            camTarget.move(tmp);
                        }
                        if (name.equals("right")) {
                            tmp.set(cam.getLeft()).multLocal(-value);
                            camTarget.move(tmp);
                        }
                    
                }
            }
        }, "up", "down", "left", "right");

        inputManager.addListener(new ActionListener() {
            public void onAction(String name, boolean isPressed, float tpf) {
                moving = name.equals("click") && isPressed;
                panning = name.equals("middleClick") && isPressed;
            }
        }, "click", "middleClick");

        Box boxMesh = new Box(1f, 1f, 1f);
        boxGeo = new Geometry("A Textured Box", boxMesh);
        Material boxMat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        Texture monkeyTex = assetManager.loadTexture("Interface/Logo/Monkey.jpg");
        boxMat.setTexture("ColorMap", monkeyTex);
        boxGeo.setMaterial(boxMat);
        rootNode.attachChild(boxGeo);
    }
    Geometry boxGeo;
    private final static float MOVE_SPEED = 60;
    Vector3f tmp = new Vector3f();
    Quaternion tmpQuat = new Quaternion();
    boolean moving, shift;
    boolean panning;
    Geometry geom;
 
    Camera frustumCam;

    @Override
    public void simpleUpdate(float tpf) {

    }
}

And this is exactly what I want.

1 Like