我想通过pickCanvas获得点击后的3维坐标但PickResult pickResult = pickCanvas.pickClosest( );    有问题报错 Shape3D:no capability to get geometry
我稍加改进,尝试加入如下:Shape3D partsp=sphere.getShape();
partsp.setCapability(GeometryArray.ALLOW_COUNT_READ);
partsp.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
partsp.setCapability(Geometry.ALLOW_INTERSECT);
报错:no capability to get vertex count/***********************************/我搜集的一些代码也有用pickCanvas.pickClosest( )的,甚至不用加任何capability就能通过,谁能告诉我原因和正确的做法。为了这个,我快要崩溃了....../********************************/
这是我的一个测试点击的小例子,请高手帮我指点迷津package com.fansy.vrml;
import java.awt.event.*;
import javax.swing.*;
import com.sun.j3d.utils.picking.*;
import java.applet.Applet; 
import java.awt.*; 
import com.sun.j3d.utils.applet.MainFrame; 
import com.sun.j3d.utils.universe.*; 
import javax.media.j3d.*; 
import javax.vecmath.*; 
import com.sun.j3d.loaders.vrml97.VrmlLoader; 
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom; 
import com.sun.j3d.utils.geometry.*;
public class Hello extends Applet {
  
        
        
        
        Canvas3D c;
        PickCanvas  pickCanvas = null;
        BranchGroup rootBG=new BranchGroup();
        TransformGroup transgroup=new TransformGroup();
        
        
       
        
  
  public void createSceneGraph() {
  
     transgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); 
     transgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
     transgroup.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
        
        
     Transform3D t3d=new Transform3D();    
     t3d.setTranslation(new Vector3f(0.0f, 0.0f, 0.0f));
     t3d.setScale(0.5); 
     transgroup.setTransform(t3d); 
        
     rootBG.addChild(transgroup);

     Sphere sphere = new Sphere(0.5f);
     Shape3D partsp=sphere.getShape();
     partsp.setCapability(GeometryArray.ALLOW_COUNT_READ);
     partsp.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
     partsp.setCapability(Geometry.ALLOW_INTERSECT);     transgroup.addChild(sphere);
     pickCanvas=new PickCanvas(c,rootBG);
     pickCanvas.setMode( PickTool.GEOMETRY_INTERSECT_INFO );
     pickCanvas.setTolerance( 0.1f );
         
         
         


     Color3f light1Color = new Color3f(1.8f, 0.1f, 0.1f);

     BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

     Vector3f light1Direction  = new Vector3f(4.0f, -7.0f, -12.0f);
     DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);

     light1.setInfluencingBounds(bounds);

     rootBG.addChild(light1);
      
  }
  
  public Hello() {
    setLayout(new BorderLayout());
    
    c=new Canvas3D(null);
    
    c.addMouseListener(new MyMouseListener()); 
    add("Center",c);
    createSceneGraph();
    
    SimpleUniverse u=new SimpleUniverse(c);
    
    u.getViewingPlatform().setNominalViewingTransform();
    
    u.addBranchGraph(rootBG);
    
    
    
    
     
  }
  
   
  
   class MyMouseListener extends MouseAdapter//内部类
 {
   public void mouseClicked( MouseEvent e )
{
System.out.println( "*** MouseClick ***" ); pickCanvas.setShapeLocation( e ); PickResult pickResult = pickCanvas.pickClosest( ); if( pickResult != null )
{

System.out.println("Closest PickResult:"+pickResult.getIntersection(0).getPointCoordinates() ); Node actualNode = pickResult.getObject( ); if( actualNode.getUserData( ) != null )
{
System.out.println( "Closest Object: " +                                actualNode.getUserData( ) );
}
} }
     
 }    
   
      
  public static void main(String[] args) {
    new MainFrame(new Hello(),300,300);
 
}