I created the line shapes using some geometry arrays.
PickIntersection class (java3d 1.2 beta2) works OK for LineArray
and IndexedLineArray. I've got some problem trying to
intersect a shape based on LineStripArray or IndexedLineStripArray :
null value of
PickIntersection object.
There is a case:
//******************************************************
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import com.sun.j3d.utils.applet.MainFrame;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.keyboard.*;
import com.sun.j3d.utils.picking.PickCanvas;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.picking.PickResult;
import com.sun.j3d.utils.picking.PickIntersection;
import com.sun.j3d.utils.picking.PickTool;
public class PickDemo extends Applet implements MouseListener,
ActionListener {
JRadioButton rbLine;
JRadioButton rbIndexedLine;
JRadioButton rbStripLine;
JRadioButton rbIndexedStripLine;
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),
1000.0);
PickCanvas pickCanvas;
Appearance appHighlight;
Appearance appOrig;
Shape3D [] shapes;
BranchGroup objRoot; BranchGroup scene;
public PickDemo() {
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center", c);
c.addMouseListener(this);
rbLine = new JRadioButton("LineArray");
rbIndexedLine = new JRadioButton("IndexedLineArray");
rbStripLine = new JRadioButton("LineStripArray");
rbIndexedStripLine = new JRadioButton("IndexedLineStripArray");
rbLine.addActionListener (this);
rbIndexedLine.addActionListener (this);
rbStripLine.addActionListener (this);
rbIndexedStripLine.addActionListener (this);
JPanel radioPanel = new JPanel(new GridLayout(1,4));
radioPanel.add(rbLine);
radioPanel.add(rbIndexedLine);
radioPanel.add(rbStripLine);
radioPanel.add(rbIndexedStripLine);
add("North", radioPanel);
ButtonGroup rbGroup = new ButtonGroup();
rbGroup.add(rbLine);
rbGroup.add(rbIndexedLine);
rbGroup.add(rbStripLine);
rbGroup.add(rbIndexedStripLine);
appOrig = new Appearance ();
PolygonAttributes pa = new PolygonAttributes();
pa.setCullFace(PolygonAttributes.CULL_NONE);
appOrig.setPolygonAttributes(pa);
appHighlight = new Appearance ();
Color3f color2 = new Color3f (0.0f, 0.9f, 0f);
Material mat2 = new Material (color2, color2, color2, color2, 0f);
mat2.setLightingEnable(true);
appHighlight.setMaterial( mat2 );
Color3f color1 = new Color3f (0.9f, 0f, 0f);
Material mat1 = new Material (color1, color1, color1, color1, 0f);
appOrig.setMaterial( mat1 );
objRoot = new BranchGroup ();
objRoot.setCapability (Group.ALLOW_CHILDREN_WRITE);
objRoot.setCapability (Group.ALLOW_CHILDREN_EXTEND);
objRoot.setCapability (Group.ALLOW_CHILDREN_READ);
objRoot.setCapability (BranchGroup.ALLOW_DETACH);
scene = new BranchGroup ();
scene.setCapability (Group.ALLOW_CHILDREN_WRITE);
scene.setCapability (Group.ALLOW_CHILDREN_EXTEND);
scene.addChild(objRoot);
SimpleUniverse u = new SimpleUniverse(c);
TransformGroup vpTrans =
u.getViewingPlatform().getViewPlatformTransform();
KeyNavigatorBehavior keybehavior = new KeyNavigatorBehavior
(vpTrans);
keybehavior.setSchedulingBounds (bounds);
scene.addChild (keybehavior);
u.addBranchGraph(scene);
pickCanvas = new PickCanvas(c, scene);
pickCanvas.setTolerance(4.0f);
shapes = new Shape3D [SHAPECOUNT];
}
public void actionPerformed(ActionEvent evt) {
Transform3D t3 = new Transform3D ();
if (objRoot.numChildren() > 0) {
objRoot.detach();
objRoot = new BranchGroup ();
objRoot.setCapability (Group.ALLOW_CHILDREN_EXTEND);
objRoot.setCapability (Group.ALLOW_CHILDREN_READ);
objRoot.setCapability (BranchGroup.ALLOW_DETACH);
scene.addChild(objRoot);
}
if (evt.getSource() == rbLine) {
System.out.println ("LineArray");
for (int i = 0; i < shapes.length; i++) {
t3.setTranslation (new Vector3d(0.0, i*1.0, -(i + 10.)*3.0));
TransformGroup objTrans = new TransformGroup(t3);
BranchGroup objBGroup = new BranchGroup ();
objBGroup.setCapability(BranchGroup.ALLOW_DETACH);
Shape3D shape = new Line ();
shape.setAppearance(appOrig);
shapes [i] = shape;
objTrans.addChild(shape);
objBGroup.addChild (objTrans);
objRoot.addChild(objBGroup);
}
}
else if (evt.getSource() == rbIndexedLine) {
System.out.println ("IndexedLineArray");
for (int i = 0; i < shapes.length; i++) {
t3.setTranslation (new Vector3d(0.0, i*1.0, -(i + 10.)*3.0));
TransformGroup objTrans = new TransformGroup(t3);
BranchGroup objBGroup = new BranchGroup ();
objBGroup.setCapability(BranchGroup.ALLOW_DETACH);
Shape3D shape = new IndexedLine ();
shape.setAppearance(appOrig);
shapes [i] = shape;
objTrans.addChild(shape);
objBGroup.addChild (objTrans);
objRoot.addChild(objBGroup);
}
}
else if (evt.getSource() == rbStripLine) {
System.out.println ("LineStripArray");
for (int i = 0; i < shapes.length; i++) {
t3.setTranslation (new Vector3d(0.0, i*1.0, -(i + 10.)*3.0));
TransformGroup objTrans = new TransformGroup(t3);
BranchGroup objBGroup = new BranchGroup ();
objBGroup.setCapability(BranchGroup.ALLOW_DETACH);
Shape3D shape = new StripLine ();
shape.setAppearance(appOrig);
shapes [i] = shape;
objTrans.addChild(shape);
objBGroup.addChild (objTrans);
objRoot.addChild(objBGroup);
}
}
else if (evt.getSource() == rbIndexedStripLine) {
System.out.println ("IndexedLineStripArray");
for (int i = 0; i < shapes.length; i++) {
t3.setTranslation (new Vector3d(0.0, i*1.0, -(i + 10.)*3.0));
TransformGroup objTrans = new TransformGroup(t3);
BranchGroup objBGroup = new BranchGroup ();
objBGroup.setCapability(BranchGroup.ALLOW_DETACH);
Shape3D shape = new IndexedStripLine ();
shape.setAppearance(appOrig);
shapes [i] = shape;
objTrans.addChild(shape);
objBGroup.addChild (objTrans);
objRoot.addChild(objBGroup);
}
}
}
public void mouseClicked (MouseEvent evt) {
}
public void mouseEntered (MouseEvent evt) {
}
public void mouseExited (MouseEvent evt) {
}
public void mousePressed (MouseEvent evt) {
Point3d eyePos = pickCanvas.getStartPosition ();
pickCanvas.setShapeLocation(evt);
PickResult[] results = pickCanvas.pickAllSorted();
eyePos = pickCanvas.getStartPosition ();
if (results != null) {
int n = results.length;
for (int k = 0; k < n; k++) {
Shape3D pickedShape = (Shape3D)results[k].getObject();
Geometry curGeom = pickedShape.getGeometry();
System.out.println (curGeom.toString());
PickIntersection pi = results [k].getClosestIntersection
(eyePos);
if (pi != null) {
double dist = pi.getDistance();
System.out.println ("dist=" + dist);
pickedShape.setAppearance(appHighlight);
}
else System.out.println ("PickIntersection object is null");
}
}
else System.out.println ("results == null");
}
public void mouseReleased (MouseEvent evt) {
for (int i=0; i < SHAPECOUNT; i++) {
shapes [i].setAppearance(appOrig);
}
}
public static void main(String[] args) {
String s = "\nPickIntersection Test:\n";
s += "Select the type of array and pick with the mouse over the
line\n";
System.out.println (s);
new MainFrame(new PickDemo (), 640, 640);
}
public class Line extends Shape3D {
public Line () {
LineArray mesh;
Point3f[] coordinates = new Point3f[2];
coordinates [0] = new Point3f (-1f, 1f, 0f);
coordinates [1] = new Point3f (1f, 1f, 0f);
mesh = new LineArray (2, GeometryArray.COORDINATES |
GeometryArray.NORMALS);
mesh.setCapability(GeometryArray.ALLOW_COORDINATE_WRITE);
mesh.setCapability(GeometryArray.ALLOW_COORDINATE_READ);
mesh.setCapability(GeometryArray.ALLOW_COUNT_READ);
mesh.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
mesh.setCoordinates(0, coordinates);
this.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
this.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
this.setGeometry(mesh);
}
}
public class IndexedStripLine extends Shape3D {
public IndexedStripLine () {
Point3f[] coordinates = new Point3f[2];
coordinates [0] = new Point3f (-1f, 1f, 0f);
coordinates [1] = new Point3f (1f, 1f, 0f);
int[] indices = { 0, 1};
int[] lineStripCounts = {2};
IndexedLineStripArray mesh = new IndexedLineStripArray(
coordinates.length, GeometryArray.COORDINATES |
GeometryArray.NORMALS, indices.length, lineStripCounts);
mesh.setCoordinates(0, coordinates);
mesh.setCoordinateIndices(0, indices);
mesh.setCapability(GeometryArray.ALLOW_COORDINATE_WRITE);
mesh.setCapability(GeometryArray.ALLOW_COORDINATE_READ);
mesh.setCapability(GeometryArray.ALLOW_COUNT_READ);
mesh.setCapability(IndexedGeometryArray.ALLOW_COORDINATE_INDEX_READ);
mesh.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
mesh.setCoordinates(0, coordinates);
this.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
this.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
this.setGeometry(mesh);
}
}
public class IndexedLine extends Shape3D {
public IndexedLine () {
Point3f[] coordinates = new Point3f[2];
coordinates [0] = new Point3f (-1f, 1f, 0f);
coordinates [1] = new Point3f (1f, 1f, 0f);
int[] indices = { 0, 1};
IndexedLineArray mesh = new IndexedLineArray(
coordinates.length, GeometryArray.COORDINATES |
GeometryArray.NORMALS, indices.length);
mesh.setCoordinates(0, coordinates);
mesh.setCoordinateIndices(0, indices);
mesh.setCapability(GeometryArray.ALLOW_COORDINATE_WRITE);
mesh.setCapability(GeometryArray.ALLOW_COORDINATE_READ);
mesh.setCapability(GeometryArray.ALLOW_COUNT_READ);
mesh.setCapability(IndexedGeometryArray.ALLOW_COORDINATE_INDEX_READ);
mesh.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
mesh.setCoordinates(0, coordinates);
this.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
this.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
this.setGeometry(mesh);
}
}
public class StripLine extends Shape3D {
public StripLine () {
Point3f[] coordinates = new Point3f[2];
coordinates [0] = new Point3f (-1f, 1f, 0f);
coordinates [1] = new Point3f (1f, 1f, 0f);
int[] lineStripCounts = {2};
LineStripArray mesh = new LineStripArray(
coordinates.length, GeometryArray.COORDINATES |
GeometryArray.NORMALS, lineStripCounts);
mesh.setCoordinates(0, coordinates);
mesh.setCapability(GeometryArray.ALLOW_COORDINATE_WRITE);
mesh.setCapability(GeometryArray.ALLOW_COORDINATE_READ);
mesh.setCapability(GeometryArray.ALLOW_COUNT_READ);
mesh.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
mesh.setCoordinates(0, coordinates);
this.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
this.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
this.setGeometry(mesh);
}
}
static final int SHAPECOUNT = 4;
}
===========================================================================
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".