点精灵实现:

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(点精灵)相关推荐

  1. shell脚本每日一练(三)

    shell脚本每日一练(三) 一.练习题 1.编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(多进程版) 2.编写脚本,显示进度 3.使用死循环实时显 ...

  2. 三点估算pmp_【每日一练】PMP项目管理专业资格认证考试练习题(十)

    听说99%的同学都来这里充电吖[习题] 1.客户提出的一项需求,将变更项目范围.如果变更控制委员会批准需求,执行变更的成本将影响项目的预算.如果这项需求获得批准,项目经理应该考虑从下列哪一项储备中申请 ...

  3. 每日一练丨性能优化-实例优化(三)

    墨墨导读:本文出自墨天轮"每日一练"专栏,此专栏已连更84天,欢迎关注https://www.modb.pro/topic/26446(复制到浏览器中打开或者点击"阅读原 ...

  4. WindowsAPI每日一练(2) 使用应用程序句柄

    WindowsAPI每日一练系列 :https://www.cnblogs.com/LexMoon/category/1246238.htmlWindowsAPI每日一练(1) WinMain Win ...

  5. python 编程一日一练-python每日一练

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 过滤掉列表中的负数 筛选出字典{lilei: 79,jim: 88,lu ...

  6. python输出乘法口诀-【每日一练】python输出 9*9 乘法口诀表

    原标题:[每日一练]python输出 9*9 乘法口诀表 无论学哪种程序,哪一门语言都对输出9*9 乘法口诀表情有独钟,记得学VB的时候,需要好长一段代码才实现,那么你知道用Python输出,需要几行 ...

  7. QT每日一练day4:ubuntu中使用QT

    (本文主要是为了说明QT的跨平台特性)   一.安装QT sudo apt-get install qt5-default qtcreator cmake 二.打开QT 可以点击图标或命令行方式: 三 ...

  8. C语言每日一练——第73天:谁是窃贼问题

    C语言每日一练 202年1月8日 文章目录 题目描述 问题分析 代码实现 运行结果 网上参考 题目描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃贼,还知道这4个人中的每个人要么是诚实的 ...

  9. C语言每日一练——第35天:打印菱形

    C语言每日一练 2021年10月13日 题目描述 输入菱形的高度n(必须为奇数),即正中间星号的个数,打印出用星号组成的菱形 分析 要打印菱形,先要构想要打印的图形样子,就比如下图这种: 我们可以根据 ...

  10. “第二届openGauss每日一练打卡活动” 获奖名单公布!

    2022年11月24日-12月14日 , Gauss松鼠会联合墨天轮社区.openGauss社区.鲲鹏社区共同推出第二届 [21天openGauss每日一练打卡活动] .今年活动全新升级,推出 ope ...

最新文章

  1. vim编辑文章后不能修改
  2. 空指针错误 java.lang.NullPointerException 浅谈
  3. 亚马逊:自动选择AI模型,进化论方法效率更高!
  4. Linux下的shell简介(三)
  5. Java经典面试题整理及答案详解(二)
  6. step2 . day1 Linux和C语言的高级应用
  7. 三个值得期待的JavaScript新功能!
  8. c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...
  9. linux运行apktool签名,解决Linux中使用ApkTool遇到问题
  10. python如何调用阿里云接口_Python调用aliyun API设置阿里云负载均衡虚拟服务器组权重...
  11. 【文末有赠书】从历史角度讲现代数学
  12. 图论 —— 稳定婚姻问题与延迟认可算法
  13. 升级过log4j,却还没搞懂log4j漏洞的本质?
  14. POJ 1141 Brackets Sequence
  15. 学生信息管理系统需求文档方案
  16. android仿微信朋友圈点击评论效果
  17. 服务器系统如用pe和做镜像,PE如何使用?
  18. 在linux系统下观看和转码m3u8视频文件
  19. 无界鼠标 (Mouse without Borders)简单使用教程
  20. 基于Arduino的智能泡茶机(1)——机械系机械创新比赛总结技术点与不足处

热门文章

  1. 人工智能对生活的影响
  2. MERGE Into 无法更新ON子句中引用的列
  3. Python读取和处理mf4
  4. 学生计算机屏幕坏了怎么办,电脑自己检查自己修,如果显示器坏掉我们该怎么办?...
  5. top和iostat指令的使用,linux负载,swap与内存,io
  6. windows 7z命令行压缩
  7. cad延伸快捷键_熟练掌握快捷键,提高CAD绘图效率
  8. python的一些报错解决
  9. 【数据技术】关于HP Vertica MPP列式数据库资源池设置的一点心得
  10. SQL Server 2000 企业管理器错误 提示:MMC 无法创建管理单元(不重装)