各位大大,最近在学java3d 编程,现在学到在一个group里面添加;两个transformgroup 每一个transformgroup中各有一个图形,现在想用鼠标右键分别拖拽这两个图形请问怎么实现啊??我之前用的就是mousetranslate然后要拖拽的话两个图形会被一起拖拽图形编程java

解决方案 »

  1.   

    可以用点取,参考程序如下://SimplePick.java
    //演示如何使用点取技术
    import java.applet.Applet;
    import java.awt.BorderLayout;
    import java.awt.Frame;
    import java.awt.GraphicsConfiguration;import com.sun.j3d.utils.applet.MainFrame; 
    import com.sun.j3d.utils.geometry.ColorCube;
    import com.sun.j3d.utils.geometry.Sphere; 
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.behaviors.picking.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;import java.awt.event.*;
    import java.util.Enumeration;public class SimplePick extends Applet { // 创建外观
    Appearance createAppearance() {
    Appearance appear = new Appearance();
    Material material = new Material();
    appear.setMaterial(material);
    return appear;
    }
    // 创建自己的回调类,用来改变灯的状态
    public class MyCallbackClass extends Object implements PickingCallback{
    DirectionalLight myLight;
    boolean state;
    public MyCallbackClass(DirectionalLight lightD){
    this.myLight=lightD;
    // 保存引用
    this.state=false;
    }
    public void transformChanged(int type, TransformGroup tg) {
    state=!state;
    myLight.setEnable(state);
    //改变该对象当前的状态
    }
    } public BranchGroup createSceneGraph(Canvas3D canvas) {
    BranchGroup objRoot = new BranchGroup();
    // 创建根分支节点
    TransformGroup objTG = null;
    Transform3D transform = new Transform3D();
    BoundingSphere bounds = new BoundingSphere();

    //创建环境光
    AmbientLight lightA = new AmbientLight();
    lightA.setEnable(true);
    lightA.setColor(new Color3f( 0.1f, 0.1f, 0.1f ));
    lightA.setInfluencingBounds(bounds);
    objRoot.addChild(lightA);
    //创建平行光
    DirectionalLight lightD = new DirectionalLight();
    lightD.setDirection (new Vector3f(-1.0f,-1.0f,-1.0f));
    lightD.setColor (new Color3f(0.0f,1.0f,1.0f));
    lightD.setInfluencingBounds(bounds);
    lightD.setCapability(DirectionalLight.ALLOW_STATE_WRITE );
    lightD.setEnable(false);
    // 允许该光源的状态动态改变
    objRoot.addChild(lightD);

    //创建点取旋转对象
    PickRotateBehavior pickRotate = new PickRotateBehavior(objRoot, canvas, bounds);
    objRoot.addChild(pickRotate);
    //设置回调类
    PickingCallback myCallback = new MyCallbackClass(lightD);
    pickRotate.setupCallback(myCallback);
    //创建点取平移对象
    PickTranslateBehavior pickTranslate = new PickTranslateBehavior(objRoot, canvas, bounds);
    objRoot.addChild(pickTranslate);
    //创建点取缩放对象
    PickZoomBehavior pickZoom = new PickZoomBehavior(objRoot, canvas, bounds);
    objRoot.addChild(pickZoom); // 分别创建三个支持点取的物体
    transform.setTranslation(new Vector3f(-0.6f, 0.6f, -1.0f));
    objTG = new TransformGroup(transform);
    objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    objTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
    objTG.addChild(new ColorCube(0.3));
    objRoot.addChild(objTG);


    transform.setTranslation(new Vector3f(-0.6f, -0.6f, -1.0f));
    objTG = new TransformGroup(transform);
    objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    objTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
    objTG.addChild(new ColorCube(0.3));
    objRoot.addChild(objTG);

    transform.setTranslation(new Vector3f(0.6f, -0.6f, -1.0f));
    objTG = new TransformGroup(transform);
    objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    objTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    objTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
    objTG.addChild(new ColorCube(0.3));
    objRoot.addChild(objTG);
    // 创建一个不支持点取,但支持光照效果的物体
    transform.setTranslation(new Vector3f( 0.6f, 0.6f, -1.0f));
    objTG = new TransformGroup(transform);
    Sphere  ball=new  Sphere(0.5f,Sphere.GENERATE_NORMALS,createAppearance());
    objTG.addChild(ball);
    objRoot.addChild(objTG);

    objRoot.compile(); return objRoot;
    }  public SimplePick() {
    setLayout(new BorderLayout());
    GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration();
    Canvas3D canvas3D=new Canvas3D(config);
    add("Center", canvas3D);
    SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
    BranchGroup scene = createSceneGraph(canvas3D);
    simpleU.getViewingPlatform().setNominalViewingTransform();
    simpleU.addBranchGraph(scene);
    } public static void main(String[] args) {
    Frame frame = new MainFrame(new SimplePick(), 256, 256);
    }