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

osgearth 实现简单的雷达扫描

一、前言

通过使用着色器,实现简单的贴地扫描效果,基于此效果可以添加线框、刻度盘等。

二、效果

非贴地

贴地

三、几何体构建

osg::ref_ptr<osg::Node> EntityRadarScan::BuildEntityBody() { Style circleStyle; //circleStyle.getOrCreate<PolygonSymbol>()->fill()->color() = Color(Color::Cyan, 0.5); circleStyle.getOrCreate<AltitudeSymbol>()->clamping() = AltitudeSymbol::CLAMP_TO_TERRAIN; circleStyle.getOrCreate<AltitudeSymbol>()->technique() = AltitudeSymbol::TECHNIQUE_DRAPE; circle = new CircleNode( DigitalEarthWidget::GetInstance()->m_pMapNode.get(), GeoPoint(DigitalEarthWidget::GetInstance()->m_pMapNode->getMapSRS(), m_stLocation.dLng, m_stLocation.dLat, m_stLocation.dAlt, ALTMODE_ABSOLUTE), Distance(m_iRadius, Units::METERS), circleStyle, Angle(0.0, Units::DEGREES), Angle(360.0, Units::DEGREES), true); CreateShaders(*(circle->getOrCreateStateSet())); return circle.get(); }

四、着色器代码

void EntityRadarScan::InitShaderProgram(QString &strVert, QString &strFrag)const { strVert = "\ varying vec2 v_texcoord;\ void main() {\ v_texcoord = gl_Vertex.xy;\ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\ }"; strFrag = "\ uniform float simTime;\ uniform vec4 baseColor;\ uniform vec4 scanColor;\ varying vec2 v_texcoord;\ const float pi = 3.1415926;\n\ void main() {\ vec2 pos = normalize(v_texcoord);\n\ // 计算当前角度(0-2π)\n\ float angle = atan(pos.y, pos.x)+pi;\n\ // 将时间转换为旋转角度(0-2π)\n\ float scanAngle = mod(simTime , 2*pi);\n\ // 计算角度差值(0-2π)\n\ float angleDiff = mod(angle - scanAngle , 2*pi);\n\ if(angleDiff>1.0){\n\ gl_FragColor = baseColor;\n\ }else {\n\ gl_FragColor = mix(baseColor, scanColor, angleDiff<0.0?0.0:angleDiff); \n\ }\n\ }"; } void EntityRadarScan::CreateShaders(osg::StateSet& ss) { QString m_strVertSource; QString m_strfragSource; InitShaderProgram(m_strVertSource, m_strfragSource); osg::ref_ptr<osg::Shader> vertShader = new osg::Shader(osg::Shader::VERTEX, m_strVertSource.toStdString()); osg::ref_ptr<osg::Shader> fragShader = new osg::Shader(osg::Shader::FRAGMENT, m_strfragSource.toStdString()); osg::ref_ptr<osg::Program> program = new osg::Program; program->addShader(vertShader.get()); program->addShader(fragShader.get()); osg::ref_ptr<osg::Uniform> simTime = new osg::Uniform("simTime", 1.0f); ss.addUniform(simTime.get()); osg::ref_ptr<osg::Uniform> baseColor = new osg::Uniform("baseColor", m_baseColor); ss.addUniform(baseColor.get()); osg::ref_ptr<osg::Uniform> scanColor = new osg::Uniform("scanColor", m_scanColor); ss.addUniform(scanColor.get()); ss.setAttributeAndModes(program.get()); ss.setAttributeAndModes(program.get(), osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON); ss.setMode(GL_BLEND, osg::StateAttribute::ON); ss.setAttributeAndModes(new osg::BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); ss.setRenderingHint(osg::StateSet::TRANSPARENT_BIN); //ss.setRenderBinDetails(99, "RenderBin"); // 使用更高的渲染顺序 }

五、传值驱动

bool EntityRadarScan::EntityUpdate(osg::Node* node, osg::NodeVisitor* nv) { setMatrix(GetLocationMatrix()); if (circle) { osg::StateSet* stateset = circle->getOrCreateStateSet(); osg::Uniform* simTime = stateset->getUniform("simTime"); if (simTime) { float alpha = (float)(osg::Timer::instance()->time_s())*2.0; //OSG_WARN << alpha << std::endl; simTime->set(alpha); } } return true; }

原创不易,记得点赞加关注哦,我会持续分享实用的功能(:-

http://www.jsqmd.com/news/527704/

相关文章:

  • MelonLoader:跨后端Unity游戏模组加载的技术解决方案
  • 2026 四川奢侈品回收与白银回收怎么选|本地正规机构综合参考 - 深度智识库
  • Goth安全最佳实践:防止CSRF攻击的5个关键步骤终极指南
  • SDXL 1.0电影级绘图工坊应用案例:制作个性化节日祝福图片
  • DeepSeek-R1-Distill-Qwen-1.5B工业落地案例:RK3588板卡实测解析
  • 企业网安必修课:联软数据交换系统漏洞排查与应急响应指南
  • Jupyter Notebook中%autoreload 2报错排查与高效调试技巧
  • 系统硬件工程师进阶之路--本安电路PCB布局与工艺实战
  • 终极MiroFish部署指南:3种方式快速搭建你的AI预测引擎
  • MinerU轻量级文档解析:在CPU上实现近乎实时的合同信息抽取
  • Ostrakon-VL-8B快速部署:Docker镜像一键拉取,10分钟上线WebUI
  • 实时手机检测-通用参数详解:置信度阈值/IOU/NMS对结果影响分析
  • 2026年山东工厂自动化升级战:如何选择决定未来竞争力的PLC伙伴? - 2026年企业推荐榜
  • Java、Python、NodeJS等开发环境安装及配置镜像加速到国内源
  • 2026年别墅电梯厂家推荐:室内电梯/老旧小区电梯/液压式电梯/载货电梯专业供应 - 品牌推荐官
  • nlp_structbert_sentence-similarity_chinese-large 在AIGC内容审核中的应用:生成文本与违规库相似度筛查
  • 网络工程师面试必看:如何用eNSP设计一个高可用的企业网?从VRRP、MSTP到防火墙策略详解
  • 2026年企业选型必看:五大geo公司技术底牌拆解与精准适配指南 - 品牌推荐
  • 如何构建Storm与HBase集成的实时NoSQL数据处理方案:完整指南
  • 有源钳位型三电平(ANPC)逆变器SVPWM闭环仿真探究
  • 终极HoloCubic智能家居集成指南:如何通过MQTT协议实现物联网设备互联
  • 2026年冷热冲击试验机行业洞察:主流品牌、市场格局与发展趋势 - 品牌推荐大师
  • 线段树区间查询区间修改函数
  • CentOS 7内网NTP服务器搭建全攻略:从零配置到多节点同步
  • VideoAgentTrek-ScreenFilter实时演示:低延迟直播流过滤系统搭建
  • 拒绝内耗,Shopee轻出海模式,轻门槛、低成本、高效率出海。 - 跨境小媛
  • Openclaw升级
  • 如何3秒获取百度网盘提取码?智能解析工具终极使用指南
  • 终极instant.page代码压缩与优化指南:快速提升网站性能的10个技巧
  • CLIP-GmP-ViT-L-14图文匹配工具参数详解:图像/文本编码器输出维度与logits归一化