osgManipulator.TabPlaneDragger是OpenSceneGraph中的一种拖动器,用于在场景中移动和旋转平面。该拖动器通常由鼠标操作触发,可以通过拖动平面的圆柱和箭头来实现平移和旋转。
Tab Plane Dragger的构造函数可接受一些参数,以定制拖动器的某些特性,例如平面的初始大小、圆柱的颜色、箭头的长度等。这些参数可以通过设置getter/setter方法来获取或设置。
Tab Plane Dragger可以添加到场景图中,并通过设置回调函数来响应拖动事件。拖动器可以通过指定节点名称或状态集可以进行控制。在拖动器通过拖动平面移动或旋转时,回调函数将被调用,以便应用程序可以更新任何需要的对象。
以下是TabPlaneDragger的构造函数:
TabPlaneDragger();
TabPlaneDragger(const osg::Vec3d& planeNormal, const osg::Vec3d& planePoint);
第一个构造函数创建一个没有初始值的拖动器。第二个构造函数使用指定的平面法线和点来创建拖动器。这个构造函数将平面设置为通过点(planePoint), 法线为指定的平面法线(planeNormal),并使用默认值初始化拖曳器的其他参数。
以下是一些重要的TabPlaneDragger成员函数:
void setPlaneNormal(const osg::Vec3d& normal);
const osg::Vec3d& getPlaneNormal() const;
这些方法分别用于设置和获取拖动器的平面法线(即与拖动平面平行的向量)。当拖动平面时,该法线将保持不变。默认情况下,平面法线为从原点指向负Z轴的单位向量(0,0,-1)。
void setPlanePoint(const osg::Vec3d& point);
const osg::Vec3d& getPlanePoint() const;
这些方法分别用于设置和获取平面上的点。该点位于拖动平面上,并且定义了整个平面。默认情况下,平面点为原点(0,0,0)。
void setPlaneSize(float size);
float getPlaneSize() const;
这些方法分别用于设置和获取拖动器的平面大小。拖动器将在平面上绘制一个方形图形,该大小表示该图形的边长。默认情况下,平面大小为0.25个单位。
void setAxisCylinderHeight(float height);
float getAxisCylinderHeight() const;
void setAxisCylinderRadius(float radius);
float getAxisCylinderRadius() const;
void setAxisCylinderColor(const osg::Vec4& color);
const osg::Vec4& getAxisCylinderColor() const;
void setAxisArrowLength(float length);
float getAxisArrowLength() const;
void setAxisArrowRadius(float radius);
float getAxisArrowRadius() const;
void setAxisArrowColor(const osg::Vec4& color);
const osg::Vec4& getAxisArrowColor() const;
这些方法分别用于设置/获取圆柱的高度和半径、箭头的长度和半径,以及圆柱和箭头的颜色。默认情况下,圆柱的高度为1个单位,半径为0.08个单位,箭头的长度为0.35个单位,半径为0.16个单位,圆柱和箭头的颜色各自为红、绿、蓝和不透明度。
void setNode(osg::Node* node);
osg::Node* getNode() const;
void setStateSet(osg::StateSet* stateset);
osg::StateSet* getStateSet() const;
这些函数设置和获取拖动器的节点和状态集。拖动器将添加到指定的节点,以便可以在场景中渲染。通过为拖动器指定状态集,可以更改拖动器的外观和感觉。默认情况下,TabPlaneDragger没有与任何节点或状态集相关联。
void addCallback(osgManipulator::TranslatePlaneDragger::Callback* callback);
void removeCallback(osgManipulator::TranslatePlaneDragger::Callback* callback);
这些函数用于添加或移除回调函数。在拖动平面移动或旋转时,回调函数将被调用。回调函数的典型用法是更新场景中的对象或视图。
void setupDefaultGeometry();
void setOffset(const osg::Vec3d& offset);
void handleDrag(const osgManipulator::PointerInfo& pi, const osg::Vec3d& delta);
void handleDragStart(const osgManipulator::PointerInfo& pi);
void handleDragFinish(const osgManipulator::PointerInfo& pi);
这些函数被TabPlaneDragger内部用于处理拖动器的表现和交互。如果你打算在自己的拖动器中使用TabPlaneDragger,那么你应该相应地使用这些函数。在实际使用中,这些函数可以通过设置回调函数来定制。
bool handle(const osgManipulator::PointerInfo& pi, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
这个函数处理输入事件,例如鼠标事件,以便告诉拖动器如何响应它们。通常情况下,这个函数应该在场景中预定义的位置被调用,以便拖动器可以知道它们该如何响应事件。
// 创建平面拖动器
osg::ref_ptr<osgManipulator::TabPlaneDragger> dragger = new osgManipulator::TabPlaneDragger();
// 设置拖动器的平面大小和颜色
dragger->setPlaneSize(1.0);
dragger->setAxisCylinderColor(osg::Vec4(0.5f, 0.5f, 0.8f, 1.0f));
dragger->setAxisArrowColor(osg::Vec4(0.8f, 0.5f, 0.5f, 1.0f));
// 将拖动器添加到场景中
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
geode->addDrawable(dragger);
root->addChild(geode);
// 注册回调函数
dragger->addCallback(new osgManipulator::TranslateAxisDragger::Callback());
// 处理输入事件,例如鼠标事件
bool handle(const osgManipulator::PointerInfo& pi, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
if (ea.getEventType() == osgGA::GUIEventAdapter::FRAME)
return false;
bool handled = dragger->handle(pi, ea, aa);
return handled;
}
以上代码创建一个平面拖动器,并将其添加到场景中。然后,注册一个回调函数,当平面被拖动时,它将被调用以更新场景中的对象。 handle函数调用TabPlaneDragger的handle函数以处理鼠标事件。