osgGA.OrbitManipulator可以让用户绕目标点进行旋转和缩放,类似于行星绕着太阳旋转。它是OpenSceneGraph的一种输入设备处理程序。
要使用osgGA.OrbitManipulator,您需要将它与一个渲染器一起使用,例如osgViewer.Viewer。您可以使用osgViewer.Viewer的setCameraManipulator()函数将OrbitManipulator设置为视窗的默认控制器,也可以将它添加到观察器自己的ManipulatorStack中。
osgViewer::Viewer viewer;
viewer.setCameraManipulator(new osgGA::OrbitManipulator());
在默认情况下,要使用OrbitManipulator,您可以像使用其他osgGA::GUIEventHandler一样注册它。具体来说,你需要使用osgViewer.Viewer的addEventHandler()函数添加一个osgGA::EventAdapter接口并在程序开头的上下文中提供一个osgGA::GUIActionAdapter实例:
osgViewer::Viewer viewer;
viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
viewer.addEventHandler(new osgViewer::StatsHandler);
viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
viewer.setCameraManipulator(new osgGA::OrbitManipulator());
OrbitManipulator实现了 osgGA::CameraManipulator 接口,其接口是:
virtual void setByMatrix(const osg::Matrixd& matrix);
virtual void setByInverseMatrix(const osg::Matrixd& matrix);
virtual osg::Matrixd getMatrix() const;
virtual osg::Matrixd getInverseMatrix() const;
virtual void setNode(osg::Node* node);
virtual const osg::Node* getNode() const;
virtual osg::Node* getNode();
virtual void setVerticalAxisFixed(bool value);
virtual bool getVerticalAxisFixed() const;
OrbitManipulator具有许多可配置参数:
OrbitManipulator有两种模式:单击模式和双击模式。 在单击模式下,拖动鼠标指针可以沿水平和垂直方向旋转视图,而滚动鼠标指针则会旋转视图。 在双击模式下,可以使用鼠标指针在缩放和平移之间切换。
如果您注意到鼠标滚轮没有缩放视图,请尝试更改lighting(光照)设置。如果开启lighting默认情况下osgGA::OrbitManipulator无法执行正确的控制操作。
OrbitManipulator也可以适应不同的屏幕比例。 需要注意的是,当您在使用OrbitManipulator时更改屏幕比例时,视图中的物体可能会看起来不正确,因为视角会发生变化。
OrbitManipulator还允许您在运行时更改其属性,例如distance和max_pitch。
如果您使用了多个OrbitManipulators而无法找到合适的控制器,可以考虑使用OSG的多照相机技术。