# Java3D Kollisionserkennung und Schwerkraft



## RichardC (31. Jan 2010)

Guten Abend,
ich arbeite momentan an einem Java Projekt indem ich eine 3 Dimensionale Umgebung mit Java3D realsieren möchte.

Zum Einstieg:
Mittels selbst erstellter Behaviors die auf AWT Events reagieren bin ich schon in der Lage mich mit der Maus umzugucken und per WASD die Position zu ändern.

Dabei werden folgende Methoden aufgerufen:


```
//Von der Tastatur aufgerufen
  public void gehenVor(double vektor){
        Transform3D bewegung = new Transform3D();
        bewegung.setTranslation(new Vector3d(0,0,vektor));
        translation.mul(bewegung);
        simpleUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(translation);
    }
public void gehenSeitlich(double vektor){
        Transform3D bewegung = new Transform3D();
        bewegung.setTranslation(new Vector3d(vektor,0,0));
        translation.mul(bewegung);
        simpleUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(translation);	
    }

//von der maus aufgerufen
       public void schauX(double angel){
        Transform3D rotaX = new Transform3D();
        rotaX.rotX(((Math.PI/180)*angel)/6);
        translation.mul(rotaX);
        rotationX = rotationX + angel;
        simpleUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(translation);
    }
    public void schauY(double angel){
        Transform3D rotaY = new Transform3D();
        rotaY.rotY(((Math.PI/180)*angel)/6);
        translation.mul(rotaY);
        rotationY = rotationY + angel;
        simpleUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(translation);
    }
```



Nun habe ich 3 Fragen:

1. Ich verstehe noch nicht ganz wie das mit der ViewPlatform aussieht. Wenn ich eine translation auf die anwende. verschiebt sich dann die Kamera oder verschiebt sich dann das komplette universum um die kamera? Ich hab grad logische Kopfschmerzen.
Es geht mir darum ob meine Kamera konkrete Positionen hat oder ob die Kamera immer bei 0,0,0 steht. Aber irgentwie ist das doch auch etwas unerheblich? Ich bin da etwas verdreht! Bitte um klarstellung!

2. Wenn ich nach oben schaue bewege ich mich bei einem Druck auf W ebenfalls nach oben. Ich hab schon eine Idee wie man es lösen könnte "auf dem teppich" zu bleiben, aber wie realisiert man das "üblicherweise"?
Ich gehe hier von einem komplett ebenen Terrain aus. 

3. Wie kann ich verhindern gegen eine Wand zu laufen?
Ich hab schon mit einem Behavior in dem ich den "WakeupOnViewPlatformEntry" nutze rumprobiert, aber das wollte irgentwie nicht.
Im prinzip hab ich mir gedacht man könnte ein Behavior schreiben, dass etwas früher auf eine Kollision reagiert sodass mann kurz vor der wand stehen bleibt. Wo fange ich da an? Ich brauche einen Anhaltspunkt was ich mir anschauen soll!



Eventuell ist auch netter Entwickler bereit mir ein wenig in icq oder msn Rede und Antwort zu stehen! Würde mich freuen
mfG Richard


----------



## Marco13 (31. Jan 2010)

Bin schon ein bißchen aus Java3D raus, aber versuch's mal... 

_1. Ich verstehe noch nicht ganz wie das mit der ViewPlatform aussieht. Wenn ich eine translation auf die anwende. verschiebt sich dann die Kamera oder verschiebt sich dann das komplette universum um die kamera? Ich hab grad logische Kopfschmerzen.
Es geht mir darum ob meine Kamera konkrete Positionen hat oder ob die Kamera immer bei 0,0,0 steht. Aber irgentwie ist das doch auch etwas unerheblich? Ich bin da etwas verdreht! Bitte um klarstellung!_

Meines Wissens bewirkt eine Änderung an der ViewPlatform eine Bewegung der Kamera - und nicht der Welt. Unerheblich ist das nicht. Wenn man vor einem Objekt steht, und das Objekt bewegt sich nach LINKS, dann sieht das so aus, als ob die Kamera sich nach RECHTS bewegt (kennt man wenn man im Zug sitzt und losfährt, und man erstmal nicht erkennt ob man selbst in die eine, oder der Zug auf dem anderen Gleis in die andere Richtung fährt). Relevant wird das natürlich, wenn die Umgebung "fest" bleiben soll - und wenn man eine Spielfigur (Kamera) durch die Gegend steuert, bleibt die "Gegend" i.a. fest (ansnsten wären weitere Objektbewegungen in der Umgebung ziemlich kompliziert)


