# [JAVA 3D] Position des Objektes verändern



## mattn (4. Jun 2010)

Hi, 
ich will einfach die Position eines Würfels per Translation in alle Achsen verschieben...
ich habe bis jetzt nur Beispiele gesehen, wo man nur die Position des viewingPoint ändert.

kann mich da jemand helfen.... bin leider erst frisch dabei im J3D


----------



## truesoul (4. Jun 2010)

Transform3D ist das was du suchst .


```
TransformGroup objekt = new TransformGroup();
Transform3D dreiD = new Transform3D();

dreiD.setTranslation(new Vector3f(0.0f,0.0f,0.0f));

objekt.setTransform(dreiD);
```

wobei bei Vector3f(X-Achse,Y-Achse,Z-Achse) steht.


----------



## mattn (4. Jun 2010)

ja sowas hab ich schon einmal ausprobiert war aber der meinung das sich die position des objektes selbst nicht  ändert sondern nur der view ... ok danke 

mal schaun ob ich das so genaut bekomm, das ich das objekt einfach mit der maus verschieben kann^^


----------



## truesoul (4. Jun 2010)

Wenn du das Objekt mit der Maus bewegen willst gibt es dafür z.B 
	
	
	
	





```
new PickTranslateBehavior()
```


----------



## mattn (4. Jun 2010)

ja schon.. mein eclipse mag das teil nicht ^^ wird durchgestrichen (muss also was "besseres" geben)... deswegen hat ich es schonmal drin aber wieder raus genommen..weil ich es auch noch nicht so richtig hinbekommen habe


----------



## truesoul (4. Jun 2010)

Versuche mal das hiermit: 


```
import com.sun.j3d.utils.picking.behaviors.PickRotateBehavior;
import com.sun.j3d.utils.picking.behaviors.PickTranslateBehavior;
import com.sun.j3d.utils.picking.behaviors.PickZoomBehavior;


....

BranchGroup objWurzel = new BranchGroup();


private TransformGroup erstelleBehaviorsGruppe()
  {       
        TransformGroup Gruppe = new TransformGroup();
        Gruppe.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        Gruppe.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        Gruppe.setCapability(TransformGroup.ENABLE_PICK_REPORTING);

        pickzoom = new PickZoomBehavior(objWurzel, canves3D, new BoundingSphere(new Point3d(), 100));
        pickDreh = new PickRotateBehavior(objWurzel, canves3D, new BoundingSphere(new Point3d(), 100));
        picktrans = new PickTranslateBehavior(objWurzel, canves3D, new BoundingSphere(new Point3d(), 100));
        pickDreh.setTolerance(0f);

        Gruppe.addChild(pickDreh);
        Gruppe.addChild(pickzoom);
        Gruppe.addChild(picktrans);

        return Gruppe;
  }

ObjWurzel.addChild(erstelleBehaviorsGruppe());
```

Damit sollte es klappen.
Wenn du mehrere Objekte hast kannst du jedes für sich bewegen.
Willst du aber das mit setTranslation machen musst Picking verwenden um herauszufinden welches Objekt angewählt wurde , um es dann bewegen zu können.
Aber das ist mal eine andere Geschichte


----------



## mattn (4. Jun 2010)

ok danke schonmal... ich bekomms zwar nicht auf die reihe...bin einfach zu doof -.-
mir fällt der Anfang mit j3d bisschen schwer...???:L

naja zumindest hab ich schonmal ein wenig code von dir, der auch bestimmt funktioniert...

nun muss ich das nur noch auf die reihe bekommen .... kann ja von dir nicht verlagen das du meine 'arbeit' machst ...danke nochmal


----------



## truesoul (4. Jun 2010)

Einfach mal bei Google Michael Pfeiffer j3d eingeben und die pdf downloaden ...
Für Einsteiger sehr verständlich und mit vielen Beispielen und man kann Aktiv den Code testen und verstehen.

Mfg


----------



## mattn (4. Jun 2010)

hab schon etliche pdf´s offen gehabt aber das war noch nicht dabei....
gut ich werd mal das j3d vakuum in meinem kopf füllen ... hoff ich zumindest 

dank dir auf jedenfall für deine hilfe:toll:


