我需要为我在Java3D应用程序中创建的一些形状(比如圆柱体)添加拖放功能。我想我知道基本步骤(虽然很模糊):
- 使用当前Canvas和根BranchGroup构建PickCanvas
- 将PickCanvas的模式设置为PickCanvas.GEOMETRY,根据文档,这更准确[Dout:各种拾取模式(即BOUNDS、GEOMETRY、GEOMETRY_ININTERSECT_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);
}