_2. Wenn ich nach oben schaue bewege ich mich bei einem Druck auf W ebenfalls nach oben. Ich hab schon eine Idee wie man es lösen könnte "auf dem teppich" zu bleiben, aber wie realisiert man das "üblicherweise"?
Ich gehe hier von einem komplett ebenen Terrain aus. 
_

Das hängt mit der Reihenfolge der Transformationen zusammen. Man kann (und sollte, der Einfachkeit halber) die Bewegung der Figur und die Drehung der Figur (Blickrichtung) in zwei verschiedenen Transformationen speichern. In deinem Fall gäbe es dann nicht nur die 'translation', sondern auch eine 'rotation', und die beiden werden multipliziert und das Ergebnis in die viewPlatformTransform geschrieben. Dabei sollte zum Berechnen der endgültigen Transformation ZUERST die Verschiebung (also das Rumlaufen in der Ebene) angewendet werden, und DANACH die Drehung der Blickrichtung. Änderungen an diesen Transformationen sollten dann jeweils von links an die aktuellen Transformationen dranmultipliziert werden. (Das machst du ja schon ... BTW: Es heißt 'angle' - 'angel' ist das Vieh mit den Flügeln und der Harfe...  )

EDIT: Ach nee, du multiplizierst von rechts dran...

_3. Wie kann ich verhindern gegen eine Wand zu laufen?
Ich hab schon mit einem Behavior in dem ich den "WakeupOnViewPlatformEntry" nutze rumprobiert, aber das wollte irgentwie nicht.
Im prinzip hab ich mir gedacht man könnte ein Behavior schreiben, dass etwas früher auf eine Kollision reagiert sodass mann kurz vor der wand stehen bleibt. Wo fange ich da an? Ich brauche einen Anhaltspunkt was ich mir anschauen soll!_

Die Java3D-interne Kollisionserkennung habe ich nie wirklich benutzt, aber es gibt da sowas wie WakeupOnCollisionEntry (Java 3D API) und Beispiele dazu wie z.B. Java Tips - Collision Detection with Java3D - 3 ... kannst du dir ja mal anschauen...


----------



## RichardC (31. Jan 2010)

Danke für die Hilfe! Ich bin momentan dabei Problem Nummer 2 zu lösen.
Ich habe nun alles in 4 Translationen ausgelagert, welche bei jedem Änderungsvorgang neu zusammenmultipliziert werden!


```
public void gehenVor(double vektor){
        bewegungVor = new Transform3D();
        wegZ = wegZ + vektor;
        bewegungVor.setTranslation(new Vector3d(0,0,wegZ));
    }
    public void gehenSeitlich(double vektor){
        bewegungSeitlich = new Transform3D();
        wegX = wegX + vektor;
        bewegungSeitlich.setTranslation(new Vector3d(wegX,0,0));
    }
    public void schauX(double angle){
        rotaX = new Transform3D();
        rotationX = rotationX + angle;
        rotaX.rotX(((Math.PI/180)*rotationX)/6);
    }
    public void schauY(double angle){
        rotaY = new Transform3D();
        rotationY = rotationY + angle;
        rotaY.rotY(((Math.PI/180)*rotationY)/6);
    }
    public void aktualisieren(){
        // System.out.println(""+rotationX+"  "+rotationY);
        finalTrans = new Transform3D();
        finalTrans.mul(bewegungVor);
        finalTrans.mul(bewegungSeitlich);
        finalTrans.mul(rotaY);
        finalTrans.mul(rotaX);
        
        simpleUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(finalTrans);
    }
```

Meine Key und Mouse Events ändern mit den Methoden aus dem Quelltext die 4 Transformationen. 
Die Methode aktualisieren() fügt sie nun zusammen! Zuerst die positionsänderung nach vorne, dann seitlich und dann die rotationen.

Im moment sieht es wiefolgt aus:
Ich kann in jeder position mit der Maus hin und her schauen so wie es sein soll.
Das laufen mit WASD ist allerdings noch fehlerhaft.

