I'm trying to find out whether and where a line segment and a Shape3D
intersect using PickTool. However, i get null back instead of a PickResult
every time. I've tried just about every capability i can think of on both
the Shape3D and any Group nodes and have also tried the
PickTool.setCapabilities(node, PickTool.INTERSECT_FULL) and setPickable
(true). I've been messing around with this for 3 days now - any help would
be very appreciated. I've listed my code below.
Thanks, Jurg
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.GraphicsConfiguration;
import com.sun.j3d.utils.picking.*;
import javax.swing.*;
import java.awt.*;
class DrawPanel extends JPanel
{
BranchGroup scene;
DrawPanel()
{
setBackground(Color.WHITE);
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);
scene = createSceneGraph();
SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
}
public BranchGroup createSceneGraph()
{
BranchGroup objRoot = new BranchGroup();
Appearance a = new Appearance();
a.setColoringAttributes(new ColoringAttributes
(0.7f,0.9f,0.9f,ColoringAttributes.FASTEST));
Cylinder c = new Cylinder(0.1f,0.8f, Cylinder.GENERATE_NORMALS |
Cylinder.ENABLE_GEOMETRY_PICKING,a);
//I only want a tube, but can't be bothered to write my own class
Shape3D sh = new Shape3D(c.getShape(Cylinder.BODY).getGeometry(),a);
sh.setBoundsAutoCompute(true);
PickTool.setCapabilities(sh,PickTool.INTERSECT_FULL);
objRoot.addChild(sh);
objRoot.setCapability(Node.ENABLE_PICK_REPORTING);
return objRoot;
}
//Call this after the scene has been made visible (i don't know if this
is actually necessary)
public void intersects()
{
PickTool pt = new PickTool(scene);
pt.setMode(PickTool.GEOMETRY);
pt.setShapeSegment(new Point3d(0,0.04,0.3),new Point3d(0,0.04,-0.3));
PickResult pr = pt.pickAny();
if (pr == null)
System.out.println("Nothing intersects "+pr);
else
System.out.println("Found an intersection "+pr);
}
}
public class L3D extends JApplet
{
public static void main(String[] args)
{
JFrame f = new JFrame("Intersect Test");
DrawPanel dp = new DrawPanel();
f.getContentPane().add(dp);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setSize(600,400);
f.setVisible(true);
//Check if the line segment intersects the tube
dp.intersects();
}
}
===========================================================================
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".