# [JAVA3D] Kamerasteuerung



## evilion (24. Jun 2010)

Hi all

Ich hab hier 2 kleine Probleme und bitte um eure Hilfe.
Es ist folgendes...
Erstes Problem is ein logisches. Ich verstehe nicht wieso es das macht was es macht. 
Und zwar hatte ich das Problem, das wenn ich mit der Maus in eine untere Ecke gehe, geht die Kamera nach oben. Also vollkommen umgekehrt. Ich musste die Achsen wechseln und diese Negativ machen. Nur so hats funktioniert. Aber für mich ist das vollkommen unlogisch. Ich weiss nicht wieso die Kamera nach oben geht wenn diese eigentlich auf der x achse verschoben werden sollte. 
Kann mir das jemand erklären?


```
protected void processMouseEvent(MouseEvent mouseEvent) {
      //Maus initialisieren, um diese in die Mitte zu schieben
      MouseEvent mouse = (MouseEvent) mouseEvent;

      //Mitte des Fensters ermitteln
      Component comp = mouse.getComponent();
      final int centerX = comp.getLocationOnScreen().x + comp.getWidth() / 2;
      final int centerY = comp.getLocationOnScreen().y + comp.getHeight() / 2;

      //Ereignis der Maus
      int eventId = mouseEvent.getID();

      /*Es sollen keine Transformationen vorgenommen werden,
      während die Maus sich nicht im Fenster befindet*/
      if (eventId == MouseEvent.MOUSE_EXITED) {
         outsideScreen = true;
      }
      /*Wenn die Maus bewegt wird, während man die linke Maustaste festhält,
      bewegt sich die Kamera*/
      else if (eventId == MouseEvent.MOUSE_DRAGGED) {
         //Wenn es vorher ausserhalb des Fenster war, ist es jetzt nicht mehr.
         if (outsideScreen) {
            outsideScreen = false;
            return;
         }

         //Der Roboter hält die Maus immer in der Mitte
         try {
            java.awt.Robot robot = new java.awt.Robot();
            robot.mouseMove(centerX, centerY);

         }
         catch (Exception e) {
            System.out.println(
                  "Kann Maus nicht in der Mitte des Fensters halten ");
         }
         //Macht den Mauszeiger unsichtbar
         //Erstelle ein neues durchsichtiges Bild
         BufferedImage image = new BufferedImage(1, 1,
                                                 BufferedImage.TYPE_INT_ARGB);
         image.getAlphaRaster().setPixel(0, 0, new double[]{0, 0, 0, 0});

         //Sag dem Mauszeiger, dass dieser das neue Bild verwenden soll
         Cursor cursor = java.awt.Toolkit.getDefaultToolkit().createCustomCursor(
               image, new Point(), "invisible");
         comp.setCursor(cursor);

         /*Berechnet aus der Position der Maus im Fenster, Position der Maus auf dem Bildschirm
         und dem Zentrum des Fenster, um wie viel und wohin die Kamera bewegt wird*/
         int relX = mouse.getX() + comp.getLocationOnScreen().x - centerX;
         int relY = mouse.getY() + comp.getLocationOnScreen().y - centerY;

         //Multipliziert die Kamerabewegung mit der Geschwindigkeit, damit man sich nicht zu schnell bewegt
         //Original rotSpeed=0.01
         rotY = relY * rotSpeed;
         rotX = relX * rotSpeed;

         //Führt die Rotation der Kamera aus
         rotator.rotX(-rotY);
         transform.mul(rotator);
         rotator.rotY(-rotX);
         transform.mul(rotator);

         //Originalposition aus der Transformgroup wieder verwenden
         Vector3d pos = new Vector3d();
         {
            Transform3D tmp = new Transform3D();
            targetTG.getTransform(tmp);// targetTG ist die Kamera
            tmp.get(pos);
         }

         transform.setTranslation(pos);
         targetTG.setTransform(transform);
      }
      else if (eventId == MouseEvent.MOUSE_RELEASED) {
         //Macht den Mauszeiger wieder sichtbar
         c.setCursor((Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)));
      }
   }// end of processMouseEvent()
```

Und das zweite Problem waere, wenn ich die Kamera auf die Seite drehe und die vorher schraeng nach oben und unten ausgerichtet war, kippt die Kamera.
Hier ein Bild, wie es aussieht.





Ich würde es gerne so machen, wie in einem Egoshooter. Wie schaff ich das?


----------



## Marco13 (24. Jun 2010)

Wenn man die Bewegung der Kamera selbst schreibt, gibt es kein" unlogisch", sondern nur das, was man eben programmiert hat. Vielleicht eine allgemeine Verwirrung: Wenn man die Kamera nach oben dreht, sieht das so aus, als ob sich die Welt nach unten dreht. Für alles weitere würde ich warten, ob da jemand ein KSKB bastelt.


----------



## evilion (24. Jun 2010)

Ich habs nicht selber geschrieben. Ich hab aus irgendeinen Forumbeitrag die Maussteuerung herausgenommen und für meine Bedürfnisse angepasst. Und eben angeschaut was und wieso es so macht aber ich habe keinen logischen Grund dafür gefunden, wieso die Kamera nach oben geht wenn die Maus nach unten bewegt wird. Und die ging nie glatt nach oben sondern hat immer gestockt und ging manchmal sogar in die richtige Richtung.

Und ich habe keinen Logischen grund wieso die Maus sich auf der Y achse in eine Richtung bewegt wenn ich die X Achse abfrage...


----------



## Marco13 (24. Jun 2010)

Ich hab' das Programm (fragment  ) jetzt nicht im Detail nachvollzogen, aber das Verhalten der Kamera hängt natürlich davon ab, in welcher Reihenfolge die Matrix-Multiplikationen durchgeführt werden - und wenn man eine 3D-shooter-artige Steuerung haben wollte, müßte man erst um die X-Achse und dann um die Y-Achse rotieren, kann sein, dass das bei dir verkehrt herum ist...


----------

