我需要向在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);
}