wenn ich nach vorne gehe gehe ich immer nur in eine Richtung!
Nehmen wir an ich schaue nach links mit der Maus. 
Dann drücke ich die Taste W um nach vorne zu gehen.
Ich gehe seitlich nach rechts.

Das macht auch alles Sinn wie es im moment funktioniert. Nur wie bringe ich meine Figur nun dazu nach vorne zu gehen und zwar in die Richtung in die sie momentan schaut und nicht streng nach dem Vektor?

Danke schonmal für eure Hilfe!


----------



## RichardC (31. Jan 2010)

Okay nun ist etwas wirklich komisch. Mit oben schon gezeigtem Quelltext und folgender Reihenfolge der Transformationen kann ich mich in blickrichtung so wie es sein soll nach vorne, nach hinten, und seitlich bewegen.
Aber wenn ich nun die Position der Maus verändere dreht sich anstatt meiner Sicht der Würfel! ich kann den würfel drehen. 
Mit W kann ich in blickrichtung auf den würfel zu und mit A kann ich mich seitlich aus dem Blickwinkel des Würfels rausbewegen. Jedoch beim bewegen der Maus dreht sich der Würfel.

Eigentlich hatte ich aber jetzt damit gerechnet, dass die Situtation wie die am Anfang ist!!! und zwar, dass ich optimal umherlaufen kann, dass ich aber nicht auf dem Teppich bleibe!!!
Was ist das los???


```
finalTrans.mul(rotaY);
finalTrans.mul(rotaX);
finalTrans.mul(bewegungVor);
finalTrans.mul(bewegungSeitlich);
```


----------



## Marco13 (31. Jan 2010)

OK... wenn ich das jetzt richtig verstehe, sollte man mit WASD immer in bezug auf die Blickrichtung laufen (bzw. seitlich 'strafen') - aber das hoch/runtersehen soll dabei nicht berücksichtigt werden...? Du redest jetzt von einem Würfel... Durch Ändern der ViewPlatform kann sich der Würfel nicht bewegen... aber es kann so aussehen, als ob  Ein KSKB wäre nicht schlecht...


----------



## RichardC (31. Jan 2010)

Ja ich denke auch, dass es so aussehen könnte als ob man sich um den würfel dreht, aber dies in wirklichkeit nicht stimmt!
Aber wieso ist das so?
Ich hab mal meine Hand zur Hilfe genommen. Erst bewegung seitlich, dann bewegung vor, dann nach links schauen, dann nach unten schauen.
Meine hand bewegt sich genau richtig!
Aber was stimmt da nicht?

Was ist ein KSKB?

Ich möchte eigentlich nur eine Welt erschaffen in der man wie in einem  First Person Shooter rumlaufen kann.
Sprich: 
-Sich mit der Maus umschauen
  >Mausbewegung nach oben -> nach oben schauen
  >Mausbewegung nach unten -> nach unten schauen
  >Mausbewegung nach links -> nach links schauen
  >Mausbewegung nach rechts -> nach rechts schauen
-Mit den Tasten WASD navigieren
  >W -> Nach vorne gehen 
  >A  -> Seitlich nach links gehen
  >S  -> Zurück gehen
  >D  -> Seitlich nach rechts gehen

Wenn man die Maus nach links schiebt ändert sich das "Vorne" und auch die Bewegungsrichtung. Wenn man sie Maus nach oben schiebt bleibt die richtung gleich! Die Spielfigut soll nicht abheben!
Alle Tasten W,A,S und D agieren gleich.
Wenn man sich nach links dreht ändert sich auch die Richtung in die man seitlich geht wenn man a drückt.


Eigentlich einfach nur eine klassische "First Person Shooter" bzw. "Ego Shooter" Steuerung


----------



## Marco13 (31. Jan 2010)

Ein KSKB ist das, was erscheint, wenn du mit der Maus mal kurz über diese Abkürzung fährst


----------



## RichardC (31. Jan 2010)

Oh wahnsinns trick
Kein Problem! Kommt sofort!

Im Anhang befindet sich das was ich im moment habe!
Das Programm wurde mit BlueJ erstellt!

Zur Erklärung:

