我需要向在Java3D应用程序中创建的某些形状(例如圆柱体)添加拖放功能。我想我知道基本步骤(尽管有些含糊):


使用当前的Canvas和根BranchGroup构造一个PickCanvas。
根据文档中的说明,将PickCanvas的模式设置为PickCanvas.GEOMETRY [疑问:各种拾取模式之间的区别是什么,即BOUNDS,GEOMETRY,GEOMETRY_INTERSECT_INFO?从文献资料看,我不清楚。按几何图形拾取实际上是什么意思? ]
设置我要选择的对象的功能。 [怀疑:这两种设置功能的方法有什么区别? -node.setCapability(Node.ENABLE_PICK_REPORTING)PickTool.setCapabilities(node, PickTool.INTERSECT_FULL)? ]
将mouseListener添加到画布。
在mousePressed方法中,我需要确定单击了哪个对象,然后采取适当的措施。[疑问:这是我最困惑的部分。如果可以给出有关如何识别单击了哪个对象的详细答案,将非常有帮助。]


另外,PickShapes到底是什么?它们将如何影响挑选算法?

如果我要问一些非常基本的问题,我真的很抱歉,但是我花了一整天时间阅读文档并成为初学者,这些对我来说还不够。我时间紧迫,希望Stackoverflow社区足够慷慨地耐心地向我解释我的疑问。非常感谢 !

更新:通过拖放功能来阐明,我的意思是我想使用通常的鼠标左键按下,拖动和鼠标释放手势将圆柱体从画布上的一个位置平移到其他位置。

最佳答案

要平移(旋转)形状,请使用MouseBehavior类。例如,使用以下内容,用鼠标左键旋转并用右平移。

public Test()
{
    SimpleUniverse universe = new SimpleUniverse();
    BranchGroup group = new BranchGroup();

    TransformGroup rootTransformGroup = new TransformGroup();
    group.addChild(rootTransformGroup);
    rootTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    rootTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

    ColorCube colorCube = new ColorCube(.3);
    rootTransformGroup.addChild(colorCube);

    BoundingSphere boundingSphere = new BoundingSphere(new Point3d(0, 0, 0), 1000);

    MouseRotate mouseRotate = new MouseRotate();
    mouseRotate.setTransformGroup(rootTransformGroup);
    mouseRotate.setSchedulingBounds(boundingSphere);
    group.addChild(mouseRotate);

    MouseTranslate mouseTrans = new MouseTranslate();
    mouseTrans.setTransformGroup(rootTransformGroup);
    mouseTrans.setSchedulingBounds(boundingSphere);
    group.addChild(mouseTrans);

    universe.getViewingPlatform().setNominalViewingTransform();
    universe.addBranchGraph(group);
}

10-05 21:51