Hi,

I have 2 polygons, each uses GeometryInfo to generate its indexedGeometryArray. A 
BranchGroup is created to add both Shape3D objects into it.  There are some problems: 
(please see my code attached, you can try)

1. if I just add either of the 2 Shape3D objects into the BranchGroup, the bounding 
center is just the same as I add all of them into the group,  so I guess the Java3D 
class calculate the bounding center using all of the vertices instead of only the 
vertices the Geometry object refers to.

2. when I just add one of the polygons into the group, the picking for this polygon is 
correct, but if I add both of them into the group, the picking for the first one is 
not correct, the second one is correct.

3. Even when I just add one polygon into the group, if I use 
PickCanvas.setShape(PickPoint, startPoint) before I use pickAllSorted(). I got a 
Runtime exception: java.lang.RuntimeException: PointArray0

Could you please try my code? Did I have sth wrong or else? Thank you very much!

white


/*
 * PickAllTest.java
 *
 * Created on July 23, 2002, 10:15 AM
 */

/**
 *
 * @author
 */
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.picking.PickTool;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import java.awt.*;

public class PickAllTest extends javax.swing.JFrame {

    /** Creates new form PickAllTest */
    public PickAllTest() {
        initComponents();
        initGraphics();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        pack();
        java.awt.Dimension screenSize = 
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setSize(new java.awt.Dimension(640, 480));
        setLocation((screenSize.width-640)/2,(screenSize.height-480)/2);
    }

    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    private void initGraphics(){
        GraphicsConfiguration config =
            SimpleUniverse.getPreferredConfiguration();

        canvas = new Canvas3D(config);
        u = new SimpleUniverse(canvas);

        imagePanel = new javax.swing.JPanel(new java.awt.BorderLayout());
        getContentPane().add(imagePanel, java.awt.BorderLayout.CENTER);

        imagePanel.add(canvas, java.awt.BorderLayout.CENTER);

        BranchGroup scene = createSceneGraph();


        ViewingPlatform viewingPlatform = u.getViewingPlatform();
        Transform3D t = new Transform3D();
        Point3d cp = new Point3d();
        bounds.getCenter(cp);
        System.out.println("The bounding center is "+cp.x+", "+cp.y+", "+cp.z);

        t.set(new Vector3d(cp.x, cp.y, cp.z+2.5*bounds.getRadius()));
        (viewingPlatform.getViewPlatformTransform()).setTransform(t);

        u.addBranchGraph(scene);


        imagePanel.updateUI();
    }

    private BranchGroup createSceneGraph(){
        double vertices[] = {-2,-1,0,  -1,-2,0,  0,-1,0,  0,1,0,  -2,1,0,  2,-1,-1,  
2,1,0};

        Shape3D part1 = new Shape3D();
        int []part1Index = {0, 1, 2, 3, 4};
        int []stripCounts1 = new int[1];
        int []stripCounts2 = new int[1];

        stripCounts1[0] = part1Index.length;

        GeometryInfo gi1 = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
        gi1.setCoordinates(vertices);
        gi1.setCoordinateIndices(part1Index);
        gi1.setStripCounts(stripCounts1);


        Stripifier st1 = new Stripifier();
        st1.stripify(gi1);

        IndexedGeometryArray ga1 = gi1.getIndexedGeometryArray();
        ga1.setUserData("left polygon");

        part1.setGeometry(ga1);

        Appearance myApp1 = new Appearance();
        ColoringAttributes colorAttr1 = new ColoringAttributes(0.5f, 0.4f, 0.0f, 
ColoringAttributes.SHADE_GOURAUD);

        myApp1.setColoringAttributes(colorAttr1);
        part1.setAppearance(myApp1);
        part1.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
        part1.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
        part1.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
        PickTool.setCapabilities(part1, PickTool.INTERSECT_FULL);



        Shape3D part2 = new Shape3D();
        int []part2Index = {2, 5, 6, 3};

        GeometryInfo gi2 = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
        gi2.setCoordinates(vertices);
        gi2.setCoordinateIndices(part2Index);
        stripCounts2[0] = part2Index.length;
        gi2.setStripCounts(stripCounts2);


        Stripifier st2 = new Stripifier();
        st2.stripify(gi2);

        IndexedGeometryArray ga2 = gi2.getIndexedGeometryArray();
        ga2.setUserData("right polygon");
        part2.setGeometry(ga2);

        Appearance myApp2 = new Appearance();
        ColoringAttributes colorAttr2 = new ColoringAttributes(0.2f, 0.7f, 0.0f, 
ColoringAttributes.SHADE_GOURAUD);

        myApp2.setColoringAttributes(colorAttr2);
        part2.setAppearance(myApp2);
        part2.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
        part2.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
        part2.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
        PickTool.setCapabilities(part2, PickTool.INTERSECT_FULL);

        BranchGroup group = new BranchGroup();

        //Here is the interesting thing, try to comment out one of them or change the 
order of them
        //group.addChild(part2);
        group.addChild(part1);

        bounds = new BoundingSphere(group.getBounds());
        PickAllMouseBehavior pick = new PickAllMouseBehavior(group, canvas, bounds);
        pick.setEnable(true);
        group.addChild(pick);

        group.compile();

        return group;
    }


    public static void main(String args[]) {
        new PickAllTest().show();
    }


    // Variables declaration - do not modify
    // End of variables declaration

    private BoundingSphere bounds;
    private SimpleUniverse u;
    private Canvas3D canvas;
    private javax.swing.JPanel imagePanel;
}


/*
 * PickAllMouseBehavior.java
 *
 * Created on July 23, 2002, 1:26 PM
 */

/**
 *
 * @author
 * @version
 */
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.picking.behaviors.PickMouseBehavior;
import com.sun.j3d.utils.picking.PickResult;
import com.sun.j3d.utils.picking.PickIntersection;

public class PickAllMouseBehavior extends PickMouseBehavior {

    /** Creates new PickAllMouseBehavior */
    public PickAllMouseBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds) {
        super(canvas, root, bounds);
        this.setSchedulingBounds(bounds);
    }

    public void updateScene(int xpos, int ypos) {
        if (!mevent.isMetaDown() && !mevent.isAltDown()){

            pickCanvas.setShapeLocation(xpos, ypos);
            PickResult pr = pickCanvas.pickClosest();

            if(pr != null ){
                GeometryArray g = pr.getGeometryArray();
                String str = (String)(g.getUserData());
                if(str != null)
                    System.out.println("This is the \""+str+"\" part!");

                  if(pr.numIntersections() > 0){
                    PickIntersection pi = pr.getIntersection(0);
                    if(pi != null){
                        Point3d localPt = pi.getClosestVertexCoordinates();
                        PickPoint pp = new PickPoint(localPt);
                        pickCanvas.setShape(pp, localPt);
                    }

                    PickResult[] pra = pickCanvas.pickAllSorted();
                    if(pra == null)
                        return;

                    System.out.println("The number of GeometryArrays picked is: 
"+pra.length);

                    GeometryArray[]  ga = new GeometryArray[pra.length];

                }
            }
        }

    }

}

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