OSG天空图代码

osgEarth

    // 创建天空选项osgEarth::Util::SkyOptions skyOptions;// 设置天空的坐标系统(可选)skyOptions.coordinateSystem() = osgEarth::Util::SkyOptions::COORDSYS_ECEF;// 设置一天中的小时数(可选)skyOptions.hours() = 12.0f; // 中午// 设置环境光级别(可选)skyOptions.ambient() = 0.5f; // 50%的环境光// 使用选项创建天空节点osg::ref_ptr<osgEarth::Util::SkyNode> skyNode = osgEarth::Util::SkyNode::create(skyOptions);// 设置天空节点的日期和时间osgEarth::DateTime dateTime(2024, 6, 5, 12); // 2024年6月5日中午skyNode->setDateTime(dateTime);osgEarth::Util::Ephemeris* ephemeris = new osgEarth::Util::Ephemeris;skyNode->setEphemeris(ephemeris);// 设置天空节点的参考点(对于投影地图)osgEarth::GeoPoint refPoint(getMapNode()->getMapSRS(), 0, 0, 0); // 地球中心skyNode->setReferencePoint(refPoint);skyNode->setLighting(true);_root->addChild(skyNode);skyNode->attach(_viewer,0);//运行了 osgEarth 中的着色器生成器,通过对 _root 中的节点进行分析和处理,生成对应的着色器代码。着色器生成器根据节点的材质、光照、纹理等属性,自动生成相应的顶点着色器和片段着色器代码,以实现渲染效果。osgEarth::Registry::shaderGenerator().run(_root.get());