main.java ist der Anfang! Dort befindet sich auch die Main Methode!
windowOutput.java ist der Teil den man sich anschauen sollte! Dort finden die Transformationen statt!

szene.java verwaltet den Szenegraphen 
und alles mit der Endung Behavior sind die Behaviors, welche auf Tastatur und Mauseingaben antworten.

Fred ist ein Thread der alle paar Millisekunden prüft ob eine Taste aktiv ist(Das ist für eine flüssige Bewegung notwendig)



Viel Spaß damit!


Mir ist übrigens noch aufgefallen wenn man die Maus im Kreis bewegt dreht sich der Würfel. Das ist auch garnicht korrekt


Bei fragen zum Quelltext bitte noch einmal posten


----------



## Marco13 (1. Feb 2010)

Ja, werd's mir heut' in der Mittagspause mal ansehen...


----------



## Marco13 (1. Feb 2010)

Ja, hab' mal kurz geschaut... Das mit der Reihenfolge der Multiplikationen ist schon wichtig. Und das Trennen der Rotation um X und um Y auch... Hab' mal schnell was gemacht, was zumindest einem First-Person-Movement nahe kommt:

```
import javax.swing.JFrame;
import java.applet.*;
import java.awt.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import javax.vecmath.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import java.io.*;
import com.sun.j3d.utils.behaviors.mouse.*;

public class WindowOutput extends JFrame{
    SimpleUniverse simpleUniverse;
    Szene szene;

    Vector3f translation = new Vector3f(0,0,5);
    Transform3D rotationY = new Transform3D();
    Transform3D rotationX = new Transform3D();


    public WindowOutput(Szene szenex) {
        super("Toll");
        szene = szenex;
        setLayout(new BorderLayout());
        setSize(1000,800);

        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(config);
        add("Center", canvas3D);

        simpleUniverse = new SimpleUniverse(canvas3D);

        setVisible(true);
    }

    public void startSzene(){
        simpleUniverse.addBranchGraph(szene.getTheScene());
    }

    //Von der Tastatur aufgerufen
    public void gehenVor(double vektor)
    {
        Vector3f delta = new Vector3f(0,0,(float)vektor);
        rotationY.transform(delta);
        translation.add(delta);
        aktualisieren();
    }
    public void gehenSeitlich(double vektor){
        Vector3f delta = new Vector3f((float)vektor,0,0);
        rotationY.transform(delta);
        translation.add(delta);
        aktualisieren();
    }

    //von der maus aufgerufen
    public void schauX(double angel){
        Transform3D rotaX = new Transform3D();
        rotaX.rotX(((Math.PI/180)*angel)/6);
        rotationX.mul(rotaX, rotationX);
        aktualisieren();
    }
    public void schauY(double angel){
        Transform3D rotaY = new Transform3D();
        rotaY.rotY(((Math.PI/180)*angel)/6);
        rotationY.mul(rotaY, rotationY);
        aktualisieren();
    }
    public void aktualisieren(){
        System.out.println("Rotation\n"+rotationX+"\n"+rotationY);
        System.out.println("Weg      "+translation);
        Transform3D finalTrans = new Transform3D();
        finalTrans.setTranslation(translation);
        finalTrans.mul(rotationX);
        finalTrans.mul(rotationY);

        simpleUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(finalTrans);
    }
}
```


Die wichtigsten Änderungen: 
- Die ganzen überflüssigen Fields rausgeworfen
- Rotation nach X und Y getrennt
- Mutliplikationsreihenfolge bei der Rotation korrigiert
- Translation bezieht sich immer auf die Blickrichtung, d.h. wenn man nach VORNE geht, dann meint man damit das VORNE, das durch die aktuelle Rotation um die Y-Achse bestimmt ist - also wird der bewegungsvektor entsprechend rotiert.

Das ist natürlich noch nicht ganz das gelbe vom Ei, aber... kannst ja mal weiterschauen...


----------



## RichardC (1. Feb 2010)

Ja das ist das Problem bei dem ich schon hing.

Wenn du jetzt einmal um den würfel drumherum läufst, ihn von der Seite anschaust, und mit der Maus nach oben und nach unten schaust.
dann bewegt sich der würfel nach oben und unten. Jedoch ist eigentlich einfach nur ein "nach oben und unten" schauen erwünscht.
verstehst du was ich meine?
Wie kann man das lösen hmm...


