osg之黑夜背景地月系显示
目录
效果
代码
效果

代码
/**
* Lights test. This application is for testing the LightSource support in osgEarth.
* 灯光测试。此应用程序用于测试osgEarth中的光源支持。
*/
#include "stdafx.h"
#include <osgViewer/Viewer>
#include <osgEarth/Notify>
#include <osgEarth/Lighting>
#include <osgEarth/PhongLightingEffect>
#include <osgEarth/NodeUtils>
#include <osgEarthUtil/EarthManipulator>
#include <osgEarthUtil/ExampleResources>
#include <osgEarthUtil/Ephemeris>
#include <osgEarthUtil/Shadowing>#define LC "[lights] "using namespace osgEarth;
using namespace osgEarth::Util;int
usage(const char* name)
{OE_NOTICE<< "\nUsage: " << name << " file.earth" << std::endl<< MapNodeHelper().usage() << std::endl;return 0;
}// converts a double-precision Vec3d to an equivalent single-precision Vec4f position
// as needed for light positions.
// Vec3d转换为Vec4f ,根据光源位置的需要
osg::Vec4
worldToVec4(const osg::Vec3d& ecef)
{osg::Vec4 result(0.0f, 0.0f, 0.0f, 1.0f);osg::Vec3d d = ecef;while (d.length() > 1e6)// 避免光源位置太远??{d *= 0.1;result.w() *= 0.1;}return osg::Vec4(d.x(), d.y(), d.z(), result.w());
}// 生成随机颜色
osg::Vec4
randomColor()
{float r = (float)rand() / (float)RAND_MAX;float g = (float)rand() / (float)RAND_MAX;float b = (float)rand() / (float)RAND_MAX;return osg::Vec4(r, g, b, 1.0f);
}// 添加光源
osg::Group*
addLights(osg::View* view, osg::Node* root, int lightNum)
{// 获取地理坐标系MapNode* mapNode = MapNode::get(root);const SpatialReference* mapsrs = mapNode->getMapSRS();const SpatialReference* geosrs = mapsrs->getGeographicSRS();osg::Vec3d world;osg::Group* lights = new osg::Group();// Add a directional light that simulates the sun - but skip this if a sky// was already added in the earth file.// 添加模拟太阳的平行光// 但如果地球文件中已经添加了天空,则跳过此操作。if (lightNum == 0){// Ephemeris 星历表类,给出了自然发生的天体天体的位置;// 其中包括太阳和月亮。// 还包括一些相关的实用程序功能。Ephemeris e;DateTime dt(2016, 8, 10, 14.0);// 设置UTC时间CelestialBody sun = e.getSunPosition(dt); // 设置天体相对于地球的位置。world = sun.geocentric;// 太阳的地理位置// 定义太阳光osg::Light* sunLight = new osg::Light(lightNum++);world.normalize();// 归一化sunLight->setPosition(osg::Vec4d(world, 0.0));sunLight->setAmbient(osg::Vec4(0.2, 0.2, 0.2, 1.0));// 环境光照sunLight->setDiffuse(osg::Vec4(1.0, 1.0, 0.9, 1.0));// 漫反射光照// osg::LightSource 用于定义场景中的灯光的叶节点。osg::LightSource* sunLS = new osg::LightSource();sunLS->setLight(sunLight);lights->addChild(sunLS);// 为root节点 投射阴影ShadowCaster* caster = osgEarth::findTopMostNodeOfType<ShadowCaster>(root);if (caster){OE_INFO << "Found a shadow caster!\n";caster->setLight(sunLight);}std::cout << "because no skyNode,so create sunLS" << std::endl;}#if 1 // 这里主要是为测试加载其他光源// A red spot light. A spot light has a real position in space // and points in a specific direciton. The Cutoff and Exponent// properties control the cone angle and sharpness, respectively// 一束红光。拥有真实的位置和光方向。// “Cutoff”和“Exponent”属性分别控制圆锥体角度和锐度{// 定义光照射 地点GeoPoint p(geosrs, -121, 34, 5000000., ALTMODE_ABSOLUTE);p.toWorld(world);// 定义光osg::Light* spot = new osg::Light(lightNum++);spot->setPosition(worldToVec4(world));spot->setAmbient(osg::Vec4(0, 0.2, 0, 1));spot->setDiffuse(osg::Vec4(1, 0, 0, 1));spot->setSpotCutoff(20.0f);spot->setSpotExponent(100.0f);// point straight down at the map:直接指向地图world.normalize();spot->setDirection(-world);// 光源叶子节点osg::LightSource* spotLS = new osg::LightSource();spotLS->setLight(spot);lights->addChild(spotLS);}// A green point light. A Point light lives at a real location in // space and lights equally in all directions.// 绿灯。点光源位于空间中的真实位置,并在所有方向上均匀发光。{// 定义光照射 地点GeoPoint p(geosrs, -45, -35, 1000000., ALTMODE_ABSOLUTE);p.toWorld(world);// 定义光osg::Light* point = new osg::Light(lightNum++);point->setPosition(worldToVec4(world));point->setAmbient(osg::Vec4(0, 0, 0, 1));point->setDiffuse(osg::Vec4(1.0, 1.0, 0.0, 1));// 光源叶子节点osg::LightSource* pointLS = new osg::LightSource();pointLS->setLight(point);lights->addChild(pointLS);}
#endif// Generate the necessary uniforms for the shaders.// 为着色器生成必要的uniforms。// GenerateGL3LightingUniforms类的作用:遍历图形,查找灯光和材质,// 并为它们生成静态 Uniforms 或动态剔除回调,// 以便它们可以使用核心配置文件着色器。GenerateGL3LightingUniforms gen;lights->accept(gen);return lights;
}int
main(int argc, char** argv)
{osg::ArgumentParser arguments(&argc, argv);// help?if (arguments.read("--help"))return usage(argv[0]);// create a viewer:osgViewer::Viewer viewer(arguments);// Whether to test updating material// 是否测试更新材质bool update = arguments.read("--update");// Tell the database pager to not modify the unref settingsviewer.getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false);// install our default manipulator (do this before calling load)viewer.setCameraManipulator(new EarthManipulator(arguments));// disable the small-feature cullingviewer.getCamera()->setSmallFeatureCullingPixelSize(-1.0f);// 在添加光源之前,需要关闭viewer本身的光viewer.setLightingMode(viewer.NO_LIGHT);// load an earth file, and support all or our example command-line optionsosg::ref_ptr<osg::Node> node = MapNodeHelper().load(arguments, &viewer);if (node.valid()){MapNode* mapNode = MapNode::get(node.get());if (!mapNode)return -1;// Example of a custom material for the terrain.// 地形自定义材质示例。osg::ref_ptr< osg::Material > material = 0;if (update)// 开启update属性后,会创建material,进而调用回调方法,随机更改影像颜色{OE_NOTICE << "Custom material" << std::endl;material = new osg::Material;// 材质决定材质颜色material->setDiffuse(osg::Material::FRONT, osg::Vec4(1, 1, 1, 1));//漫反射光照 material->setAmbient(osg::Material::FRONT, osg::Vec4(1, 1, 1, 1));// 环境光照// Attach our StateAttributeCallback so that uniforms are updated.绑定材质回调material->setUpdateCallback(new MaterialCallback());mapNode->getOrCreateStateSet()->setAttributeAndModes(material);}// Does a Sky already exist (loaded from the earth file)?SkyNode* sky = osgEarth::findTopMostNodeOfType<SkyNode>(node.get());if (!sky)// 如果没有深空节点{std::cout << "no skyNode " << std::endl;// Add phong lighting.添加标签照明???PhongLightingEffect* phong = new PhongLightingEffect();phong->attach(node->getOrCreateStateSet());}// 添加光源. 当没有sky时,才会采用addLights中,创建光源的方式添加。osg::Group* lights = addLights(&viewer, node.get(), sky ? 1 : 0);mapNode->addChild(lights);viewer.setSceneData(node.get());while (!viewer.done()){if (viewer.getFrameStamp()->getFrameNumber() % 100 == 0){// 每100帧,随机生成一个颜色if (material){material->setDiffuse(osg::Material::FRONT, randomColor());}}viewer.frame();}return 0;}else{return usage(argv[0]);}
}
相关文章:
osg之黑夜背景地月系显示
目录 效果 代码 效果 代码 /** * Lights test. This application is for testing the LightSource support in osgEarth. * 灯光测试。此应用程序用于测试osgEarth中的光源支持。 */ #include "stdafx.h" #include <osgViewer/Viewer> #include <osgEarth/N…...
持续交付-Jenkinsfile 语法
实现 Pipeline 功能的脚本语言叫做 Jenkinsfile,由 Groovy 语言实现。Jenkinsfile 一般是放在项目根目录,随项目一起受源代码管理软件控制,无需像创建"自由风格"项目一样,每次可能需要拷贝很多设置到新项目,…...
IDEA重新choose source
大概现状是这样:之前有个工程,依赖了别的模块基础包,但当时并没有依赖包的源码工程,因此,通过鼠标左键点进去,看到的是jar包里的class文件,注释什么的都去掉了的,不好看。后面有这个…...
解析虚拟文件系统的调用
Linux 可以支持多达数十种不同的文件系统。它们的实现各不相同,因此 Linux 内核向用户空间提供了虚拟文件系统这个统一的接口,来对文件系统进行操作。它提供了常见的文件系统对象模型,例如 inode、directory entry、mount 等,以及…...
佳能相机拍出来的dat文件怎么修复为正常视频
3-3 佳能相机是普通人用得最多的相机之一,也有一些专业机会用于比较重要的场景,比如婚庆、会议录像、家庭录像使用等。 但作为电子产品,经常会出现一些奇怪的故障,最严重的应该就是拍出来的东西打不开了。 本文案例是佳能相机拍…...
OAuth2.0双令牌
OAuth 2.0是一种基于令牌的身份验证和授权协议,它允许用户授权第三方应用程序访问他们的资源,而不必共享他们的凭据。 在OAuth 2.0中,通常会使用两种类型的令牌:访问令牌和刷新令牌。访问令牌是用于访问资源的令牌,可…...
Django(二、静态文件的配置、链接数据库MySQL)
文章目录 一、静态文件及相关配置1.以登录功能为例2.静态文件3.资源访问4.静态文件资源访问如何解决? 二、静态文件相关配置1. 如何配置静态文件配置?2.接口前缀3. 接口前缀动态匹配4. form表单请求方法补充form表单要注意的点 三、request对象方法reque…...
Linux 本地Yearning SQL审核平台远程访问
文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用…...
Leetcode—226.翻转二叉树【简单】
2023每日刷题(二十四) Leetcode—226.翻转二叉树 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...
【阿里云】任务2-OSS对象存储教程(找我参加活动可获得京东卡奖励)
目录 前言说明第一步第二步第三步:开通并使用OSS传输加速三、清理第四步-提交作品第五步-提交记录到小程序 前言 本次任务是阿里云官方发出的,每个任务30软妹币,欢迎大家加入我的活动群,门槛很低,所有人都可以参加&…...
人工智能模型转ONNX 连接摄像头使用ONNX格式的模型进行推理
部署之后模型的运算基本上能快5倍。本地部署之后,联网都不需要,数据和隐私不像在网上那样容易泄露了。 模型部署的通用流程 各大厂商都有自己的推理工具。 训练的归训练,部署的归部署,人工智能也分训练端和部署端,每一…...
osgEarth之添加shp
目录 效果 代码 代码分析 加载模式 效果 代码 #include "stdafx.h" #include <osg/Notify> #include <osgGA/StateSetManipulator> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers>#include <osgEarth/MapNo…...
Eolink Apikit 版本更新:「数据字典」功能上线、支持 MongoDB 数据库操作、金融行业私有化协议、GitLab 生成 API 文档...
🎉 新增 搭建自定义接口协议架构,支持快速适配金融行业各类型私有协议的导入、编辑和展示。 数据字典功能上线,支持以数据字典的形式管理参数枚举值; 数据库连接支持 MongoDB 数据库操作; 基于 Apikit 类型导入 API…...
GPT-4V:AI在医疗领域的应用
OpenAI最新发布的GPT-4V模型为ChatGPT增添了语音和图像功能,为用户提供了更多在日常生活中使用ChatGPT的方式。这次更新将为用户带来更加便捷、直观的交互体验,用户可以直接通过拍照上传图片,并提出相关问题。OpenAI的最终目标是构建一个安全…...
OpenCV 在ImShow窗体上选择感兴趣的区域
窗体上选择感兴趣ROI区域 在计算机视觉处理中, 通常是针对图像中的一个特定区域进行处理, 有时候这个特定区域需要人来选择, OpenCV 也提供了窗口选择ROI机制. 窗体支持两种选择ROI区域的方法, 一个是单选, 一个是多选, 操作方法如下: 单选: 通过鼠标在屏幕上选择区域, 然后通过…...
ubuntu 安装redis详细教程
下载redis安装包 链接如下: http://redis.io/download 本例版本为:redis-7.2.3.tar.gz 下载安装包到目录/opt下,路径可修改,本例为/opt wget https://github.com/redis/redis/archive/7.2.3.tar.gz 解压安装包,并…...
qframework 架构 (作者:凉鞋)使用笔记
一些准则: 根据VIEW->SYSTEM->MODEL的分层架构 初始架构: app. using FrameworkDesign;namespace ShootingEditor2D(项目的命名空间) {public class ShootingEditor2D (游戏名称): Architecture&l…...
【JMeter】定时器分类以及场景介绍
1. 定时器分类 固定定时器 作用:请求之间设置等待时间应用场景:查询商品列表后,去查看列表商品详情页。针对商品列表数据量比较大的,响应时间会比较长,就需要设置等待时间然后去查看商详 2.定时器的作用域࿱…...
Spring Boot 请求/actuator/beans 无法访问 返回404
问题复现 在保证项目加入了spring-boot-starter-actuator依赖,并成功启动后。通过浏览器进行访问,返回如下图结果: 问题排查 1. 查看日志 从日志中可以看到基于路径’/actuator’下只暴露了一个端点 2. 访问http://localhost:8080/actua…...
AVD联网
AVD联网: 解决Android Studio模拟器无法联网_android studio模拟器没有网络-CSDN博客 挺好的,就是访问网站的时候只能用ip,而不能用域名。 AVD设置代理: android studio踩坑记 AVD模拟器代理设置_android studio avd 配置代理-…...
从零开始设计Jetson Nano载板:电源、USB到MIPI,我的踩坑与实战笔记
从零开始设计Jetson Nano载板:电源、USB到MIPI,我的踩坑与实战笔记 去年夏天,当我第一次拿到Jetson Nano模组时,完全没想到这个巴掌大的开发板会让我在接下来三个月里经历如此多的"惊喜"。作为一位嵌入式硬件工程师&…...
基于多模态大模型的手机自动化新范式:从视觉理解到精准操作
1. 项目概述:当你的手机学会自己“点”屏幕 最近在跟几个做移动端测试和自动化的朋友聊天,大家普遍头疼一个问题:现在App功能越来越复杂,UI元素动态加载、嵌套层级深、甚至有些组件压根不暴露可访问性信息,传统的基于控…...
TV Bro浏览器终极指南:在智能电视上享受完整上网体验的简单教程
TV Bro浏览器终极指南:在智能电视上享受完整上网体验的简单教程 【免费下载链接】tv-bro Simple web browser for android optimized to use with TV remote 项目地址: https://gitcode.com/gh_mirrors/tv/tv-bro TV Bro是一款专为智能电视和Android电视盒优…...
2026年除铁器磁选机优选指南
随着工业技术的不断进步,除铁器磁选机在矿山、冶金、化工等行业中的应用越来越广泛。选择一款高效、可靠的除铁器磁选机对于企业来说至关重要。本文将从多个角度分析如何选择适合您的除铁器磁选机,并推荐一个值得信赖的品牌——云海机械。一、了解除铁器…...
Rust的#[repr(packed)]数据密集
Rust的#[repr(packed)]数据密集:内存优化的利器 在系统编程领域,内存布局的精细控制往往是性能优化的关键。Rust作为一门注重安全与效率的语言,提供了#[repr(packed)]这一强大属性,允许开发者彻底消除结构体的内存对齐填充&#…...
免费实用的SketchUp STL插件:从3D建模到3D打印的完整指南
免费实用的SketchUp STL插件:从3D建模到3D打印的完整指南 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 你是否曾…...
如何用LunaTranslator打破游戏语言壁垒:3种实时翻译方法全解析
如何用LunaTranslator打破游戏语言壁垒:3种实时翻译方法全解析 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator 还在为看不懂日文游戏剧情而烦恼吗?…...
C程序员必须立即升级的4类函数签名——2026规范已废止`gets`/`strcpy`等12个API(附自动化检测脚本)
更多请点击: https://intelliparadigm.com 第一章:现代 C 语言内存安全编码规范 2026 概述 C 语言在嵌入式系统、操作系统内核及高性能基础设施中仍占据不可替代地位,但其原始内存模型长期带来缓冲区溢出、悬垂指针、未初始化内存访问等高危…...
OpenRGB:告别多品牌RGB软件混乱,一站式跨平台灯光控制解决方案
OpenRGB:告别多品牌RGB软件混乱,一站式跨平台灯光控制解决方案 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgramm…...
【2026嵌入式开发生存清单】:VSCode调试适配成功率从41%→98%的关键7项内核级配置(含vsc-extension-host内存泄漏规避方案)
更多请点击: https://intelliparadigm.com 第一章:嵌入式调试适配率跃迁的底层逻辑与2026版VSCode内核演进 现代嵌入式开发正经历一场由调试协议抽象层(DAP v3.2)、LLVM-MI 优化栈和轻量级目标代理(如 probe-rs-debug…...
