我想通过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);
}
我稍加改进,尝试加入如下: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);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货