----------



## mattn (7. Jun 2010)

ich hab mal nen codefragment hier im forum genommen, angepasst und läuft (find leider den post - für nen richtiges zitat grad nicht) 
jetzt ist nur die  frage ... wie mach ich dir transformation in die z-achse.... weil zoom zoomt ja nur rein.. oder ?!?



> //der BoxTG die Transformationen mit der Maus erlauben
> BoxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
> BoxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
> 
> ...


----------



## truesoul (8. Jun 2010)

Translate bewegt sich auf X-Achse und Y-Achse ( in Negativen sowie Positiven Koordinatenbereich ).
Rotate ist klar ...
Und Zoomen geschieht auf der Z-Achse (rein & raus), siehe KoordinatenSystem java3d.


----------



## mattn (8. Jun 2010)

jap soweit klar...
also beweg ich wirklich das objekt und nicht meinen viewpoint  ..gut gut 
lol ich seh grad ... ich kann überall hinklicken(also auch neben das objekt) und es rotiert transformiert und zoomt trotzdem ... ich denk mal da werd ich wohl doch das picking nutzen müssen... damit die events nur ausgeführt werden wenn ich mit der maus auf dem objekt bin


----------



## mattn (17. Jun 2010)

ok also nen groben fehler hab ich schonmal rausgebügelt....die picktranslate methode war an der falschen stelle ...
mit einen würfel gehts schonmal ^^
ABER...
also ich hab es soweit das ich (aus testzwecken) 500(formatiert) oder auch mehr(ab 501 unformatiert) würfel ausgebe...
nun wollt ich jeden würfel einzeln verschieben... und hier ist der knackpunkt.
wenn ich den würfel anklick und dann verschieben will, verschwindet er einfach...need HELP 


```
//Startwerte für die Generierung der Würfel im festgelegtem Layout(bis 500 Knoten)
                x=(float)-0.5;        
                y=(float)-0.5;        
                n= anzahlWuerfel;                
                //Generierung der Knoten
                for(i=0; i<n; i++){
                        switch(i){
                                case 50:  { y= (float)(y + 0.025);
                                                        x=(float)-0.5;  break;} //x Wert wird für nächste Zeile zurückgesetzt
                                case 100: { y= (float)(y + 0.025);
                                                        x=(float)-0.5;  break;}
                                case 150: { y= (float)(y + 0.025);
                                                        x=(float)-0.5;  break;}
                                case 200: { y= (float)(y + 0.025);
                                                        x=(float)-0.5;  break;}
                                case 250: { y= (float)(y + 0.025);
                                                        x=(float)-0.5;  break;}
                                case 300: { y= (float)(y + 0.025);
                                                        x=(float)-0.5;  break;}
                                case 350: { y= (float)(y + 0.025);
                                                        x=(float)-0.5;  break;}
                                case 400: { y= (float)(y + 0.025);
                                                        x=(float)-0.5;  break;}
                                case 450: { y= (float)(y + 0.025);
                                                        x=(float)-0.5;  break;}
                        }
                       
                        TransformGroup BoxTG = new TransformGroup();
                        Transform3D BoxT3D = new Transform3D();
                       
                        BoxT3D.setTranslation(new Vector3f((float)x,(float)y,0f)); // x und y damit die Knoten als "Feld" ausgegeben werden
                        BoxTG.setTransform(BoxT3D);
                        BoxTG.addChild(new Box(0.01f,0.01f,0.01f, BoxAppearance));
                        x= (float) (x+ 0.025);
                       
                        BoxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                        BoxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
                        BoxTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
                        //PickTranslateBehavior
                        PickTranslateBehavior pickT = new PickTranslateBehavior(rootBG, c, BigBounds);
                        rootBG.addChild(pickT);
                        rootBG.addChild(BoxTG);
                }
```


----------



## Sosososo (18. Jun 2010)

Hast du die Objekt Skaliert(setScale()) ?
Ich vermute mal das das Objekt einfach aus dem Sichtfeld verschwindet weil es beim anklicken zu groß oder zu klein geworden ist.


----------



## mattn (18. Jun 2010)

Sosososo hat gesagt.:


