查看: 7545|回复: 7

我是这么在osgearth里头画线的

[复制链接]

该用户从未签到

发表于 2012-8-14 11:19:59 | 显示全部楼层 |阅读模式
线的画法和osg里头一样,可参看osggeometry.cpp,但是点的坐标需要经过转换,实践证明是可行的,应该也可以用到其它几何体上。新手上路,欢迎大牛们拍砖。

这部分放在main()或者InitSceneGraph( void )中
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
mRoot->addChild(geode);
//测试画线
osg::Vec3d startline(-155.150257, 63.390041, 220230);
osg::Vec3d endline(-165.150257,  63.390041, 0);
createLine(startline, endline);

void OSGEarthEngine::createLine(osg::Vec3d startline, osg::Vec3d endline)
{
        const SpatialReference* mapSRS = mapNode->getMapSRS();
        // create Geometry object to store all the vertices and lines primitive.
        osg::ref_ptr<osg::Geometry> linesGeom = new osg::Geometry();

        // this time we'll preallocate the vertex array to the size we
        // need and then simple set them as array elements, 2 points
        // makes 1 line segments.
        osg::Vec3d startWorld;
        osg::Vec3d endWorld;
        osg::ref_ptr<osg::Vec3dArray> vertices = new osg::Vec3dArray(2);
        mapNode->getMap()->toWorldPoint( GeoPoint(mapSRS,startline), startWorld );
        mapNode->getMap()->toWorldPoint( GeoPoint(mapSRS,endline), endWorld );
        (*vertices)[0] = startWorld;
        (*vertices)[1] = endWorld;

        // pass the created vertex array to the points geometry object.
        linesGeom->setVertexArray(vertices);

        // set the colors as before, plus using the above
        osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
        colors->push_back(osg::Vec4(1.0f,1.0f,0.0f,1.0f));
        linesGeom->setColorArray(colors);
        linesGeom->setColorBinding(osg::Geometry::BIND_OVERALL);

        // set the normal in the same way color.
        osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
        normals->push_back(osg::Vec3(0.0f,-1.0f,0.0f));
        linesGeom->setNormalArray(normals);
        linesGeom->setNormalBinding(osg::Geometry::BIND_OVERALL);

        // This time we simply use primitive, and hardwire the number of coords to use
        // since we know up front,
        linesGeom->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:INES,0,2));

        // add the points geometry to the geode.
        geode->addDrawable(linesGeom);
}

该用户从未签到

发表于 2013-1-18 15:57:31 | 显示全部楼层
楼主继续

该用户从未签到

发表于 2013-1-21 12:14:03 | 显示全部楼层
??

该用户从未签到

发表于 2014-4-17 14:43:06 | 显示全部楼层
我怎么找不到这个函数呢?mapNode->getMap()->toWorldPoint( );
捉急

该用户从未签到

发表于 2014-10-22 13:10:14 | 显示全部楼层
nie 发表于 2014-4-17 14:43
我怎么找不到这个函数呢?mapNode->getMap()->toWorldPoint( );
捉急

toWorldPoint是没有了,用其他函数

    GeoPoint startlineP(mapNode->getMapSRS(), startline, ALTMODE_ABSOLUTE);
    startlineP.toWorld( startWorld, mapNode->getTerrain() );

该用户从未签到

发表于 2014-10-28 17:12:56 | 显示全部楼层
楼主,这种实现方法需要有高程,而且,如果两点中间有高山阻挡,则中间的部分线显示不出来

该用户从未签到

发表于 2015-11-7 10:00:05 | 显示全部楼层
关注一下,有没有更好的方法?

该用户从未签到

发表于 2015-12-2 09:01:20 | 显示全部楼层
画线可以参考osgEarth编辑器,
下载地址:http://www.sxsim.com/h-col-106.html

SXEarth 2.0_web_en.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表