三维交互方式OSGB模型裁剪和DOM/DSM裁剪

经常有朋友问:

1. 手里没有现成的裁剪线,能不能通过三维交互的方式绘制一个裁剪范围?

2. 能不能在出正射DOM DSM时指定一个出图范围?

小编给大家介绍一下如果在OSGBLab中通过三维交互的范式,对OSGB模型裁剪,以及在OSGB转正射DOM DSM时如何设定范围。

1. 下载软件:

    通过www.osgblab.com下载软件。

2. 打开一个倾斜osgb场景

    可以直接把metadata.xml往osgblab中一拖即可打开osgb场景,也可以通过在三维浏览器中点击打开文件或者文件夹来选择osgb场景打开。

  • 2.1 osgb模型裁剪

    点击软件上方的裁剪按钮打开裁剪面板。

    然后点击手动绘制裁剪线按钮,就可以在三维窗口中绘制裁剪范围,绘制的操作方式为:左键开始选取范围,最后要结束时双击或者右键即可结束一个多边形的绘制操作。 关于图中内切以及保留完整瓦块的含义以及使用场景,请参阅

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,作为AI语言模型,我无法提供完整的c++程序。但我可以给出实现的一般步骤: 1.读取DSMDOM数据 2.建立场景图 3.计算每个地形网格的高度 4.根据高度和颜色信息创建纹理映射 5.创建osgb模型 6.导出osgb模型 以下是一些可能有用的代码片段: 读取DSMDOM数据: ``` gdal_all_register(); GDALDatasetH hDSM = GDALOpen(dsm_path, GA_ReadOnly); GDALDatasetH hDOM = GDALOpen(dom_path, GA_ReadOnly); ``` 建立场景图: ``` osg::ref_ptr<osg::Group> root = new osg::Group; osg::ref_ptr<osgEarth::MapNode> mapNode = osgEarth::MapNode::create(map); root->addChild(mapNode); ``` 计算每个地形网格的高度: ``` osgEarth::ElevationQuery query(map); osgEarth::ElevationSample sample; osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(model_path); osg::ref_ptr<osg::Geode> geode = node->asGeode(); osg::ref_ptr<osg::Geometry> geometry = geode->getDrawable(0)->asGeometry(); for (int i = 0; i < geometry->getNumPrimitiveSets(); i++) { osg::ref_ptr<osg::PrimitiveSet> primSet = geometry->getPrimitiveSet(i); osg::ref_ptr<osg::DrawElementsUInt> drawElements = primSet->asDrawElementsUInt(); for (int j = 0; j < drawElements->size(); j++) { int index = (*drawElements)[j]; osg::Vec3d point = geometry->getVertexArray()->at(index); query.getElevation(point.y(), point.x(), sample); point.z() += sample.elevation().as(osgEarth::Units::METERS); geometry->setVertexArray(index, point); } } ``` 根据高度和颜色信息创建纹理映射: ``` osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; osg::ref_ptr<osg::Image> image = new osg::Image; image->allocateImage(width, height, 1, GL_RGB, GL_UNSIGNED_BYTE); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { float height = getHeight(j, i); osg::Vec4 color = getColor(j, i); int index = i * width + j; unsigned char r = color.r() * 255; unsigned char g = color.g() * 255; unsigned char b = color.b() * 255; image->data()[index * 3] = r; image->data()[index * 3 + 1] = g; image->data()[index * 3 + 2] = b; } } texture->setImage(image); ``` 创建osgb模型: ``` osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(model_path); osg::ref_ptr<osg::Geode> geode = node->asGeode(); geode->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON); osgdb::writeNodeFile(*geode, output_path); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值