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".