OSG仿真案例(0)
//实现基于颜色的材质映射,只有一个地球//调用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)相关推荐
- OSG仿真案例(9)——JY61陀螺仪控制飞机姿态
前言 在调试osg中模型运动姿态时,总觉得直观性不够强.所以有了想买个硬件陀螺仪(当时并不知道这个硬件应该叫什么名字,在淘宝搜索角度传感器的). 几个驱动 1.CH340驱动 这个驱动在自带资源包里面 ...
- OSG仿真案例(8)——读取FBX格式文件并显示(无动画)
包含的头 #include <iostream> #include <Windows.h> #include <osgDB/ReadFile> #include & ...
- OSG仿真案例(7)——osg自动驾驶
由于在运行时.需要配置各种环境,所以将项目使用cmake生成,确实非常方便. cmake文件: cmake_policy(VERSION 3.9) project(你项目想取的名字 VERSION 0 ...
- OSG仿真案例(5)——创建火光、爆炸(碎片)
创建火光.爆炸(碎片) 所使用的头文件#include "Include_mymap.h" #pragma once #include <osgGA/CameraManipu ...
- OSG仿真案例(5)——模型的平移、缩放、旋转
这个程序显示的是一头牛,牛的身子朝向屏幕. image.png 旋转后,让牛头朝向屏幕外.如下图所示. image.png OSG中通过旋转模型来改变节点的姿态,使用类 MatrixTransform ...
- OSG仿真案例(3)——cmake创建工程
通过cmake新建一个osg的工程 1.新建一个CMakeLists.txt文件,内容如下: cmake_policy(VERSION 3.9) cmake_minimum_required(VERS ...
- OSG仿真案例(4)——创建烟雾粒子效果
创建烟雾的例子效果,并附在飞机上: #include <osgParticle/PrecipitationEffect> #include <osgParticle/Particle ...
- OSG仿真案例(1)
整体代码的主函数部分如下: /*********************************************************main.cpp******************** ...
- OSG仿真案例(2)
从路径中读取一个运动路径(本代码中,是从程序中直接输入三个点),系统自动计算之间插值,达到连续运动的目的.(控制相机的运动的动画漫游) int wavaModule() {int argc = 2;c ...
最新文章
- (转)VS2005 SP1发布,解决只能创建WebSite,无法创建Web Application项目的问题
- solaris vi 方向键问题
- WIN32创建居中对话框
- Consumer搭建
- 如何实现MindManager数据库导入数据连接
- android 代码签名apk,[Android]混淆代码后生成带签名的apk
- c语言用递归方法实现冒泡排序,C语言 冒泡排序 递归法
- 西部开源学习笔记《unit 2》
- 你的微信还安全吗?揭露清理僵尸粉的连环骗局
- 第26条:优先考虑泛型
- Python实现空间直角坐标转高斯克吕格平面坐标
- UI设计初学者必入门必看!
- Flink Checkpoint超时问题
- 技能二:数据库(MySQL)·【22江苏转本笔记】
- AI科普(一):什么是人工智能?
- onsubmit表单提交简单使用
- 企业如何建立商业生态系统
- HTML的标签与选择器
- 【可信计算】第十次课:TPM密码资源管理(二)
- FXS/FXO, BRI/PRI, IPPBX, IAD