Re: [JAVA3D] Picking Behaviors in Java3D
John- I still have the problem where it cannot find anything. SceneGraphPath[] path = null; path = mPickGroup.pickAll(ray); path.length is equal to zero. Do I have to set any attributes on the group? On the derived shape3d objects? Can Java3D identify an object derived from Shape3D as described below for picking? Does it matter what group I insert the Highlight Behavior into? Thanks, Todd -Original Message- From: Discussion list for Java 3D API [mailto:[EMAIL PROTECTED] Behalf Of John Wright Sent: Saturday, July 09, 2005 7:17 PM To: JAVA3D-INTEREST@JAVA.SUN.COM Subject: Re: [JAVA3D] Picking Behaviors in Java3D Todd, I've found that picking was not reliable unless you do a pickAll and then loop through the scene graph path array returned (to find your closest hit). Clumsy but it works. - John Wright Starfire Research Todd L. Peters wrote: I am new to Java 3D and am having trouble with picking behaviors. The tutorial is not really clear to me and the examples on the web seem to use deprecated methods. I think I have the basic concept correct, but things do not seem to be working out. I have a branchgroup (not the top level group) that has a number of children. These children are all of one class that is derived from Shape3D. The geometry of the object is set to a PointArray with one point. In short, the branchgroup contains a number of points. I pass the branchgroup and the canvas3D object to the following behavior: public class Highlight extends Behavior { private Canvas3D mCanvas; private BranchGroup mPickGroup; private static ColoringAttributes mColoringAttributes; private static Appearance mHighlightAppearance; private int mX,mY; /** Creates a new instance of Highlight */ public Highlight(Canvas3D cv3d, BranchGroup bg) { mCanvas = cv3d; mPickGroup = bg; mColoringAttributes = new ColoringAttributes(); mColoringAttributes.setColor(1.0f, 0.0f, 0.0f); mHighlightAppearance = new Appearance(); mHighlightAppearance.setColoringAttributes(mColoringAttributes); } /** * initialize the Behavior * set initial wakeup condition * called when behavior becomes live */ public void initialize(){ // set initial wakeup condition this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED)); return; } protected void processAWTEvent(AWTEvent e) { MouseEvent evt = (MouseEvent)e; mX = evt.getX(); mY = evt.getY(); return; } // called by Java 3D when appropriate stimulus occurs public void processStimulus(Enumeration criteria){ WakeupCondition cond; AWTEvent event; cond = (WakeupCondition)criteria.nextElement(); event = ((WakeupOnAWTEvent)cond).getAWTEvent()[0]; processAWTEvent(event); PickRay ray = createPickRay(mCanvas, mX, mY); SceneGraphPath path = null; path = mPickGroup.pickClosest(ray); if (path != null) { Shape3D s = (Shape3D)path.getObject(); if (s != null) { s.setAppearance(mHighlightAppearance); } } this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED)); return; } private PickRay createPickRay(Canvas3D canvas, int x, int y) { Point3d eye_pos = new Point3d(); Point3d mouse_pos = new Point3d(); canvas.getCenterEyeInImagePlate(eye_pos); canvas.getPixelLocationInImagePlate(x, y, mouse_pos); Transform3D motion = new Transform3D(); canvas.getImagePlateToVworld(motion); motion.transform(eye_pos); motion.transform(mouse_pos); Vector3d direction = new Vector3d(mouse_pos); direction.sub(eye_pos); return new PickRay(eye_pos, direction); } } It is initialized as such: Highlight mousemoveBehavior = new Highlight(cv, bgNodes); mousemoveBehavior.setSchedulingBounds(new BoundingSphere()); bg.addChild(mousemoveBehavior); Where bgNodes is the aforementioned branchgroup with all the points and bg is the top-level branchgroup. However, the Highlight behavior does not seem to detect any geometry. If I assign the behavior to the top-level branchgroup, it appears to detect other geometry in the scene (although I have trouble following the debugger output). Can anyone help clarify how I should be doing this? Regards, Todd === To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message signoff JAVA3D-INTEREST. For general help, send email to [EMAIL PROTECTED] and include in the body of the message help. === To unsubscribe, send email to [EMAIL PROTECTED
Re: [JAVA3D] Picking Behaviors in Java3D
Todd, You have to set the objects you want to pick as pickable. If they aren't set as pickable they won't trigger a pick. - John Wright Starfire Research Todd L. Peters wrote: John- I still have the problem where it cannot find anything. SceneGraphPath[] path = null; path = mPickGroup.pickAll(ray); path.length is equal to zero. Do I have to set any attributes on the group? On the derived shape3d objects? Can Java3D identify an object derived from Shape3D as described below for picking? Does it matter what group I insert the Highlight Behavior into? Thanks, Todd -Original Message- From: Discussion list for Java 3D API [mailto:[EMAIL PROTECTED] Behalf Of John Wright Sent: Saturday, July 09, 2005 7:17 PM To: JAVA3D-INTEREST@JAVA.SUN.COM Subject: Re: [JAVA3D] Picking Behaviors in Java3D Todd, I've found that picking was not reliable unless you do a pickAll and then loop through the scene graph path array returned (to find your closest hit). Clumsy but it works. - John Wright Starfire Research Todd L. Peters wrote: I am new to Java 3D and am having trouble with picking behaviors. The tutorial is not really clear to me and the examples on the web seem to use deprecated methods. I think I have the basic concept correct, but things do not seem to be working out. I have a branchgroup (not the top level group) that has a number of children. These children are all of one class that is derived from Shape3D. The geometry of the object is set to a PointArray with one point. In short, the branchgroup contains a number of points. I pass the branchgroup and the canvas3D object to the following behavior: public class Highlight extends Behavior { private Canvas3D mCanvas; private BranchGroup mPickGroup; private static ColoringAttributes mColoringAttributes; private static Appearance mHighlightAppearance; private int mX,mY; /** Creates a new instance of Highlight */ public Highlight(Canvas3D cv3d, BranchGroup bg) { mCanvas = cv3d; mPickGroup = bg; mColoringAttributes = new ColoringAttributes(); mColoringAttributes.setColor(1.0f, 0.0f, 0.0f); mHighlightAppearance = new Appearance(); mHighlightAppearance.setColoringAttributes(mColoringAttributes); } /** * initialize the Behavior * set initial wakeup condition * called when behavior becomes live */ public void initialize(){ // set initial wakeup condition this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED)); return; } protected void processAWTEvent(AWTEvent e) { MouseEvent evt = (MouseEvent)e; mX = evt.getX(); mY = evt.getY(); return; } // called by Java 3D when appropriate stimulus occurs public void processStimulus(Enumeration criteria){ WakeupCondition cond; AWTEvent event; cond = (WakeupCondition)criteria.nextElement(); event = ((WakeupOnAWTEvent)cond).getAWTEvent()[0]; processAWTEvent(event); PickRay ray = createPickRay(mCanvas, mX, mY); SceneGraphPath path = null; path = mPickGroup.pickClosest(ray); if (path != null) { Shape3D s = (Shape3D)path.getObject(); if (s != null) { s.setAppearance(mHighlightAppearance); } } this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED)); return; } private PickRay createPickRay(Canvas3D canvas, int x, int y) { Point3d eye_pos = new Point3d(); Point3d mouse_pos = new Point3d(); canvas.getCenterEyeInImagePlate(eye_pos); canvas.getPixelLocationInImagePlate(x, y, mouse_pos); Transform3D motion = new Transform3D(); canvas.getImagePlateToVworld(motion); motion.transform(eye_pos); motion.transform(mouse_pos); Vector3d direction = new Vector3d(mouse_pos); direction.sub(eye_pos); return new PickRay(eye_pos, direction); } } It is initialized as such: Highlight mousemoveBehavior = new Highlight(cv, bgNodes); mousemoveBehavior.setSchedulingBounds(new BoundingSphere()); bg.addChild(mousemoveBehavior); Where bgNodes is the aforementioned branchgroup with all the points and bg is the top-level branchgroup. However, the Highlight behavior does not seem to detect any geometry. If I assign the behavior to the top-level branchgroup, it appears to detect other geometry in the scene (although I have trouble following the debugger output). Can anyone help clarify how I should be doing this? Regards, Todd === To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message signoff JAVA3D-INTEREST. For general help, send email to [EMAIL PROTECTED] and include in the body of the message help. === To unsubscribe
Re: [JAVA3D] Picking Behaviors in Java3D
event; cond = (WakeupCondition)criteria.nextElement(); event = ((WakeupOnAWTEvent)cond).getAWTEvent()[0]; processAWTEvent(event); PickRay ray = createPickRay(mCanvas, mX, mY); SceneGraphPath[] path = null; path = mPickGroup.pickAll(ray); if (path != null) { Shape3D s = (Shape3D)path[0].getObject(); if (s != null) { s.setAppearance(mHighlightAppearance); } } this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED)); return; } private PickRay createPickRay(Canvas3D canvas, int x, int y) { Point3d eye_pos = new Point3d(); Point3d mouse_pos = new Point3d(); canvas.getCenterEyeInImagePlate(eye_pos); canvas.getPixelLocationInImagePlate(x, y, mouse_pos); Transform3D motion = new Transform3D(); canvas.getImagePlateToVworld(motion); motion.transform(eye_pos); motion.transform(mouse_pos); Vector3d direction = new Vector3d(mouse_pos); direction.sub(eye_pos); return new PickRay(eye_pos, direction); } } -Original Message- From: Discussion list for Java 3D API [mailto:[EMAIL PROTECTED] Behalf Of John Wright Sent: Sunday, July 10, 2005 10:34 AM To: JAVA3D-INTEREST@JAVA.SUN.COM Subject: Re: [JAVA3D] Picking Behaviors in Java3D Todd, You have to set the objects you want to pick as pickable. If they aren't set as pickable they won't trigger a pick. - John Wright Starfire Research Todd L. Peters wrote: John- I still have the problem where it cannot find anything. SceneGraphPath[] path = null; path = mPickGroup.pickAll(ray); path.length is equal to zero. Do I have to set any attributes on the group? On the derived shape3d objects? Can Java3D identify an object derived from Shape3D as described below for picking? Does it matter what group I insert the Highlight Behavior into? Thanks, Todd -Original Message- From: Discussion list for Java 3D API [mailto:[EMAIL PROTECTED] Behalf Of John Wright Sent: Saturday, July 09, 2005 7:17 PM To: JAVA3D-INTEREST@JAVA.SUN.COM Subject: Re: [JAVA3D] Picking Behaviors in Java3D Todd, I've found that picking was not reliable unless you do a pickAll and then loop through the scene graph path array returned (to find your closest hit). Clumsy but it works. - John Wright Starfire Research Todd L. Peters wrote: I am new to Java 3D and am having trouble with picking behaviors. The tutorial is not really clear to me and the examples on the web seem to use deprecated methods. I think I have the basic concept correct, but things do not seem to be working out. I have a branchgroup (not the top level group) that has a number of children. These children are all of one class that is derived from Shape3D. The geometry of the object is set to a PointArray with one point. In short, the branchgroup contains a number of points. I pass the branchgroup and the canvas3D object to the following behavior: public class Highlight extends Behavior { private Canvas3D mCanvas; private BranchGroup mPickGroup; private static ColoringAttributes mColoringAttributes; private static Appearance mHighlightAppearance; private int mX,mY; /** Creates a new instance of Highlight */ public Highlight(Canvas3D cv3d, BranchGroup bg) { mCanvas = cv3d; mPickGroup = bg; mColoringAttributes = new ColoringAttributes(); mColoringAttributes.setColor(1.0f, 0.0f, 0.0f); mHighlightAppearance = new Appearance(); mHighlightAppearance.setColoringAttributes(mColoringAttributes); } /** * initialize the Behavior * set initial wakeup condition * called when behavior becomes live */ public void initialize(){ // set initial wakeup condition this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED)); return; } protected void processAWTEvent(AWTEvent e) { MouseEvent evt = (MouseEvent)e; mX = evt.getX(); mY = evt.getY(); return; } // called by Java 3D when appropriate stimulus occurs public void processStimulus(Enumeration criteria){ WakeupCondition cond; AWTEvent event; cond = (WakeupCondition)criteria.nextElement(); event = ((WakeupOnAWTEvent)cond).getAWTEvent()[0]; processAWTEvent(event); PickRay ray = createPickRay(mCanvas, mX, mY); SceneGraphPath path = null; path = mPickGroup.pickClosest(ray); if (path != null) { Shape3D s = (Shape3D)path.getObject(); if (s != null) { s.setAppearance(mHighlightAppearance); } } this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED)); return; } private PickRay createPickRay(Canvas3D canvas, int x, int y) { Point3d eye_pos = new Point3d
Re: [JAVA3D] Picking Behaviors in Java3D
I got it now. Apparently a PickRay is virtually impossible to intersect with a point, the answer is to use a larger pickshape. -Todd === To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message signoff JAVA3D-INTEREST. For general help, send email to [EMAIL PROTECTED] and include in the body of the message help.
Re: [JAVA3D] Picking Behaviors in Java3D
Todd, I'm glad you got it. Yes, a point is extremely hard to intersect with! - John Wright Starfire Research Todd L. Peters wrote: I got it now. Apparently a PickRay is virtually impossible to intersect with a point, the answer is to use a larger pickshape. -Todd === To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message signoff JAVA3D-INTEREST. For general help, send email to [EMAIL PROTECTED] and include in the body of the message help.
Re: [JAVA3D] Picking Behaviors in Java3D
Todd, I've found that picking was not reliable unless you do a pickAll and then loop through the scene graph path array returned (to find your closest hit). Clumsy but it works. - John Wright Starfire Research Todd L. Peters wrote: I am new to Java 3D and am having trouble with picking behaviors. The tutorial is not really clear to me and the examples on the web seem to use deprecated methods. I think I have the basic concept correct, but things do not seem to be working out. I have a branchgroup (not the top level group) that has a number of children. These children are all of one class that is derived from Shape3D. The geometry of the object is set to a PointArray with one point. In short, the branchgroup contains a number of points. I pass the branchgroup and the canvas3D object to the following behavior: public class Highlight extends Behavior { private Canvas3D mCanvas; private BranchGroup mPickGroup; private static ColoringAttributes mColoringAttributes; private static Appearance mHighlightAppearance; private int mX,mY; /** Creates a new instance of Highlight */ public Highlight(Canvas3D cv3d, BranchGroup bg) { mCanvas = cv3d; mPickGroup = bg; mColoringAttributes = new ColoringAttributes(); mColoringAttributes.setColor(1.0f, 0.0f, 0.0f); mHighlightAppearance = new Appearance(); mHighlightAppearance.setColoringAttributes(mColoringAttributes); } /** * initialize the Behavior * set initial wakeup condition * called when behavior becomes live */ public void initialize(){ // set initial wakeup condition this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED)); return; } protected void processAWTEvent(AWTEvent e) { MouseEvent evt = (MouseEvent)e; mX = evt.getX(); mY = evt.getY(); return; } // called by Java 3D when appropriate stimulus occurs public void processStimulus(Enumeration criteria){ WakeupCondition cond; AWTEvent event; cond = (WakeupCondition)criteria.nextElement(); event = ((WakeupOnAWTEvent)cond).getAWTEvent()[0]; processAWTEvent(event); PickRay ray = createPickRay(mCanvas, mX, mY); SceneGraphPath path = null; path = mPickGroup.pickClosest(ray); if (path != null) { Shape3D s = (Shape3D)path.getObject(); if (s != null) { s.setAppearance(mHighlightAppearance); } } this.wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED)); return; } private PickRay createPickRay(Canvas3D canvas, int x, int y) { Point3d eye_pos = new Point3d(); Point3d mouse_pos = new Point3d(); canvas.getCenterEyeInImagePlate(eye_pos); canvas.getPixelLocationInImagePlate(x, y, mouse_pos); Transform3D motion = new Transform3D(); canvas.getImagePlateToVworld(motion); motion.transform(eye_pos); motion.transform(mouse_pos); Vector3d direction = new Vector3d(mouse_pos); direction.sub(eye_pos); return new PickRay(eye_pos, direction); } } It is initialized as such: Highlight mousemoveBehavior = new Highlight(cv, bgNodes); mousemoveBehavior.setSchedulingBounds(new BoundingSphere()); bg.addChild(mousemoveBehavior); Where bgNodes is the aforementioned branchgroup with all the points and bg is the top-level branchgroup. However, the Highlight behavior does not seem to detect any geometry. If I assign the behavior to the top-level branchgroup, it appears to detect other geometry in the scene (although I have trouble following the debugger output). Can anyone help clarify how I should be doing this? Regards, Todd === To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message signoff JAVA3D-INTEREST. For general help, send email to [EMAIL PROTECTED] and include in the body of the message help. === To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message signoff JAVA3D-INTEREST. For general help, send email to [EMAIL PROTECTED] and include in the body of the message help.