osgManipulator.CompositeDragger
是一个用于管理多个拖拽器的拖拽器组件。它允许使用者同时对多个子拖拽器进行操作,从而实现复杂的交互设计。
你可以通过以下步骤来创建 osgManipulator.CompositeDragger
:
osgManipulator::CompositeDragger* dragger = new osgManipulator::CompositeDragger();
osgManipulator.CompositeDragger
中可以添加多个子拖拽器,如 osgManipulator::TranslateAxisDragger
与 osgManipulator::RotateCylinderDragger
等。
osgManipulator::Dragger* dragger1 = new osgManipulator::TranslateAxisDragger();
osgManipulator::Dragger* dragger2 = new osgManipulator::RotateCylinderDragger();
dragger->addDragger(dragger1);
dragger->addDragger(dragger2);
在拖动 CompositeDragger
的操作栏上的按钮时,将调用子 Dragger
的拖拽处理程序。因此,在开始操作之前,必须将其拖拽状态设置为打开:
dragger->setActivationModKeyMask(osgGA::GUIEventAdapter::MODKEY_CTRL);
dragger->setActivationKeyEvent(osgGA::GUIEventAdapter::KEY_Space);
dragger->setPickCylinderHeightPercent(0.8f);
dragger->setPickCylinderRadius(0.03f);
dragger->setMinimumScale(0.5f);
dragger->setMaximumScale(2.0f);
dragger->setHandleEvents(true);
dragger->setMinimumSize(0.1f);
dragger->setOffset(osg::Vec3(0.0f, 0.0f, 0.6f));
dragger->setParentDragger(nullptr);
dragger->setTransform(new osg::MatrixTransform());
dragger->setActivationMouseButton(osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON);
dragger->setActivationModKeyUp(true);
dragger->setActivationModKeyMask(osgGA::GUIEventAdapter::MODKEY_CTRL);
dragger->setActivationKeyEvent(osgGA::GUIEventAdapter::KEY_Space);
其中, setActivationModKeyMask
用于设置一个可选的修改键,如 Ctrl
。 setActivationKeyEvent
用于设置一个可选的激活按键,如 space
。 setPickCylinderHeightPercent
用于设置拾取柄的百分比。 setPickCylinderRadius
用于设置拾取柄的半径大小。 setHandleEvents
用于控制是否处理事件。 setMinimumScale
和 setMaximumScale
用于限制缩放比例。 setMinimumSize
用于设置拖拽器的最小大小。 setOffset
用于设置拖拽器的偏移量。 setParentDragger
用于设置父拖拽器,而 setTransform
用于设置拖拽器的初始变换矩阵。
最后,将 CompositeDragger
添加到场景图中:
root->addChild(dragger->getMatrixTransform());
osgManipulator.CompositeDragger
可以通过修改以下事件处理程序来处理拖动操作:
void handle(const osgGA::GUIEventAdapter& event, osgGA::GUIActionAdapter& aa) override;
void handlePick(const osgGA::GUIEventAdapter& event, osgGA::GUIActionAdapter& aa) override;
void handleMove(const osgGA::GUIEventAdapter& event, osgGA::GUIActionAdapter& aa) override;
void handleDrag(const osgGA::GUIEventAdapter& event, osgGA::GUIActionAdapter& aa) override;
void handleRelease(const osgGA::GUIEventAdapter& event, osgGA::GUIActionAdapter& aa) override;
handlePick
处理拾取事件, handleMove
处理移动事件, handleDrag
处理拖拽事件,而 handleRelease
处理释放事件。 其中, handle
函数负责根据查询事件类型来调用其他函数。