osgManipulator.DraggerTransformCallback是OpenSceneGraph中的一个回调类,用于对拖动器(dragger)的变换操作进行响应和处理。
DraggerTransformCallback通常作为设置在osgManipulator::Dragger上的回调,用于响应拖动器的变换操作。
在构造DraggerTransformCallback对象时,需要传入一个transform参数,该transform参数表示要进行变换的节点。
osg::ref_ptr<osg::MatrixTransform> transform = new osg::MatrixTransform;
osgManipulator::DraggerTransformCallback* transformCallback = new osgManipulator::DraggerTransformCallback(transform);
然后将该回调设置到拖动器上即可。
osg::ref_ptr<osgManipulator::TranslateAxisDragger> dragger = new osgManipulator::TranslateAxisDragger;
dragger->addTransformUpdating(transformCallback);
DraggerTransformCallback的主要方法是handle方法,该方法用于处理拖动器的变换操作。
handle方法的参数包括:
handle方法会根据参数的不同执行不同的操作。
例如,根据ea参数获取当前的鼠标位置,并将鼠标位置映射到世界坐标系中。
case osgGA::GUIEventAdapter::MOVE:
{
if (pointer->_dragging)
{
if (getMatrixNodePath(pointer, _xformPathIn, _xformPathOut))
{
const osg::Matrix& matrix = _xformPathOut.getMatrix();
osg::Vec3d newWorld = pointer.getWorldIntersectPoint(_plane);
osg::Matrix localToWorld = osg::computeLocalToWorld(_xformPathOut);
osg::Vec3d origin = localToWorld.getTrans();
osg::Vec3d worldToObject = newWorld - origin;
_previousWorld = newWorld;
osg::Matrix listToWorld = osg::computeLocalToWorld(_xformPathIn);
listToWorld.invert(listToWorld);
osg::Vec3d posInList = listToWorld.preMult(worldToObject);
_draggers->setDraggerPositionAndOrientation(posInList, _worldDraggerOrientation, _planeNormal);
aa.requestRedraw();
}
}
break;
}
DraggerTransformCallback通过继承osg::Referenced,提供了简单易用的API,用于响应拖动器的变换操作。它可以与osgManipulator中的多种拖动器一起使用,实现丰富的交互操作。