----------



## Marco13 (1. Feb 2010)

Hämja... der Würfel bewegt sich nicht. Nie. Egal, was du machst. Vielleicht kommt man dem gewünschten Verhalten näher, wenn man die Zeilen
finalTrans.mul(rotationX);
finalTrans.mul(rotationY);
vertauscht zu
finalTrans.mul(rotationY);
finalTrans.mul(rotationX);

Ansonsten stößt man, wenn man die Maus nicht irgendwie in die Mitte des Bildschirms zwingt, mit dieser Steuerung sowieso schnell an Grenzen - nämlich genau die Grenzen des Fensters


----------



## RichardC (1. Feb 2010)

Marco mein Held!
Es funktioniert! Probleme 1 und 2 sind gelöst^^

Ich versuche mich an Problem Nummer 3 noch einmal selber!

Ich bin dir unendlich dankbar! Du hast mir meine Facharbeit gerettet!
Du bist ein echter Samariter^^


Bitte den Thread noch nicht schliessen! Ich meld mich noch einmal über meinen Fortschritt.
Im moment freu ich mich auf jedenfall schonmal wie ein Keks^^


----------



## RichardC (1. Feb 2010)

Okay
Problem 3 habe ich nun zurückgestellt!
Und ein anderes Problem ist aufgetreten
Jenes Problem bezeichne ich nun als Problem 2b

Wenn sich die Maus aus dem Fenster bewegt hört die bewegung der Blickrichtung auf!
Das schränkt selbstverständlich die Bewegung ein.

Die Lösung wäre den Mauszeiger an einer Position festzuhalten sodass sich man, wie in einem Ego Shooter, unendlich nach rechts und links sehen kann!

Google hat mir gesagt ich soll dazu die Robot Klasse zu verwenden.
Gesagt getan!

Das Problem im moment ist jedoch, dass sich die Blickrichtung nicht bewegt.

Ich bin zu dem Schluss gekommen, dass bei der ausführung von "zen.mouseMove(200,200);" ebenfalls ein MouseEvent erzeugt wird!
Sprich:
Ich bewege die Maus 10 Pixel nach rechts und wenn ich die Maus zurück bewege mit mouseMove() wird eine Event erzeugt, welches automatisch die Maus wieder -10 Pixel nach links bewegt.
So wackelt das Bild nur ein wenig!

Ich habe nun versucht(siehe code) mit dem drücken der Maus ein MouseDragged event zu erzeugen, dass von der Behavior nicht erkannt wird. sodass die Rückbewegung unwirksam wird.

*Wie kann ich nun die Maus festhalten ohne dabei ein Mouse Event zu erzeugen?*

Ich arbeite an dem Problem! 
Aber wenn jemand im Forum eine Lösung parat hat nur zu^^.
Bis später!

Folgende Implementierung:

```
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.event.*;
import java.util.Enumeration;
import  java.awt.Robot;

public class MouseMovedBehavior extends Behavior {
    private TransformGroup targetTG;
    private Transform3D rotation = new Transform3D();
    WindowOutput windowOutput;
        Robot zen;
    int posX=0,posY=0;   
    boolean firstTime = true;
    boolean stop = false;
    
    MouseMovedBehavior(TransformGroup targetTG, WindowOutput windowOutputx) {
        this.targetTG = targetTG;
        windowOutput = windowOutputx;
    }
    
    public void initialize() {
        this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED));
        try{
            zen = new Robot();
          
        }catch(Exception e){}
    }
    
    public void processStimulus(Enumeration criteria) {
        MouseEvent event = (MouseEvent) ((WakeupOnAWTEvent) criteria.nextElement()).getAWTEvent()[0];
        if(!firstTime){

            windowOutput.schauX(-(event.getY()-posY));
            windowOutput.schauY(-(event.getX()-posX));
            System.out.println(""+(-(event.getX()-posX))+", "+(-(event.getY()-posY)));
            zen.mousePress(InputEvent.BUTTON1_MASK);
            zen.mouseMove(200,200);
            zen.mouseRelease(InputEvent.BUTTON1_MASK) ;
        }else{
            zen.mousePress(InputEvent.BUTTON1_MASK);
            zen.mouseMove(200,200);
            zen.mouseRelease(InputEvent.BUTTON1_MASK) ;
            posX=event.getX();
            posY=event.getY();
            firstTime = false;
        }
        this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED));
    }
}
```


