Another solution, which isn't dependent on scene graph depth, width, or
anything else about it, would be to create an "Object" (java.lang.Object,
that is) and the instance to all nodes (using setUserData method) you want
to your particular picking behavior to be able to operate on.

Pass the object instance to the behavior as a parameter as well, and in the
behavior retrieve it with the Node.getUserData method.  If it's NULL or not
equal to the correct Object instance, abort the behavior operation on that
Node or Pick for the next.

You can also create a subclass of java.lang.object and put useful data
inside (pointing to other scenegraph TransformNodes, for example) then in
the behavior verify the Node references an instance of your class using the
instanceof operator.  If it passes, then it's safe to go ahead and cast it
and access any of the additional TransformNode references.

The get/setUserData features really opens the door and allows a tremendous
amout of programming flexibility!

best of luck,

Jake
University of Washington Computer Science

----------
From: Benjamin Nill <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Subject: [java3d] Re: [Java3D] Picking in a subtree
Date: Wednesday, March 10, 1999 1:13 PM

Hello!

I also had the same problem, and I have found out, that the
problem is the following command in the method "updateScene" of
PickTranslateBehavior (At least I think this is the explanation):

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

"PickScene.pickClosest(xpos,ypos,pickMode)" returns a
ScenePathGraph consisting of all nodes with the
capability "ENABLE_PICK_REPORTING" on the path between
the picked object and the locale.
And "pickNode(...,PickObject.TRANSFORM_GROUP)"
returns the FIRST TransformGroup on this path beginning
from the locale.

That means, that if you pick the sphere in your example code, you always
affect tg1, (and thereby also the cube), because it is the first pickable
TransformGroup in the picked path.

I don�t know, what the best way to solve this problem is, but
my solution was the following:

You create a new behavior by copying "PickTranslateBehavior.java"
in another file, maybe called "SpecialBehavior.java", and changing
all occurencies of "PickTranslateBehavior" into "SpecialBehavior".
Then all you have to do, is to change the above code into the following:

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

This does always get the SECOND node in the picked path.
That would be tg2, as wanted.
Look in the description of "PickNode" in "PickObject".

I hope this works.

Bye,
Benjamin Nill
[EMAIL PROTECTED]

-------------
Peter Steiger wrote:
> 
> Hello!
> 
> I have a TransformGroup A which has a PickRotateBehavior to rotate
> all the children of this group. This works fine.
> 
> One child is another TransformGroup B, where I added a
> PickTranslateBehavior, to be able to translate all the children
> of B.
> 
> Unfortunately also A is translated, when I pick an object
> of B, instead of translating *only* the objects of B.
> 
> So why does this PickTranslateBehavior change the TransformGroup A
> and not B?
> 
> Any help is very appreciated!
> 
> Thanx in advance
> 
> Peter
> 
> PS: Here's the important part of the code:
> 
> // ----------------------------------------------------------
>      BranchGroup branchGroup = new BranchGroup();
> 
>      TransformGroup tg1 = new TransformGroup();
>       tg1.setCapability(Node.ENABLE_PICK_REPORTING);
>       tg1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
>       tg1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
>      branchGroup.addChild(tg1);
> 
>      // a 1x1x1 cube (only edges are drawn)
>      tg1.addChild((new CoordinateBox()).getChild());
> 
>      BranchGroup bg1 = new BranchGroup();
>      tg1.addChild(bg1);
> 
>      TransformGroup tg2 = new TransformGroup();
>       tg2.setCapability(Node.ENABLE_PICK_REPORTING);
>       tg2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
>       tg2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
>      bg1.addChild(tg2);
> 
>      tg2.addChild((new Sphere(0.1f, app)));
> 
>      PickTranslateBehavior mt =
>          new PickTranslateBehavior(bg1,
>              canvas,
>              new BoundingSphere(new Point3d(1.0, 1.0, 1.0), 0,1),
>              PickObject.USE_BOUNDS);
> 
>      bg1.addChild(mt);
> 
>      PickRotateBehavior br =
>          new PickRotateBehavior(branchGroup,
>              canvas,
>              new BoundingSphere(new Point3d(0.5, 0.5, 0.5), 0.7),
>              PickObject.USE_BOUNDS);
> 
>      branchGroup.addChild(br);
> 
>      branchGroup.compile();
> // ----------------------------------------------------------
> 
> =====================================================================
> To subscribe/unsubscribe, send mail to [EMAIL PROTECTED]
> Java 3D Home Page: http://java.sun.com/products/java-media/3D/


�����������������������
To subscribe/unsubscribe, send mail to [EMAIL PROTECTED]
Java 3D Home Page: http://java.sun.com/products/java-media/3D/
----------

�����������������������
To subscribe/unsubscribe, send mail to [EMAIL PROTECTED]
Java 3D Home Page: http://java.sun.com/products/java-media/3D/

Reply via email to