OSGEarth绘制Geometry:画线(一)

原创 2015年07月09日 21:18:21

在OSGEarth中绘制线,首先考虑osgEarth::Annotation::FeatureNode
功能描述如下:
1. 鼠标两次点击的点之间连线,为黄色的实线;
2. 最近一次点击的点和鼠标move到的点之间连线,为红色的虚线。
代码如下:drawline.h

class DrawLine : public HandleAdapter
{
public:
    DrawLine(GraphicsView* view);
    ~DrawLine();

protected:
    // 只需要经纬度
    virtual void slotPicked(osg::Vec3d pos);
    virtual void slotMoveing(osg::Vec3d pos);
    virtual void slotRightHandle();

private:
    // 实线的style,Node
    osgEarth::Symbology::Style m_lineStyle;
    osgEarth::Features::Feature* m_pFeature;
    osgEarth::Annotation::FeatureNode* m_pFeatureNode;

    // 虚线的style,Node
    osgEarth::Symbology::Style m_stippleLineStyle;
    osgEarth::Features::Feature* m_pStippleFeature;
    osgEarth::Annotation::FeatureNode* m_pStippleFeatureNode;

    std::vector<osg::Vec3d> m_vecPoint;
};

功能实现如下:drawline.cpp

DrawLine::DrawLine(GraphicsView* view)
: HandleAdapter(view)
{
    m_pFeature = NULL;
    m_pFeatureNode = NULL;
    m_pStippleFeature = NULL;
    m_pStippleFeatureNode = NULL;

    m_vecPoint.clear();

    // 初始化实线的style
    m_lineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->stroke()->color() = osgEarth::Symbology::Color::Yellow;
    m_lineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->stroke()->width() = 2.0;
    m_lineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->tessellation() = 20.0;
    m_lineStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->clamping() = osgEarth::Symbology::AltitudeSymbol::CLAMP_TO_TERRAIN;
    m_lineStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->technique() = osgEarth::Symbology::AltitudeSymbol::TECHNIQUE_MAP;
    m_lineStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->verticalOffset() = 0.1;

    // 初始化实线的style
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->stroke()->color() = osgEarth::Symbology::Color::Red;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->stroke()->width() = 2.0;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->tessellation() = 20.0;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->clamping() = osgEarth::Symbology::AltitudeSymbol::CLAMP_TO_TERRAIN;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->technique() = osgEarth::Symbology::AltitudeSymbol::TECHNIQUE_MAP;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::AltitudeSymbol>()
        ->verticalOffset() = 0.1;
    m_stippleLineStyle.getOrCreate<osgEarth::Symbology::LineSymbol>()
        ->stroke()->stipple() = 255;
}

DrawLine::~DrawLine()
{

}

void DrawLine::slotPicked(osg::Vec3d pos)
{
    m_vecPoint.push_back(pos);
    if (m_vecPoint.size() <= 1)
    {
        return;
    }

    if (m_pFeatureNode == NULL)
    {
        m_pFeature = new osgEarth::Features::Feature(
            new osgEarth::Annotation::LineString,
            m_pMap3D->getMapNode()->getMapSRS(), m_lineStyle);
        m_pFeatureNode = new osgEarth::Annotation::FeatureNode(
            m_pMap3D->getMapNode(), m_pFeature);

        m_pLayerGroup->addChild(m_pFeatureNode);
    }

    m_pFeature->getGeometry()->clear();
    m_pFeatureNode->setStyle(m_lineStyle);
    for (int i = 0; i < m_vecPoint.size(); ++i)
    {
        m_pFeature->getGeometry()->push_back(m_vecPoint[i]);
    }

    m_pFeatureNode->init();

    if (m_pStippleFeatureNode != NULL)
    {
        m_pStippleFeature->getGeometry()->clear();
    }
}

void DrawLine::slotMoveing(osg::Vec3d pos)
{
    if (m_vecPoint.size() <= 0)
    {
        return;
    }
    if (m_pStippleFeatureNode == NULL)
    {
        m_pStippleFeature = new osgEarth::Features::Feature(
            new osgEarth::Annotation::LineString,
            m_pMap3D->getMapNode()->getMapSRS(), m_lineStyle);
        m_pStippleFeatureNode = new osgEarth::Annotation::FeatureNode(
            m_pMap3D->getMapNode(), m_pStippleFeature);

        m_pLayerGroup->addChild(m_pStippleFeatureNode);
    }

    m_pStippleFeature->getGeometry()->clear();
    m_pStippleFeatureNode->setStyle(m_stippleLineStyle);
    m_pStippleFeature->getGeometry()->push_back(m_vecPoint[m_vecPoint.size() - 1]);
    m_pStippleFeature->getGeometry()->push_back(pos);

    m_pStippleFeatureNode->init();
}