----------



## RichardC (3. Feb 2010)

Hi Leute^^ Ich hab Problem 3 gelöst!

Ich habe ein stink normales Behavior programmiert, welches anschlägt wenn eine Kollision stattfindet.

Als ich die View Platform benutzt habe um zu kollidieren konnte ich bei einer Kollision schon durch das Objekt durchgucken! Das war natürlich nicht Sinn der Sache.

Jetzt kommt mein Knaller 
damit die Kollision früher stattfindet hab ich folgendes gemacht:
Ich habe eine Box erstellt, welche die translation der View platform benutzt^^
Somit ist die Box immer um mich rum!
Da die Dreiecke aus denen die Box erstellt ist auf der rückseite Transparent ist sieht der Spieler nichts von der Box die einen umgiebt.

Nun hab ich das Collision event so gestellt, dass es auf die Box reagiert.

Geil oder? Ich kann die größe der Box variieren und hab in jede Himmelsrichtung Kollisionserkennung^^
Lob mich mal wer^^


Nun bitte ich nur noch Hilfe bei Problem 2b^^
Das oben beschriebene Problem mit der Maus


----------



## Marco13 (3. Feb 2010)

Ja, tricky  Das mit der Maus kann ich mir in irgendeiner Mittagspause nochmal ansehen... Könnte ein bißchen frickelig werden, weil man da mit den Threads ein bißchen aufpassen muss, aber ... mal sehen...


----------



## Marco13 (4. Feb 2010)

Hab' mal geguckt - das mit dem "firstTime" ist noch ziemlich hakelig, aber kannst ja mal sehen, wie man das noch verbessern kann

```
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.event.*;
import java.util.Enumeration;
import java.awt.Robot;
import javax.swing.*;

public class MouseMovedBehavior extends Behavior {
    private TransformGroup targetTG;
    private Transform3D rotation = new Transform3D();
    WindowOutput windowOutput;
        Robot zen;
    int posX=0,posY=0;
    boolean firstTime = true;
    boolean stop = false;

    MouseMovedBehavior(TransformGroup targetTG, WindowOutput windowOutputx) {
        this.targetTG = targetTG;
        windowOutput = windowOutputx;
    }

    public void initialize() {
        this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED));
        try{
            zen = new Robot();

        }catch(Exception e){}
    }

    public void processStimulus(Enumeration criteria)
    {
        Object object = criteria.nextElement();
        WakeupOnAWTEvent w = (WakeupOnAWTEvent)object;
        AWTEvent ev = w.getAWTEvent()[0];
        MouseEvent event = (MouseEvent)ev;

        if(firstTime)
        {
            repositionMouse(event);
            firstTime = false;
        }
        else
        {
            windowOutput.schauX(-(event.getY()-posY)/10.0f);
            windowOutput.schauY(-(event.getX()-posX)/10.0f);
            repositionMouse(event);
        }
        this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED));
    }


    private void repositionMouse(MouseEvent event)
    {
        int cx = event.getComponent().getWidth()/2;
        int cy = event.getComponent().getHeight()/2;
        Point p = new Point(cx,cy);
        SwingUtilities.convertPointToScreen(p, event.getComponent());
        zen.mousePress(InputEvent.BUTTON1_MASK);
        zen.mouseMove(p.x, p.y);
        zen.mouseRelease(InputEvent.BUTTON1_MASK);
        posX = cx;
        posY = cy;
    }

}
```


----------



## RichardC (4. Feb 2010)

Ernsthaft? wie machst du das?

Bei mir hat das künstliche MouseDragged nicht geklappt^^

Danke Danke Danke!

Probleme 1-3 sind somit inklusive 2b erledigt^^
Ich bitte um offenlassen des Threads bis das Projekt über die Runden ist! Ich melde mich auf jedenfall nochmal!

Und ich bitte jeden die postings von marco mit danke zu versehen^^
Wenn ich mal was für dich tun kann sag bescheid


----------

