每日一练(三) pointSprite(点精灵)
点精灵实现:
1、创建点集合
osg::Node* PointSpriteImpl::MakeGalaxy(int nVertices)
{osg::Geode* geode = new osg::Geode();osg::Geometry* galaxy = new osg::Geometry();osg::Vec3Array* vertices = new osg::Vec3Array();osg::Vec4Array* clors = new osg::Vec4Array();osg::Vec4 ini(1,1,0,1);osg::Vec4 fin(0,0,1,1);// 生成两个漩涡for(int i = 0; i < nVertices/2; ++i){ // 等分圆的角度 2/nvertices 份float val = (i*2/(float)nVertices * 2* osg::PI);float modx1 = rand() / (float)RAND_MAX*2;float mody1 = rand() / (float)RAND_MAX*2;float modx2 = rand() / (float)RAND_MAX*2;float mody2 = rand() / (float)RAND_MAX*2;float modz1 = ((rand() - RAND_MAX/2) / (float)(RAND_MAX))*3/(val+1);float modz2 = ((rand() - RAND_MAX/2) / (float)(RAND_MAX))*3/(val+1);vertices->push_back(osg::Vec3(cos(val)* val + modx1,sin(val) * val + mody1,modz1));vertices->push_back(osg::Vec3(-cos(val)* val + modx2,-sin(val) * val + mody2,modz2));clors->push_back(ini + (fin - ini)*(i*2/(float)nVertices));clors->push_back(ini+ (fin - ini)*(i*2/(float)nVertices));}galaxy->setVertexArray(vertices);galaxy->setColorArray(clors);galaxy->setColorBinding(osg::Geometry::BIND_PER_VERTEX);galaxy->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS,0,nVertices));geode->addDrawable(galaxy);return geode;
}osg::Node* PointSpriteImpl::MakeGalaxy(int nVertices)
{osg::Geode* geode = new osg::Geode();osg::Geometry* galaxy = new osg::Geometry();osg::Vec3Array* vertices = new osg::Vec3Array();osg::Vec4Array* clors = new osg::Vec4Array();osg::Vec4 ini(1,1,0,1);osg::Vec4 fin(0,0,1,1);// 生成两个漩涡for(int i = 0; i < nVertices/2; ++i){ // 等分圆的角度 2/nvertices 份float val = (i*2/(float)nVertices * 2* osg::PI);float modx1 = rand() / (float)RAND_MAX*2;float mody1 = rand() / (float)RAND_MAX*2;float modx2 = rand() / (float)RAND_MAX*2;float mody2 = rand() / (float)RAND_MAX*2;float modz1 = ((rand() - RAND_MAX/2) / (float)(RAND_MAX))*3/(val+1);float modz2 = ((rand() - RAND_MAX/2) / (float)(RAND_MAX))*3/(val+1);vertices->push_back(osg::Vec3(cos(val)* val + modx1,sin(val) * val + mody1,modz1));vertices->push_back(osg::Vec3(-cos(val)* val + modx2,-sin(val) * val + mody2,modz2));clors->push_back(ini + (fin - ini)*(i*2/(float)nVertices));clors->push_back(ini+ (fin - ini)*(i*2/(float)nVertices));}galaxy->setVertexArray(vertices);galaxy->setColorArray(clors);galaxy->setColorBinding(osg::Geometry::BIND_PER_VERTEX);galaxy->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS,0,nVertices));geode->addDrawable(galaxy);return geode;
}
2、设置stateset属性
osg::StateSet* PointSpriteImpl::MakeStateSet(int nSize)
{osg::StateSet* stateSet = new osg::StateSet(); // set cool blending stateSet->setMode(GL_BLEND,osg::StateAttribute::ON);osg::BlendFunc* fn = new osg::BlendFunc();fn->setFunction(osg::BlendFunc::SRC_ALPHA,osg::BlendFunc::DST_ALPHA);stateSet->setAttributeAndModes(fn,osg::StateAttribute::ON); // setup point spritosg::PointSprite* pointsprite = new osg::PointSprite();stateSet->setTextureAttributeAndModes(0,pointsprite,osg::StateAttribute::ON);// give some size to the pointsosg::Point* point = new osg::Point(); point->setSize(nSize); stateSet->setAttribute(point);// Disable depth test to avoid sort problems and LightingstateSet->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);stateSet->setMode(GL_LIGHTING,osg::StateAttribute::OFF);/// The texture for the spritesosg::Texture2D* tex = new osg::Texture2D();tex->setImage(osgDB::readImageFile("Images/particle.rgb"));stateSet->setTextureAttributeAndModes(0,tex,osg::StateAttribute::ON);return stateSet;}
3、绘制结果:
(1) 未设置stateset
(2)设置stateset后:
4、总结:
5、扩展:
每日一练(三) pointSprite(点精灵)相关推荐
- shell脚本每日一练(三)
shell脚本每日一练(三) 一.练习题 1.编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(多进程版) 2.编写脚本,显示进度 3.使用死循环实时显 ...
- 三点估算pmp_【每日一练】PMP项目管理专业资格认证考试练习题(十)
听说99%的同学都来这里充电吖[习题] 1.客户提出的一项需求,将变更项目范围.如果变更控制委员会批准需求,执行变更的成本将影响项目的预算.如果这项需求获得批准,项目经理应该考虑从下列哪一项储备中申请 ...
- 每日一练丨性能优化-实例优化(三)
墨墨导读:本文出自墨天轮"每日一练"专栏,此专栏已连更84天,欢迎关注https://www.modb.pro/topic/26446(复制到浏览器中打开或者点击"阅读原 ...
- WindowsAPI每日一练(2) 使用应用程序句柄
WindowsAPI每日一练系列 :https://www.cnblogs.com/LexMoon/category/1246238.htmlWindowsAPI每日一练(1) WinMain Win ...
- python 编程一日一练-python每日一练
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 过滤掉列表中的负数 筛选出字典{lilei: 79,jim: 88,lu ...
- python输出乘法口诀-【每日一练】python输出 9*9 乘法口诀表
原标题:[每日一练]python输出 9*9 乘法口诀表 无论学哪种程序,哪一门语言都对输出9*9 乘法口诀表情有独钟,记得学VB的时候,需要好长一段代码才实现,那么你知道用Python输出,需要几行 ...
- QT每日一练day4:ubuntu中使用QT
(本文主要是为了说明QT的跨平台特性) 一.安装QT sudo apt-get install qt5-default qtcreator cmake 二.打开QT 可以点击图标或命令行方式: 三 ...
- C语言每日一练——第73天:谁是窃贼问题
C语言每日一练 202年1月8日 文章目录 题目描述 问题分析 代码实现 运行结果 网上参考 题目描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃贼,还知道这4个人中的每个人要么是诚实的 ...
- C语言每日一练——第35天:打印菱形
C语言每日一练 2021年10月13日 题目描述 输入菱形的高度n(必须为奇数),即正中间星号的个数,打印出用星号组成的菱形 分析 要打印菱形,先要构想要打印的图形样子,就比如下图这种: 我们可以根据 ...
- “第二届openGauss每日一练打卡活动” 获奖名单公布!
2022年11月24日-12月14日 , Gauss松鼠会联合墨天轮社区.openGauss社区.鲲鹏社区共同推出第二届 [21天openGauss每日一练打卡活动] .今年活动全新升级,推出 ope ...
最新文章
- vim编辑文章后不能修改
- 空指针错误 java.lang.NullPointerException 浅谈
- 亚马逊:自动选择AI模型,进化论方法效率更高!
- Linux下的shell简介(三)
- Java经典面试题整理及答案详解(二)
- step2 . day1 Linux和C语言的高级应用
- 三个值得期待的JavaScript新功能!
- c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...
- linux运行apktool签名,解决Linux中使用ApkTool遇到问题
- python如何调用阿里云接口_Python调用aliyun API设置阿里云负载均衡虚拟服务器组权重...
- 【文末有赠书】从历史角度讲现代数学
- 图论 —— 稳定婚姻问题与延迟认可算法
- 升级过log4j,却还没搞懂log4j漏洞的本质?
- POJ 1141 Brackets Sequence
- 学生信息管理系统需求文档方案
- android仿微信朋友圈点击评论效果
- 服务器系统如用pe和做镜像,PE如何使用?
- 在linux系统下观看和转码m3u8视频文件
- 无界鼠标 (Mouse without Borders)简单使用教程
- 基于Arduino的智能泡茶机(1)——机械系机械创新比赛总结技术点与不足处
热门文章
- 人工智能对生活的影响
- MERGE Into 无法更新ON子句中引用的列
- Python读取和处理mf4
- 学生计算机屏幕坏了怎么办,电脑自己检查自己修,如果显示器坏掉我们该怎么办?...
- top和iostat指令的使用,linux负载,swap与内存,io
- windows 7z命令行压缩
- cad延伸快捷键_熟练掌握快捷键,提高CAD绘图效率
- python的一些报错解决
- 【数据技术】关于HP Vertica MPP列式数据库资源池设置的一点心得
- SQL Server 2000 企业管理器错误 提示:MMC 无法创建管理单元(不重装)