# Java3D Picking - falsche Objekte werden gepickt



## mattn (11. Aug 2010)

ich weiß einfach nicht mehr weiter....
ich verbinde (in dem fall) 3 würfel mit 2 linien... soweit sogut...

jetzt kann man linien loder würfel löschen ... ok

nur das problem ist folgendes .. ich will den würfel löschen, der mit 2 andern verbunden ist...
so..java pickt aber nicht den würfel, sondern eine linie obwohl ich auf den würfel klicke....

habe schon stunden debuggt...und finde den fehler einfach nicht... ;( bin schon voll am verzweifeln

da die jar´s zu groß für den anhang hier sind .... gibts die hier

außderdem löst der manchmal das picking 2mal aus... obwohl ich nur 1mal kick:autsch:

ich wär echt über jede hilfe dankbar...


----------



## Marco13 (12. Aug 2010)

Ohne zu viel Hoffnung machen zu wollen, dass ich da helfen kann: com.eigeneimports.PickTranslateBehavior scheint zu fehlen...


----------



## mattn (12. Aug 2010)

hi marco... danke das du helfen willst...
ich hab mich jetzt nochmal mit nen kumpel zusammengesetzt und haben uns mit dem problem zusammen beschäftigt...
das hat in sofern geholfen, das er dinge sieht, die ich nicht sehe(sofort)... da ich sie selber geschrieben habe und schneller *über sie weg" gehe....

folgendes vorläufiges ergebnis...

wir haben die knoten größer gemacht...somit trit das "falsche" picken nicht mehr auf... hoffendlich bleibt es dabei....
das mehrfache picken trat auf, weil der ich ausversehen beim aufrufen einer methode immer noch ein mouselistener an das canvas gehefet habe.ist also weg....


aber ein problem ...bzw 2 habe ich noch...wobei das 2. nix mit picking zu tun hat ...deswegen lass ich das in diesem thema unangetastet..(es seidenn du hast soviel lust mir da auch zu helfen - geht ums shading-bzw ausleuchten)

wenn ich die szene mit dem orbitbehavior drehe(bzw ich bewege meine viewpoint) und dannach in den modus manipulieren geheum die objekte zu verschieben...

picktranslate verschiebt ja in x und y und das zoom in z achse ...
mit den orbitbehav. änder ich nur meinen viewpoint und die achsen "bleiben stehen " 

so wenn ich jetzt zb. um 90° nach links rotier und dann das objekt auf der zachse verschieben will ...verschiebt es sich aus meinen jetzigen blickpunkt nach links also in die richtung -x ....

gibts es die möglichkeit das ich z.b. die achsen mit rotieren lassen.....oder was anderes damit unabhänig wie mein blickpunkt ist ... mit dem zoombehav nach"vorn und hinten" und mit den translatebehav. nach "links und rechts" verschieben kann.....

ich pack nochmal(hoffentlich komplett ) in den anhang


----------



## Marco13 (12. Aug 2010)

Ich glaube das ist gar nicht so leicht. Ich habe aber schon ewig nichts mehr mit Java3D gemacht. Es ist gut möglich, dass es irgendwo das magische "someBahavior.setMoveInViewCoordinates(true)" gibt, und ich es einfach nicht kenne. 

Ich habe gerade mal kurz rumprobiert:
- Die MouseTranslate-Classe (aus dem J3D source code) zusätzlich zum ohnehin schon handgestrickten "PickTranslateBehavior" dazuzupacken
- Der irgendwie das SimpleUniverse bzw. die ViewPlatformTransform zukommen lassen
- Bei der Berechnung der Bewegung die ViewPlatformTransform mit einbeziehen. 
Ganz konkret habe ich unter der Zeile
[c]transformGroup.getTransform(currXform);[/c]
aus der MouseTranslate sowas eingefügt wie

```
translation.x = dx*x_factor;
        translation.y = -dy*y_factor;
        translation.z = 0;

        TransformGroup xxxx = u.getViewingPlatform().getViewPlatformTransform();
        Transform3D x = new Transform3D();
        xxxx.getTransform(x);
        x.invert();
        x.transform(translation);

        transformX.set(translation);
```
und das ist schon nicht _ganz_ falsch, aber funktioniert nicht 100% und ist ein bißchen hakelig und sehr frickelig, und FALLS das tatsächlich genau in dieser Form notwendig sein SOLLTE (was ich mir kaum vorstellen kann) wäre es ein übelst-krampfiger Workaround. Jemand, der etwas fitter mit Java3D ist könnte sich da bestimmt einen geeigneteren Ansatz ausdenken. Vielleicht wäre es sogar am (deutlich) einfachsten, nicht die "PickTranslateBehavior" zu verwenden (die diese Funktionalität eben offenbar einfach _nicht vorsieht_), sondern das ganze praktisch mit einem MouseListener selbst zu machen.

In jedem Fall wird man sich in irgendeiner Form die ViewPlatformTransform holen müssen, die invertieren, und dann die untransformierte Bewegung (im obigen Fall aus der MouseTranslate eben die "translation") mit dieser invertierten ViewPlatformTransform transformieren und als Bewegung auf das Objekt anwenden. Aber nochmal: So wie das oben angedeutet ist, ist das sicher nicht die beste (aber vielleicht die schlechteste  ) Lösung. Vielleicht gibt's das ganze schon irgendwo fertig.


----------

