Yes, I've done that.  I'm including a sample program that is as simple as
humanly possible.  The two files can be compiled and run.

My problems seem to be twofold:

#1.  Java is not picking the point, or the Shape3D with the point in it.
Does something additional need to be defined here, like a bounding area or
something?

#2.  If I replace the Shape3D (with the point assigned to it's geometry)
with something like a Sphere, it will pick the sphere.  However, I then
cannot change the appearance of the sphere becuase I get a capabilitynotset
exception (or something along those lines) even though I have tried to
address the issue by using setCapability(Shape3D.ALLOW_APPEARANCE_WRITE).
Shouldn't I then be able to change the appearance attribute with
setAppearanace(Appearance) when the scenegraph is live?  Does this have to
do with my casting of the SceneGraphPath.getObject() as a (Shape3D)??

I am really stumped here.

Thanks again,
Todd


/*
 * Main.java
 *
 * Created on July 10, 2005, 12:38 PM
 */

package picktest;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.AWTEvent;
import java.util.Enumeration;


//   HelloJava3Da renders a single, rotating cube.

public class pickTest extends Applet {
    public pickTest() {
        setLayout(new BorderLayout());
        GraphicsConfiguration config =
           SimpleUniverse.getPreferredConfiguration();

        Canvas3D canvas3D = new Canvas3D(config);
        add("Center", canvas3D);

        BranchGroup scene = createSceneGraph();

        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

        // This will move the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();

        Highlight mousemoveBehavior = new Highlight(canvas3D, scene);
        mousemoveBehavior.setSchedulingBounds(new BoundingSphere());
        scene.addChild(mousemoveBehavior);
        scene.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);

        simpleU.addBranchGraph(scene);


    }

     public BranchGroup createSceneGraph() {

        BranchGroup group = new BranchGroup();


        //create a sphere
        Point3d p = new Point3d(0.0,0.0,0.0);
        PointArray pa = new PointArray(1, PointArray.COORDINATES);
        pa.setCoordinate(0, p);

        PointAttributes patt = new PointAttributes(5, false);
        Appearance app = new Appearance();
        app.setPointAttributes(patt);

        Shape3D s = new Shape3D();

        // set the geometry and standard appearance
        s.setGeometry(pa);
        s.setAppearance(app);
        s.setPickable(true);
        s.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);

        group.addChild(s);

        return group;
    }

    //  The following allows this to be run as an application
    //  as well as an applet

    public static void main(String[] args) {
        Frame frame = new MainFrame(new pickTest(), 256, 256);
    }

}


/*
 * Highlight.java
 *
 * Created on July 10, 2005, 12:40 PM
 */

package picktest;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.AWTEvent;
import java.util.Enumeration;

/**
 *
 * @author Todd L. Peters
 */
public class Highlight extends Behavior {

   private Canvas3D mCanvas;
   private BranchGroup mPickGroup;
   private ColoringAttributes mColoringAttributes;
   private 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.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();
>>        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".
>
>
===========================================================================
> 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".

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

Reply via email to