当前位置: 首页 > ds >正文

GIS开发笔记(9)结合osg及osgEarth实现三维球经纬网格绘制及显隐

一、实现效果
在这里插入图片描述

二、实现原理
按照5°的间隔分别创建经纬线的节点,挂在到组合节点,组合节点挂接到根节点。可以根据需要设置间隔度数和线宽、线的颜色。

三、参考代码

//创建经纬线的节点
osg::Node *GlobeWidget::createGraticuleGeometry(float interval, const osg::Vec4 &color)
{osg::ref_ptr<osg::Geode> geode = new osg::Geode;osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;// 设置颜色colors->push_back(color);geom->setColorArray(colors, osg::Array::BIND_OVERALL);// 生成经线(间隔为interval度)for (float lon = -180.0f; lon <= 180.0f; lon += interval){for (float lat = -89.9f; lat <= 89.9f; lat += 1.0f){osgEarth::GeoPoint pt(osgEarth::SpatialReference::get("wgs84"), lon, lat, 0);osg::Vec3d world;pt.toWorld(world);vertices->push_back(world);}geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP,vertices->size() - 180, 180));}// 生成纬线(间隔为interval度)for (float lat = -90.0f; lat <= 90.0f; lat += interval){for (float lon = -180.0f; lon <= 180.0f; lon += 1.0f){osgEarth::GeoPoint pt(osgEarth::SpatialReference::get("wgs84"), lon, lat, 0);osg::Vec3d world;pt.toWorld(world);vertices->push_back(world);}geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP,vertices->size() - 361, 361));}geom->setVertexArray(vertices);// 设置线宽osg::ref_ptr<osg::LineWidth> lw = new osg::LineWidth(1.5f);geom->getOrCreateStateSet()->setAttribute(lw);// 配置渲染状态(防止被地形遮挡)osg::StateSet* ss = geom->getOrCreateStateSet();ss->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);// 修复:使用全限定类名 osg::Depthss->setAttribute(new osg::Depth(osg::Depth::LEQUAL, 0, 1, false));ss->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);geode->addDrawable(geom);return geode.release();
}
//控制经纬线显示隐藏
void GlobeWidget::gridVisible(bool visible)
{if (m_graticuleGroup) {m_graticuleGroup->setNodeMask(visible ? 0xFFFFFFFF : 0x0);}
}
http://www.xdnf.cn/news/601.html

相关文章:

  • 利用 HEMT 和 PHEMT 改善无线通信电路中的增益、速度和噪声
  • 常见的页面报错
  • 热门算法面试题第19天|Leetcode39. 组合总和40.组合总和II131.分割回文串
  • windows docker desktop 无法访问容器端口映射
  • 大模型面经 | 介绍一下CLIP和BLIP
  • mac监控linux上mysql性能(Grafana+Prometheus+mysqld_exporter)
  • 每日一题——最小测试用例集覆盖问题
  • 通过爬虫方式实现头条号发布视频(2025年4月)
  • 2025 UCSCCTF Pwn-wp(含附件)
  • Java链表反转方法详解
  • 2. 什么是最普通的自动化“裸奔状态”?
  • 扣子智能体1:创建Agent与写好提示词
  • 深入理解Linux中的线程控制:多线程编程的实战技巧
  • 【失败总结】Win10系统安装docker
  • C++ MySQL数据库访问工具类设计与操作流程详解
  • 实现AWS Data Pipeline安全地请求企业内部API返回数据
  • 学习笔记二十——Rust trait
  • 网络基础(协议,地址,OSI模型、Socket编程......)
  • C++ 多态
  • 支持向量机(SVM):原理、应用与深入解析
  • 【今日三题】判断是不是平衡二叉树(递归) / 最大子矩阵(二维前缀和) / 小葱的01串(滑动窗口)
  • Linux进程地址空间、写时拷贝
  • Java—— 常见API介绍 第一期
  • 探秘Python 工匠:案例、技巧与工程实践:解锁Python进阶的通关秘籍
  • 【Linux】43.网络基础(2.5)
  • accelerate并行计算:训练环境和训练参数的配置字典
  • 【赵渝强老师】TiDB提供的命令行工具
  • 【信息获取能力】
  • HAL库配置RS485+DMA+空闲中断收发数据
  • 修改 <li> 元素小圆点的颜色