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;
  }

}

Reply via email to