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 函数负责根据查询事件类型来调用其他函数。