void DrawLine::slotRightHandle()
{
    m_vecPoint.clear();
    if (m_pStippleFeatureNode != NULL)
    {
        m_pStippleFeature->getGeometry()->clear();
    }
}

关于osgEarth::Features::Feature*,并不需要写成成员的,可以再需要使用的时候直接new一个就好,在后面的篇章中展示此方式。

版权声明:本文为博主原创文章,未经博主允许不得转载。

5、osg绘制正方形和四方块以及内置的几何图形

1、首先要定义一个几何图形,用来创建正方形的一个对象,这个对象根据坐标,颜色来进行绘制,如下代码创建一个几何对象: osg::ref_ptr geom=new osg::Geometry();//定义...
  • sunxiaoju
  • sunxiaoju
  • 2015年12月08日 15:18
  • 2725

osg如何画网格

osg画网格只要是通过画线来实现的的,代码的的结构主要在于如何构造图元信息,及相应的顶点信息,将Geometry添加至节点即可实现,代码如下: osg::ref_ptr transformGr...
  • PowerMuye
  • PowerMuye
  • 2015年05月22日 16:22
  • 1772

2013年8月27日星期二(DEMO8_1,画线)

这一节进入了数学阶段,画线,主要介绍了BRESENHAM算法,开始于(x0,y0)点,但是不采用斜率,它先在X轴方向移动1个像素,然后决定如何移动Y方向的像素,以使所描绘的直线尽量接近于实际的线,这是...
  • directx3d_beginner
  • directx3d_beginner
  • 2013年08月27日 13:03
  • 1438

OSGEarth的测量分析

我的测量有距离测量、面积测量、高度测量。 测量的结果显示都为一个PlaceNode,可以实时的显示测量的结果。 使用方式为:pPlaceNode = new osgEarth::Annotatio...
  • chlk118
  • chlk118
  • 2015年07月10日 21:09
  • 2926

OSGEarth绘制Geometry:绘多边形(三)

功能描述如下: 1. 鼠标多次点击的区域绘制多边形,为黄色; 2. 最近一次点击的点以及第一次点击的点和鼠标move到的点之间连线,为两条红色的虚线,表示下次即将绘制的区域块。 代码如下:...
  • chlk118
  • chlk118
  • 2015年07月09日 22:38
  • 3149

OSGEarth绘制Geometry:绘圆(二)

功能描述如下: 1. 鼠标点击之处为圆心位置; 2. 以圆心到鼠标move的距离为半径绘圆; 3. 鼠标有点点击结束绘制; 4. 鼠标点击为新的圆心,继续下次绘制。 代码如下:draw...
  • chlk118
  • chlk118
  • 2015年07月09日 21:58
  • 3029

osgEarth开发之三维矢量数据的鼠标选择功能

首先,为了可以实现矢量数据的选择,在矢量数据的加载过程中earth文件需要包含 true 否则,选择不成功 或者在程序中添加代码 osgEarth::Features::FeatureSource...
  • gisrootie
  • gisrootie
  • 2014年12月25日 10:21
  • 1592

glsl绘制Bezier曲线

OSG环境下,使用glsl绘制Bezier曲线,这个过程在几何着色器中实现。Bezier曲线的实现原理感兴趣的亲们可以自己百度一下,很多文章都写有,在这里就不赘述了。 在本例子中,使用的是4个控制点...
  • swety_gxy
  • swety_gxy
  • 2016年08月23日 19:30
  • 1109

osg画实时曲线的代码,vc开发

  • 2013年12月19日 17:16
  • 5KB
  • 下载

OSG绘制几何体学习总结(超全)

在osg中,场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率 场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲...
  • u012463389
  • u012463389
  • 2016年05月23日 23:01
  • 2074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSGEarth绘制Geometry:画线(一)
举报原因:
原因补充:

(最多只允许输入30个字)