osgearth中使用EarthManipulator类来充当相机,EarthManipulator官方注释中解释是适用于地理空间地形的可编程机械手。
1.简介
在osg中首先需要osgViewer承载一个场景,可以说是窗口,osgViewer通过setSceneData()函数添加节点,也就是内容物,osgearth就是对内容节点做了更加适配地理信息的细化,而osgView的setCameraManipulator()函数,设置一个相机可见的区域,对相机操作也就是对可见的区域的控制。
2.Viewpoint 视点
osgEarth::Viewpoint 视点是存储一个焦点(或焦点节点)和与该点相关的相机参数。
构造函数
Viewpoint(const char* name, double lon, double lat, double z, double heading, double pitch, double range);
参数
name --名称 lon--经度 lat--纬度 z--高度
heading--水平方向 pitch--倾斜角度 range--焦距
3.操作相机
对相机使用setViewpoint(vp, 0)函数让相机移动到对应视点,下面是一个简单的示例
pViewer = getOsgViewer();//初始化View
carmer = new osgEarth::Util::EarthManipulator;//初始化相机
const osgEarth::Viewpoint cnvp("", 105.056, 29.578, 0.0, 0, -80.0, 1.5e7); //中国视点
carmer->setHomeViewpoint(cnvp); //设置在执行ACTION_HOME动作时激活的视点。
pViewer->setCameraManipulator(carmer);//设置相机
//设置需要移动的视点
osgEarth::Viewpoint vp("",
107.85,
32.35,
0,
carmer->getViewpoint().heading()->getValue(),//获取相机原来的值
carmer->getViewpoint().pitch()->getValue(),
carmer->getViewpoint().range()->getValue()
);
carmer->setViewpoint(vp, 0);
4. 使用滑动条控制相机
在widget中添加一个滑动条来控制相机
{
QSlider* sliderh = new QSlider(Qt::Horizontal);//控制水平方向的滑动条
QSlider* sliderp = new QSlider(Qt::Horizontal);//控制倾斜角度的滑动条
sliderh ->setMinimum(-90); // 设置滑动条的最小值
sliderh ->setMaximum(90);// 设水平滑动条的最大为90
sliderh ->setValue(0);
sliderp ->setMinimum(-90); // 设置滑动条的最小值
sliderp ->setMaximum(-30); // 设置滑动条的最大值
connect(sliderh , &QSlider::valueChanged, this, &OsgWidget::movecarmer_l);
connect(sliderp , &QSlider::valueChanged, this, &OsgWidget::movecarmer_v);
}
void OsgWidget::movecarmer_l(int value) {//移动相机焦点水平方位角
osgEarth::Viewpoint vp("",
carmer->getViewpoint().focalPoint()->x(),
carmer->getViewpoint().focalPoint()->y(),
carmer->getViewpoint().focalPoint()->z(),
value,
carmer->getViewpoint().pitch()->getValue(),
carmer->getViewpoint().range()->getValue()
);
carmer->setViewpoint(vp, 0);
}
void OsgWidget::movecarmer_v(int value) {//移动相机焦点垂直俯仰角
osgEarth::Viewpoint vp("",
carmer->getViewpoint().focalPoint()->x(),
carmer->getViewpoint().focalPoint()->y(),
carmer->getViewpoint().focalPoint()->z(),
carmer->getViewpoint().heading()->getValue(),
value,
carmer->getViewpoint().range()->getValue()
);
carmer->setViewpoint(vp, 0);
}