//实现基于颜色的材质映射,只有一个地球//调用dll,而不是使用自源程序
int Metr_ClassificationOnlyOneEarth()
{osgViewer::Viewer *viewer = new osgViewer::Viewer;ref_ptr<osgDB::Options>  a = new osgDB::Options(std::string("noTriStripPolygons"));//读取一个模型数据osg::ref_ptr<osg::Node> earthNode = osgDB::readNodeFile("G:/YCThirdParty/EarthData/demo.earth", a);//osg::ref_ptr<osg::Node> earthNode = osgDB::readNodeFile("D:/OSG/osgEarth_2.7.0/src/applications/osgearth_package_qt/data/base.earth");if (!earthNode){OE_NOTICE << "Unable to load earth model" << std::endl;return 1;}//查询地图节点osgEarth::MapNode* mapNode = osgEarth::MapNode::findMapNode(earthNode);if (!mapNode){OE_NOTICE << "Could not find MapNode " << std::endl;return 1;}MyDllClass md;md.EarthShader(mapNode);//addSky(mapNode);osg::ref_ptr<osg::Group> root = new osg::Group();root->addChild(mapNode);//添加到场景viewer->setSceneData(root.get());viewer->getLight()->setAmbient(osg::Vec4f(0.0, 0.0, 0.0, 0.0));viewer->getLight()->setDiffuse(osg::Vec4f(0.0, 0.0, 0.0, 0.0));viewer->realize();return viewer->run();
}

自己建的一个类:

#pragma once
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport )//注意decl前面是两个下划线
#else
#define MYDLL_API __declspec(dllimport)
#endifnamespace MyDllSpace
{//导出类class MyDllClass{private:double a;public://导出的函数MYDLL_API MyDllClass();MYDLL_API void VirtualProgram(osgEarth::VirtualProgram* vp);MYDLL_API void EarthShader(osg::Group* root);};
}

类的代码如下:

#include <iostream>#define MYDLL_EXPORTS#include "MyDll.h"
MyDllSpace::MyDllClass::MyDllClass()
{
}MYDLL_API void MyDllSpace::MyDllClass::VirtualProgram(osgEarth::VirtualProgram* vp)
{{std::string haze_vertex = "varying vec3 v_pos;                          \n""varying vec3 oe_Normal;                                            \n""varying vec3 osg_Normal;                                           \n""void setup_haze(inout vec4 vertex)                                 \n""{                                                                  \n""   //v_pos = osg_Normal.xyz;                                       \n""   //v_pos = normalize(gl_NormalMatrix * gl_Normal);               \n""   v_pos = normalize(gl_NormalMatrix * gl_Normal);                 \n""   //v_pos = oe_Normal;                                            \n""}";//使用shader写rgb转lab空间std::string haze_fragment = "varying vec3 v_pos;                        \n""uniform vec3 direction_color;                                      \n""void apply_haze(inout vec4 color)                                  \n""{                                                                  \n""       float Metr_Color;                                           \n""       float RR =  255.0*(color.x);                                \n""       float GG =  255.0*(color.y);                                \n""       float BB =  255.0*(color.z);                                \n""if (RR>130 && BB<110)                                                  \n"//湿土地"{                                                                      \n""Metr_Color = 0.85f;                                                    \n""color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);                \n""}                                                                      \n""else                                                                   \n""{                                                                      \n""   if (RR>110 && GG>110 && BB>110 && GG<150 && RR<150 && BB<150)       \n"//城市沥青水泥"   {                                                                   \n""       Metr_Color = 0.9f;                                              \n""       color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);         \n""   }                                                                   \n""   else                                                                \n""   {                                                                   \n""       if (RR <157.0&& GG>52.0& GG < 98.0&BB>31.0&BB<78.0)             \n"//绿色植被"       {                                                               \n""           Metr_Color = 0.95f;                                         \n""           color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);     \n""       }                                                               \n""       else                                                            \n""       {                                                               \n""           if (RR >180.0&& GG>180.0&BB>180.0)                          \n"//冰川雪山————暂时未知"           {                                                           \n""               Metr_Color = 0.555555f;                                 \n""               color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f); \n""           }                                                           \n""           else                                                        \n""           {                                                           \n""               if ((BB <197.0&&BB >27.0&&RR>21 && RR<98 && GG>22.0&&GG < 148.0 && (!(RR <157.0&& GG>52.0& GG < 98.0&BB>31.0&BB<78.0))))    \n"//海洋水面"               {                                                                       \n""                   Metr_Color = 0.98f;                                                 \n""                   color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);             \n""               }                                                                       \n""               else                                                                    \n""               {                                                                       \n""                   if (RR>101 && GG>100 && BB>120 && (GG - BB>10) && (RR - GG>10))     \n"//干燥裸土"                   {                                                                   \n""                       Metr_Color = 0.80f;                                             \n""                       color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);         \n""                   }                                                                   \n""                   else                                                                \n""                   {                                                                   \n""                       Metr_Color = 0.930f;                                            \n""                       color = vec4(Metr_Color, Metr_Color, Metr_Color, 1.0f);         \n"//其他未知"                   }                                                                   \n""               }                                                                       \n""                                                                                       \n""           }                                                                           \n""                                                                                       \n""       }                                                                               \n""                                                                                       \n""   }                                                                                   \n""   }                                                                                   \n""}  ";//森林:RR <157.0&& GG>52.0& GG < 98.0&BB>31.0&BB<78.0//雪山:RR >180.0&& GG>180.0&BB>180.0//海洋:(BB <197.0&&BB >27.0&&RR>21&&RR<98&& GG>22.0&&GG < 148.0&&(!(RR <157.0&& GG>52.0& GG < 98.0&BB>31.0&BB<78.0)))//沙漠:( RR>121 &&GG>100&&BB>120&&(GG-BB>10)&&(RR-GG>10))(澳大利亚有一部分没有分进,可能是起步点设置太大)//城市:( RR>110 &&GG>110&&BB>110&&GG<150&&RR<150&&BB<150)//发射率表:{干燥裸土:0.8/0.4(发射率/反射率),低植覆盖:0.95/0.8,混凝土沥青:0.9/0.25,海面:0.98,湿土地:0.85/0.2}//参数1:被调用的函数名字,参数2:函数的字符串索引(也可能功能是文件的路径中的内容——待定),参数3:函数被加入的位置vp->setFunction("setup_haze", haze_vertex, osgEarth::ShaderComp::LOCATION_VERTEX_CLIP);//将自定义着色器函数setup_haze(),放在系统默认main函数中LOCATION_VERTEX_CLIP下面。vp->setFunction("apply_haze", haze_fragment, osgEarth::ShaderComp::LOCATION_FRAGMENT_COLORING);}}MYDLL_API void MyDllSpace::MyDllClass::EarthShader(osg::Group* root)
{{
#if 1{//自己写太阳法线着色2020年7月3日10:29:49,参考:可以实现从制动角度输入光源,和法相作用,在地球上产生光照效果,问题是:鼠标操作时,物体会移动,光源不移动,感觉是光源没有挂到这个地球的node上。而是和相机还是viewer还是视口跟着走了,需要进一步研究2020年7月6日17:02:34osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();stateset = root->getOrCreateStateSet();stateset->setMode(GL_LIGHTING, osg::StateAttribute::ON);                // 启用光照stateset->setMode(GL_LIGHT0, osg::StateAttribute::ON);              // 启用指定光源stateset->addUniform(new osg::Uniform("direction_color", osg::Vec3f(0.583867f, 0.714617f, 0.385256f)));     //0.583867       0.714617       0.385256osgEarth::VirtualProgram* vp = osgEarth::VirtualProgram::getOrCreate(stateset);VirtualProgram(vp);}
#endif }
}

http://www.taodudu.cc/news/show-1639519.html

相关文章:

  • OpenCV图像处理(0)——文件夹批量读取文件
  • OpenCV图像处理(1)——指定文件夹写入图像
  • OSG仿真案例(4)——创建烟雾粒子效果
  • OSG仿真案例(3)——cmake创建工程
  • OSG仿真案例(5)——模型的平移、缩放、旋转
  • OSG仿真案例(5)——创建火光、爆炸(碎片)
  • OpenCV图像处理(2)——形态学操作
  • OpenCV图像处理(3)——盒维数计算
  • OpenCV图像处理(4)——去除小面积
  • OpenCV图像处理(6)——轮廓标记
  • OpenCV图像处理(7)——图像上写TEXT
  • C++ 常见错误(00) —— C#调用c++做的dll是报错
  • C++ 常见错误(01) —— error LNK1104: 无法打开文件“avcodec.lib”
  • (1)癌症
  • C++ 常见错误(02) —— 将dll(用c++写的)处理的结果展示在界面上
  • C++ 常见错误(03) —— cout输出图像路径
  • OpenCV图像处理(9)——边缘提取方法对比
  • C++ 配置笔记
  • 深度学习(01)——安装anaconda
  • 深度学习(00)——GPU版本的TensorFlow
  • (0)图像处理界面——C#调用C++图像处理的DLL
  • OpenCV图像处理(12)——保存图像到指定位置
  • (0)C#开发环境构建——史上最容易理解的C#界面搭建
  • OpenCV图像处理(13)——指定区域截取和指定区域复制
  • (1)非对称加密
  • (1)非对称加密——RSA——史上最通俗的小白可看懂!
  • OSG仿真案例(7)——osg自动驾驶
  • OpenCV图像处理(14)——文件夹下所有图像转灰度
  • OSG仿真案例(8)——读取FBX格式文件并显示(无动画)
  • OSG仿真案例(9)——JY61陀螺仪控制飞机姿态

OSG仿真案例(0)相关推荐

  1. OSG仿真案例(9)——JY61陀螺仪控制飞机姿态

    前言 在调试osg中模型运动姿态时,总觉得直观性不够强.所以有了想买个硬件陀螺仪(当时并不知道这个硬件应该叫什么名字,在淘宝搜索角度传感器的). 几个驱动 1.CH340驱动 这个驱动在自带资源包里面 ...

  2. OSG仿真案例(8)——读取FBX格式文件并显示(无动画)

    包含的头 #include <iostream> #include <Windows.h> #include <osgDB/ReadFile> #include & ...

  3. OSG仿真案例(7)——osg自动驾驶

    由于在运行时.需要配置各种环境,所以将项目使用cmake生成,确实非常方便. cmake文件: cmake_policy(VERSION 3.9) project(你项目想取的名字 VERSION 0 ...

  4. OSG仿真案例(5)——创建火光、爆炸(碎片)

    创建火光.爆炸(碎片) 所使用的头文件#include "Include_mymap.h" #pragma once #include <osgGA/CameraManipu ...

  5. OSG仿真案例(5)——模型的平移、缩放、旋转

    这个程序显示的是一头牛,牛的身子朝向屏幕. image.png 旋转后,让牛头朝向屏幕外.如下图所示. image.png OSG中通过旋转模型来改变节点的姿态,使用类 MatrixTransform ...

  6. OSG仿真案例(3)——cmake创建工程

    通过cmake新建一个osg的工程 1.新建一个CMakeLists.txt文件,内容如下: cmake_policy(VERSION 3.9) cmake_minimum_required(VERS ...

  7. OSG仿真案例(4)——创建烟雾粒子效果

    创建烟雾的例子效果,并附在飞机上: #include <osgParticle/PrecipitationEffect> #include <osgParticle/Particle ...

  8. OSG仿真案例(1)

    整体代码的主函数部分如下: /*********************************************************main.cpp******************** ...

  9. OSG仿真案例(2)

    从路径中读取一个运动路径(本代码中,是从程序中直接输入三个点),系统自动计算之间插值,达到连续运动的目的.(控制相机的运动的动画漫游) int wavaModule() {int argc = 2;c ...

最新文章

  1. (转)VS2005 SP1发布,解决只能创建WebSite,无法创建Web Application项目的问题
  2. solaris vi 方向键问题
  3. WIN32创建居中对话框
  4. Consumer搭建
  5. 如何实现MindManager数据库导入数据连接
  6. android 代码签名apk,[Android]混淆代码后生成带签名的apk
  7. c语言用递归方法实现冒泡排序,C语言 冒泡排序 递归法
  8. 西部开源学习笔记《unit 2》
  9. 你的微信还安全吗?揭露清理僵尸粉的连环骗局
  10. 第26条:优先考虑泛型
  11. Python实现空间直角坐标转高斯克吕格平面坐标
  12. UI设计初学者必入门必看!
  13. Flink Checkpoint超时问题
  14. 技能二:数据库(MySQL)·【22江苏转本笔记】
  15. AI科普(一):什么是人工智能?
  16. onsubmit表单提交简单使用
  17. 企业如何建立商业生态系统
  18. HTML的标签与选择器
  19. 【可信计算】第十次课:TPM密码资源管理(二)
  20. FXS/FXO, BRI/PRI, IPPBX, IAD

热门文章

  1. matlab2c使用c++实现matlab函数系列教程-var函数
  2. Linux操作系统基本命令
  3. springdata和mysql_Spring Boot使用Spring Data JPA访问MySQL数据库
  4. (1)什么是socket(套接字)
  5. PHP/JS中获取当前页面的完整URL
  6. 测试管理工具实践(小组作业)
  7. perl学习之:肯定匹配和否定匹配
  8. 浏览器控制台console
  9. 小系统单据自动生成存储过程
  10. [转载] Python字符串操作方法详解