//    对根节点 _root 及其子节点中的所有状态集合进行优化。这个优化过程尝试将相同的状态合并为一个,以减少OpenGL状态切换次数,从而提高渲染性能。StateSetCache *cache = osgEarth::Registry::stateSetCache();cache->optimize(_root.get());// 添加场景数据_viewer->setSceneData(_root.get());``````cpp
class MoveEarthySkyWithEyePointTransform : public osg::Transform {
public:virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix, osg::NodeVisitor* nv) const override {osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);if (cv) {osg::Vec3 eyePointLocal = cv->getEyeLocal();matrix.preMult(osg::Matrix::translate(eyePointLocal));}return true;}virtual bool computeWorldToLocalMatrix(osg::Matrix& matrix, osg::NodeVisitor* nv) const override {osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);if (cv) {osg::Vec3 eyePointLocal = cv->getEyeLocal();matrix.postMult(osg::Matrix::translate(-eyePointLocal));}return true;}
};// Update texture matrix for cubemaps
struct TexMatCallback : public osg::NodeCallback {
public:TexMatCallback(osg::TexMat& tm) : _texMat(tm) {}virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) override {osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);if (cv) {const osg::Matrix& MV = *(cv->getModelViewMatrix());const osg::Matrix R = osg::Matrix::rotate(osg::DegreesToRadians(112.0f), 0.0f, 0.0f, 1.0f) *osg::Matrix::rotate(osg::DegreesToRadians(90.0f), 1.0f, 0.0f, 0.0f);osg::Quat q = MV.getRotate();const osg::Matrix C = osg::Matrix::rotate(q.inverse());_texMat.setMatrix(C * R);}traverse(node, nv);}osg::TexMat& _texMat;
};class CSkyLight {
public:osg::TextureCubeMap* readCubeMap(const std::string& path) {osg::TextureCubeMap* cubemap = new osg::TextureCubeMap;osg::Image* images[6];
//        std::string faces[6] = {"front3", "back3", "right3", "left3", "bottom3", "top3"};
//        std::string faces[6] = {"front3", "back3", "top3", "bottom3", "left3", "right3"};std::string faces[6] = {"front3", "back3", "bottom3", "top3", "left3", "right3"};osg::TextureCubeMap::Face faceEnums[6] = {osg::TextureCubeMap::POSITIVE_X,osg::TextureCubeMap::NEGATIVE_X,osg::TextureCubeMap::POSITIVE_Y,osg::TextureCubeMap::NEGATIVE_Y,osg::TextureCubeMap::POSITIVE_Z,osg::TextureCubeMap::NEGATIVE_Z};for (int i = 0; i < 6; ++i) {images[i] = osgDB::readImageFile(path + faces[i] + ".png");if (!images[i]) return nullptr;cubemap->setImage(faceEnums[i], images[i]);}cubemap->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);cubemap->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);cubemap->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);cubemap->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);cubemap->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);return cubemap;}osg::Node* createSkyBox(const std::string& path) {osg::StateSet* stateset = new osg::StateSet();osg::TexEnv* te = new osg::TexEnv;te->setMode(osg::TexEnv::REPLACE);stateset->setTextureAttributeAndModes(0, te, osg::StateAttribute::ON);osg::TexGen* tg = new osg::TexGen;tg->setMode(osg::TexGen::NORMAL_MAP);stateset->setTextureAttributeAndModes(0, tg, osg::StateAttribute::ON);osg::TexMat* tm = new osg::TexMat;stateset->setTextureAttribute(0, tm);osg::TextureCubeMap* skymap = readCubeMap(path);stateset->setTextureAttributeAndModes(0, skymap, osg::StateAttribute::ON);stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);stateset->setMode(GL_CULL_FACE, osg::StateAttribute::OFF);osg::Depth* depth = new osg::Depth;depth->setFunction(osg::Depth::ALWAYS);depth->setRange(1.0, 1.0);stateset->setAttributeAndModes(depth, osg::StateAttribute::ON);stateset->setRenderBinDetails(-1, "RenderBin");osg::Drawable* drawable = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f), 1));osg::Geode* geode = new osg::Geode;geode->setCullingActive(false);geode->setStateSet(stateset);geode->addDrawable(drawable);osg::Transform* transform = new MoveEarthySkyWithEyePointTransform;transform->setCullingActive(false);transform->addChild(geode);osg::ClearNode* clearNode = new osg::ClearNode;clearNode->setCullCallback(new TexMatCallback(*tm));clearNode->addChild(transform);return clearNode;}
};
int main() {osgViewer::Viewer viewer;viewer.setUpViewInWindow(100, 100, 800, 600);osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("./osgb/Tractor.OSGB");if (!model){std::cout << "无法加载模型" << std::endl;return 1;}osg::ref_ptr<osg::Group> geode = new osg::Group;geode->addChild(model);CSkyLight c;geode->addChild(c.createSkyBox("./osgb/"));viewer.setSceneData(geode);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/23345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现社区养老服务系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现社区养老服务系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本社区养老服务系统就是在这样的大环境下诞生&#xff0c;其可以帮助…

Al2O3/SiC纳米复相陶瓷力学性能显著提升 我国研究机构数量较多

Al2O3/SiC纳米复相陶瓷力学性能显著提升 我国研究机构数量较多 Al2O3/SiC纳米复相陶瓷&#xff0c;是以氧化铝&#xff08;Al2O3&#xff09;为基体相&#xff0c;以纳米碳化硅&#xff08;SiC&#xff09;为第二相&#xff0c;将第二相纳米颗粒弥散进入基体相&#xff0c;经高…

Google Inventor一款适合儿童的趣味APP编程开发平台

Google Inventor 其实是指 App Inventor&#xff0c;这是由 Google 开发并由麻省理工学院&#xff08;MIT&#xff09;继续维护和发展的一个应用程序开发平台。 App Inventor 的主要特点和用途如下&#xff1a; 什么是 App Inventor&#xff1f; App Inventor 是一个基于 W…

uni-app基础框架搭建(vue3+ts+vite)

1.基础准备 uni-app官网uni-app,uniCloud,serverless,环境安装,创建uni-app,自定义模板,国内特殊情况,更新依赖到指定版本,运行、发布uni-app,运行并发布快应用,运行并发布快应用(webview),运行并发布快应用(webview)-华为,cli创建项目和HBuilderX可视化界面创https://uniapp.…

中科数安 | 透明加密防泄密系统!如何有效防止企业内部核心数据资料外泄?

中科数安提供的透明加密防泄密系统是一种专为企业设计的数据保护解决方案&#xff0c;它通过以下关键特性有效防止企业内部核心数据资料外泄&#xff1a; PC地址&#xff1a;——www.weaem.com 自动智能透明加密&#xff1a;系统能够在操作系统级别无缝集成&#xff0c;对指定类…

AC/DC电源模块:跟踪技术的创新之选

BOSHIDA AC/DC电源模块&#xff1a;跟踪技术的创新之选 AC/DC电源模块是一种将交流电转换为直流电的设备&#xff0c;广泛应用于各个领域的电子设备中。随着现代科技的发展&#xff0c;对电子设备的要求越来越高&#xff0c;需要能够提供更稳定、更高效的电源。AC/DC电源模块…

从零开始写 Docker(十七)---容器网络实现(中):为容器插上”网线“

本文为从零开始写 Docker 系列第十七篇&#xff0c;利用 linux 下的 Veth、Bridge、iptables 等等相关技术&#xff0c;构建容器网络模型&#xff0c;为容器插上”网线“。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实…

BERT应用——文本间关联性分析

本文结合了自然语言处理&#xff08;NLP&#xff09;和深度学习技术&#xff0c;旨在分析一段指定的任务文本中的动词&#xff0c;并进一步探讨这个动词与一系列属性之间的关联性。具体技术路径包括文本的词性标注、语义编码和模型推断。 一、技术思路 NLP和词性标注 在自然…

独著出书的出版流程是怎样的?

独著出书的出版流程一般包括以下几个步骤&#xff1a; 1. 准备书稿&#xff1a;确保书稿内容完整、准确&#xff0c;并符合出版社的要求。 2. 选择出版社&#xff1a;根据书稿的主题和内容&#xff0c;选择合适的出版社。可以考虑出版社的专业性、声誉和出版范围等因素。 3.…

MySQL Shell 使用指南

前言&#xff1a; MySQL Shell 是官方提供的 MySQL 周边适配组件&#xff0c;是新一代的高级客户端&#xff0c;在 MySQL 8.0 及其以后的版本得以慢慢推广应用。之前笔者因为 MySQL 8.0 用得比较少&#xff0c;一直没有详细使用过这个工具&#xff0c;近期在捣鼓 MySQL 8.0&am…

如何去掉IDEA中烦人的警告波浪线

有时候想去掉idea中那些黄色的红色的warning波浪线&#xff0c;这些不是错误&#xff0c;并不影响执行&#xff0c;一直显示显得让人很烦躁&#xff0c;去"Editor" -> "Inspections"中一个个设置很麻烦。 可以通过设置代码检测级别来降低代码检查的严格…

ChatGPT Prompt技术全攻略-入门篇:AI提示工程基础

系列篇章&#x1f4a5; No.文章1ChatGPT Prompt技术全攻略-入门篇&#xff1a;AI提示工程基础2ChatGPT Prompt技术全攻略-进阶篇&#xff1a;深入Prompt工程技术3ChatGPT Prompt技术全攻略-高级篇&#xff1a;掌握高级Prompt工程技术4ChatGPT Prompt技术全攻略-应用篇&#xf…

文献解读-肿瘤测序-第六期|《基于CRISPR/Cas9技术的肿瘤突变负荷测量新参考物质的开发》

关键词&#xff1a;肿瘤测序&#xff1b;基因组变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Development of a Novel Reference Material for Tumor Mutational Burden Measurement Based on CRISPR/Cas9 Technolog标题&#xff08;中文&…

【协同感知】Collaborative Perception in Autonomous Driving数据集与论文整理

Collaborative Perception in Autonomous Driving 目前最全的Collaborative Perception整理数据集协同感知论文-【三维目标检测】现实世界下的协同感知理想条件下的协同感知 目前最全的Collaborative Perception整理 https://github.com/Little-Podi/Collaborative_Perception…

【探索全球精彩瞬间,尽享海外短剧魅力!海外短剧系统,您的专属观影平台】

&#x1f31f; 海外短剧系统&#xff0c;带您走进一个全新的视界&#xff0c;让您随时随地欣赏到来自世界各地的精选短剧。在这里&#xff0c;您可以感受到不同文化的碰撞&#xff0c;品味到各种题材的精髓&#xff0c;让您的生活更加丰富多彩&#xff01; &#x1f3ac; 精选…

【Python】【Pyinstaller】打包过程问题记录及解决

一、写在前面 将python脚本打包成.exe可执行文件&#xff0c;使用windows电脑运行。 所需库&#xff1a;pyinstaller 官网链接 命令格式&#xff1a; pyinstaller -F -w (需要打包的文件&#xff0c;文件名之间用空格分隔&#xff09;二、打包步骤&#xff08;见图片&#x…

自费出书一般需要多少钱?

自费出书的费用因多种因素而异&#xff0c;包括书号费、审稿费、排版费、封面设计费、纸张及印刷费、仓储物流费等。 以下是一些常见的费用项目和大致价格范围&#xff1a; - 书号费&#xff1a;书号是出版社的特有资源&#xff0c;书号费用在2023年又进一步上涨。目前&#…

Windows文件管理器导航窗口怎么删除第三方生成的无效导航【笔记】

Windows文件管理器导航窗口怎么删除第三方生成的无效导航【笔记】 导航窗口对应项目没有右击删除选项。 提示&#xff1a; 位置不可用 C:\Users\superman…不可用&#xff0c;如果该位置位于这台电脑上&#xff0c;请确保设备或驱动器连接&#xff0c;或者光盘已插入&#xf…

【恶补计算机基础】定点数和浮点数

在计算机中&#xff0c;小数点及其位置并不是显式表示出来的&#xff0c;而是隐含规定的。根据小数点的位置&#xff0c;可以分为两类&#xff1a;定点数和浮点数。 1 定点数 小数点的位置是固定不变的。根据小数点的具体位置&#xff0c;又可以分为两类&#xff1a;定点小数…

Linux-vi编辑器命令使用

一、初始-vi 1、 vi-打开文件并且定位行 有可能会遇到打开一个文件&#xff0c;并定位到指定行的情况 例如&#xff0c;知道某一行代码有错误&#xff0c;可以快速定位到出错代码的位置 可以使用以下命令打开文件$ vi 文件名 行数 提示&#xff1a;如果只带上 而不指定行号&…