> Hast du die Objekt Skaliert(setScale()) ?
> Ich vermute mal das das Objekt einfach aus dem Sichtfeld verschwindet weil es beim anklicken zu groß oder zu klein geworden ist.



nein ich skaliere nirgendwo
...
so... ich habe mich mal an die sache angenähert....

die würfel verschwinden nicht, sondern bewegen sich mit steigender anzahl immer schneller...also auch schon bei minimaler mausbewegung...
--> die translations "sprünge" werden immer größer
...ich weiß nicht ob man das so versteht wie ich es erklär^^
wenn ich ein objekt verschiebe ändert die translation ja die position...
leider "folgt" das objekt nicht dem mauszeiger, sondern bewegt sich schneller als der zeiger...und das schnellere bewegen wird proportional schneller (oh man was für eine formulierung Laughing) je mehr objekte im universe sind


----------



## truesoul (18. Jun 2010)

Hallo mattn .

So ich habe mal hier ein wenig code für dich .

```
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.behaviors.mouse.MouseBehavior;
import com.sun.j3d.utils.behaviors.mouse.MouseBehaviorCallback;
import com.sun.j3d.utils.behaviors.picking.*;
import javax.media.j3d.*;


public class PickTranslateBehavior extends PickMouseBehavior 
        implements MouseBehaviorCallback
{
    MouseTranslate translate;
    int pickMode = PickObject.USE_BOUNDS;
    private PickingCallback callback = null;
    private TransformGroup currentTG;



    public PickTranslateBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds)
    {
        super (canvas, root, bounds);

        translate = new MouseTranslate(MouseBehavior.MANUAL_WAKEUP);

        //**********************************//
        // Hier stelle ich die geschwindigkeit ein!!!
        // *********************************//
        translate.setFactor(0.01);


        translate.setTransformGroup(currGrp);

        currGrp.addChild(translate);
        translate.setSchedulingBounds(bounds);
        this .setSchedulingBounds(bounds);
    }



    public PickTranslateBehavior(BranchGroup root, Canvas3D canvas,
            Bounds bounds, int pickMode) {
        super (canvas, root, bounds);
        translate = new MouseTranslate(MouseBehavior.MANUAL_WAKEUP);

        translate.setTransformGroup(currGrp);
        currGrp.addChild(translate);
        translate.setSchedulingBounds(bounds);
        this .setSchedulingBounds(bounds);
        this .pickMode = pickMode;
    }



    public void setPickMode(int pickMode) {
        this .pickMode = pickMode;
    }



    public int getPickMode() {
        return pickMode;
    }


    public void updateScene(int xpos, int ypos) {
        TransformGroup tg = null;
        if (!mevent.isAltDown() && mevent.isMetaDown()) {

            tg = (TransformGroup) pickScene.pickNode(pickScene
                    .pickClosest(xpos, ypos, pickMode),
                    PickObject.TRANSFORM_GROUP);

            //Check for valid selection.
            if ((tg != null)
                    && (tg
                            .getCapability(TransformGroup.ALLOW_TRANSFORM_READ))
                    && (tg
                            .getCapability(TransformGroup.ALLOW_TRANSFORM_WRITE))) {

                translate.setTransformGroup(tg);
                translate.wakeup();
                currentTG = tg;
            } else if (callback != null)
                callback
                        .transformChanged(PickingCallback.NO_PICK, null);
        }

    }


    public void transformChanged(int type, Transform3D transform) {
        callback.transformChanged(PickingCallback.TRANSLATE, currentTG);

    }


    public void setupCallback(PickingCallback callback) {
        this.callback = callback;
        if (callback == null)
            translate.setupCallback(null);
        else
            translate.setupCallback(this);
    }

}
```

In Zeile 27 habe ich jetzt sozusagen die Geschwindigkeit eingestellt , wobei es nicht Wörtlich die Geschwindigkeit ist 
Entweder übernimmst du die Klasse .(imports beachten) 
Oder machst dir gedanken wie man es anders lösen kann 

Mfg


----------



## TulPe (15. Dez 2015)

*Anmerkung von Moderator: *
Beitrag gelöscht da dieser in einen eigenen Thread gehört -> http://www.java-forum.org/thema/wuerfel-per-mausklick-rotieren.170951/


----------

