I have got some probs with picking a shape. I have to display a
wireframeobject, including lines and points. Every point extends a
shape3d and the lines extends a shape3d. I can pick the lines, but only
by bounds, not by geometry, but I don't get the points. I've tried
several combinations with setCapability, but nothing happened. I've
attached the recent files.
Thanx
Christoph
--
______________________________________________________
Christoph Helmert
TU Darmstadt, Germany
EPF Lausanne, Suisse
eMail: [EMAIL PROTECTED]
eMail: [EMAIL PROTECTED]
______________________________________________________
package com.helmert.feworld;
import java.awt.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.helmert.feworld.object.*;
public class FEViewFrame extends Frame{
Frame displayFrame;
Canvas3D viewCanvas;
SimpleUniverse u;
BranchGroup objRoot,contentBranchGroup;
ViewPlatform thisViewPlatform;
View displayView;
ViewingPlatform ingPlatform;
TransformGroup viewTransformGroup;
public FEViewFrame(BranchGroup objRoot){
displayFrame=new Frame();
viewCanvas=new Canvas3D(null);
displayView=new View();
displayView.setBackClipDistance(1000);
displayView.addCanvas3D(viewCanvas);
displayView.setPhysicalBody(new PhysicalBody());
displayView.setPhysicalEnvironment(new PhysicalEnvironment());
VirtualUniverse viewUniverse = new VirtualUniverse();
Locale viewLocale = new Locale(viewUniverse);
BranchGroup viewBranchGroup = new BranchGroup();
viewTransformGroup = new TransformGroup();
viewTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
viewTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
BoundingSphere bounds =
new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
MouseRotate rotationBehavior=new MouseRotate(viewTransformGroup);
viewTransformGroup.addChild(rotationBehavior);
rotationBehavior.setSchedulingBounds(bounds);
MouseTranslate translationBehavior=new MouseTranslate(viewTransformGroup);
viewTransformGroup.addChild(translationBehavior);
translationBehavior.setSchedulingBounds(bounds);
MouseZoom zoomingBehavior=new MouseZoom(viewTransformGroup);
viewTransformGroup.addChild(zoomingBehavior);
zoomingBehavior.setSchedulingBounds(bounds);
rotationBehavior.setFactor(0.1);
viewTransformGroup.setBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0));
thisViewPlatform = new ViewPlatform();
viewTransformGroup.addChild(thisViewPlatform);
viewBranchGroup.addChild(viewTransformGroup);
viewLocale.addBranchGraph(viewBranchGroup);
displayView.attachViewPlatform(thisViewPlatform);
ingPlatform=new ViewingPlatform();
ingPlatform.setViewPlatform(thisViewPlatform);
ingPlatform.setNominalViewingTransform();
contentBranchGroup=new BranchGroup();
contentBranchGroup.setCapability(Group.ALLOW_CHILDREN_EXTEND);
contentBranchGroup.setCapability(Group.ALLOW_CHILDREN_READ);
contentBranchGroup.setCapability(Group.ALLOW_CHILDREN_WRITE);
contentBranchGroup.setCapability(Group.ALLOW_BOUNDS_READ);
contentBranchGroup.setCapability(Group.ALLOW_PICKABLE_READ);
contentBranchGroup.setCapability(Group.ALLOW_PICKABLE_WRITE);
//contentBranchGroup.setCapability(Group.ALLOW_PICK);
contentBranchGroup.setCapability(Group.ENABLE_PICK_REPORTING);
contentBranchGroup.addChild(objRoot);
FECube cube=new FECube(2,2,2);
Transform3D t3d=new Transform3D();
t3d.setTranslation(new Vector3f(0,0,-3));
TransformGroup trans=new TransformGroup(t3d);
trans.addChild((BranchGroup)cube.getBranchGroup());
contentBranchGroup.addChild(trans);
FECube cube1=new FECube (4,1,3);
contentBranchGroup.addChild(cube1.getBranchGroup());
PickHighLightBehavior pickBeh = new PickHighLightBehavior(viewCanvas,
contentBranchGroup,
new BoundingSphere(new
Point3d(0.0,0.0,0.0), 100.0));
viewLocale.addBranchGraph(contentBranchGroup);
add(viewCanvas);
setViewPoint();
//System.out.println (((Group)((Group)objRoot.getChild(0)).getChild(0)).
// numChildren());
//u.addBranchGraph(objRoot);
}
public TransformGroup getViewGroup(){
return null;
}
public synchronized void setViewPoint() {
Transform3D viewTrans = new Transform3D();
Transform3D eyeTrans = new Transform3D();
// point the view at the center of the object
Point3d center = new Point3d();
BoundingSphere sceneBounds=(BoundingSphere)contentBranchGroup.getBounds();
sceneBounds.getCenter(center);
double radius = sceneBounds.getRadius();
Vector3d temp = new Vector3d(center);
viewTrans.set(temp);
// pull the eye back far enough to see the whole object
double eyeDist = 1.4*radius / Math.tan(displayView.getFieldOfView() / 2.0);
System.out.println (eyeDist+" "+displayView.getFieldOfView());
temp.x = 0;
temp.y = 0;
temp.z = eyeDist;
eyeTrans.set(temp);
viewTrans.mul(eyeTrans);
// set the view transform
viewTransformGroup.setTransform(viewTrans);
}
}
package com.helmert.feworld;
import javax.media.j3d.*;
import com.sun.j3d.utils.behaviors.picking.*;
import java.util.*;
import java.awt.*;
import java.awt.Event;
import java.awt.AWTEvent;
import java.awt.event.MouseEvent;
import javax.vecmath.*;
public class PickHighLightBehavior extends PickMouseBehavior {
Appearance savedAppearance = null;
Shape3D oldShape = null;
Appearance highlightAppearance;
public PickHighLightBehavior(Canvas3D canvas, BranchGroup root,
Bounds bounds) {
super(canvas, root, bounds);
this.setSchedulingBounds(bounds);
root.addChild(this);
Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
Color3f highlightColor = new Color3f(0.0f, 1.0f, 0.0f);
Material highlightMaterial = new Material(highlightColor, black,
highlightColor, white,
80.0f);
highlightAppearance = new Appearance();
highlightAppearance.setMaterial(new Material(highlightColor, black,
highlightColor, white,
80.0f));
}
public void updateScene(int xpos, int ypos) {
Shape3D shape,geo;
shape = (Shape3D) pickScene.pickNode(pickScene.
pickClosest(xpos, ypos,
PickObject.
USE_GEOMETRY),
PickObject.SHAPE3D);
geo = (Shape3D) pickScene.pickNode(pickScene.
pickClosest(xpos, ypos,
PickObject.USE_BOUNDS),
PickObject.SHAPE3D);
System.out.println (shape);
System.out.println (geo);
}
}
package com.helmert.feworld.object;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;
abstract class FESimpleGeometry extends FEObject{
Vector pointVector,lineVector,faceVector;
//FEMaterial material;
public BranchGroup getBranchGroup(){
BranchGroup contentBranchGroup=new BranchGroup();
contentBranchGroup.setCapability(Group.ALLOW_CHILDREN_READ);
Shape3D lineShape=new Shape3D();
LineArray lnArray=new LineArray(lineVector.size()*2,
LineArray.COORDINATES);
int i;
for (i=0;i<pointVector.size();i++){
Appearance pointAppearance=new Appearance();
PointAttributes ptAttributes=new PointAttributes();
ptAttributes.setPointSize(5);
pointAppearance.setPointAttributes(ptAttributes);
pointAppearance.setColoringAttributes(new ColoringAttributes(1,0,0,0));
PointArray ptArray=new PointArray(1,PointArray.COORDINATES);
ptArray.setCoordinate(0,(Point3d)pointVector.elementAt(i));
ptArray.setCapability(Geometry.ALLOW_INTERSECT);
Shape3D pointShape=new Shape3D(ptArray);
pointShape.setAppearance(pointAppearance);
pointShape.setCapability(Shape3D.ALLOW_BOUNDS_WRITE);
pointShape.setCapability(Shape3D.ALLOW_BOUNDS_READ);
pointShape.setCapability(Shape3D.ALLOW_PICKABLE_WRITE);
pointShape.setCapability(Shape3D.ALLOW_PICKABLE_READ);
pointShape.setCapability(Shape3D.ENABLE_PICK_REPORTING);
pointShape.setBounds(new BoundingSphere((Point3d)pointVector.elementAt(i)
,100.0));
contentBranchGroup.addChild(pointShape);
System.out.println (pointShape.getBounds());
}
int count=0;
for (i=0;i<lineVector.size();i++){
lnArray.setCoordinate(count,(Point3d)((Vector)lineVector.elementAt(i))
.elementAt(0));
count++;
lnArray.setCoordinate(count,(Point3d)((Vector)lineVector.elementAt(i))
.elementAt(1));
count++;
//System.out.println(i+" "+count);
}
//ptArray.setCapability(Geometry.ALLOW_INTERSECT);
lnArray.setCapability(Geometry.ALLOW_INTERSECT);
lineShape.setGeometry(lnArray);
Appearance lineAppearance=new Appearance();
LineAttributes lnAttributes=new LineAttributes();
lineAppearance.setLineAttributes(lnAttributes);
lineShape.setAppearance(lineAppearance);
contentBranchGroup.setCapability(Group.ENABLE_PICK_REPORTING);
contentBranchGroup.addChild(lineShape);
return contentBranchGroup;
}
}