该例子演示了光点的效果,主要应用osgSim库中的LightPoint、LightPointNode、
SequenceGroup、BlinkSequence,osgSim库属于仿真库,扩展库。应用osg核心库完成一些指定
的效果。因此研究这个例子只需要指定以上这几个类的作用即可。
LightPoint是光点类,有如下属性:
  bool                        _on;
       osg::Vec3               _position;
       osg::Vec4                _color;
       float                         _intensity;
       float                         _radius;
       osg::ref_ptr<Sector>      _sector;
        osg::ref_ptr<BlinkSequence> _blinkSequence;
        BlendingMode        _blendingMode;
是否打开、位置、颜色、强度、半径、扇区、闪烁、模式
从以上的属性可以指定,这个光点可以调整大小位置,可以运动可以变换颜色,闪烁效果。
而LightPointNode是光点节点,里面保存了一个光点列表typedef std::vector< LightPoint > 
LightPointList;
SequenceGroup用于关联一组序列,内部只有一个基本时刻double      _baseTime;
BlinkSequence闪烁序列,内部的属性:

  double                      _pulsePeriod;      
  double                      _phaseShift;
       PulseData            _pulseData;
        osg::ref_ptr<SequenceGroup> _sequenceGroup;从中可以看出可以添加很
多脉冲,每个脉冲的间隔、停顿等。它属于LightPoint光点的一个属性,也就说一个光点可以以
SequenceGroup定义的基本时间为基本仿真时间,根据BlinkSequence中设置的变换颜色和光点强
度和脉冲。
明白了以上几个类之间的关系,这个例子就很好理解了。
在createLightPointsDatabase函数中创建了很多光点,设定了位置和颜色的变换范围,里面有
一个:
lpn->setPointSprite设置了光点添加纹理使用模糊的效果,必须指定0纹理单元(后面研究实现
方法)。
CreateBlinkSequenceLightNode函数创建了闪烁的光点,设置序列组,添加脉冲,设置强度位置
等等。
我们详细的研究一下LightPointNode,说是光点节点,但是它本身不发光,但可以通过其他方式
模拟出发光的效果。这个节点很特别,在osg:Geode让他继承geode,然后adddrawable把光点的drawable添加
进去进行渲染。
而实际中LightPointNode并没有采用这种方法,而是继承Node,并且没有add任何的子节点。所
有的的功能都是在traverse递归的时候实现的。
这就涉及到了如何跳过场景树去绘制节点,答案是在剔除的时候去手动构建状态树,我们进入代
码看看是怎么样手动构建的。
首先 osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(&nv);用于判断只
有在剔除遍历的时候才继续运行下面的代码,
osg::Matrix matrix = *(cv->getModelViewMatrix());
        osg::RefMatrix& projection 
= *(cv->getProjectionMatrix());
        osgUtil::StateGraph* rg = cv-
>getCurrentStateGraph();
        if (rg->leaves_empty())
        {
            // this 
is first leaf to be added to StateGraph
            // and therefore should not 
already know current render bin,
            // so need to add it.
            cv-
>getCurrentRenderBin()->addStateGraph(rg);
        }
获取模型视图矩阵、获取投影矩阵、获取当前的渲染根节点。
typeid(*object)==typeid(LightPointDrawable)
用于判断object是否是(LightPointDrawable)类型的,如果是返回true否则返回false。
接下来 drawable = _pointSprites ? new LightPointSpriteDrawable : new 
LightPointDrawable;
这里我们看到了_pointSprites ,这就是是否让LightPointNode使用纹理,如果使用纹理则new 
LightPointSpriteDrawable否则new LightPointDrawable。并且把这个drawable设置成了当前的
userdata。
接下来把这个drawable收到的添加到rg->addLeaf(new osgUtil::RenderLeaf
(drawable,&projection,NULL,FLT_MAX));渲染叶中,到目前为止需要注意,这个drawable中还
没有任何内容,接下来就需要根据_lightPointList去向这个drawable添加绘制的内容,注意添
加addBlendedLightPoint和addAdditiveLightPoint。
现在我们进入LightPointDrawable中一看究竟,LightPointDrawable继承Drawable,需实现
drawImplementation接口,关于drawImplementation我们会在不久的以后进行详细的研究。
这里根据_sizedOpaqueLightPointList、_sizedBlendedLightPointList、
_sizedAdditiveLightPointList中的内容进行了绘制,在这里面看到了状态的切换,看到了
opengl的代码。
再补充一下,LightPointDrawable中没有应用模糊纹理,因此state.applyTextureMode
(0,GL_TEXTURE_1D,false);
    state.applyTextureMode(0,GL_TEXTURE_2D,false);
而看看LightPointSpriteDrawable,state.applyTextureMode(0,GL_TEXTURE_2D,true);这里应
用了纹理,这就是两者差别的体现。
研究完了这一趟,似乎触及到了osg中核心的一些东西。至于我们刚才提出的问题为什么没有把
他设计成Geode,而是继承Node,接下来大家一起思考。

osglightpoint例子 [转]的更多相关文章

  1. osg实例介绍

    osg实例介绍 转自:http://blog.csdn.net/yungis/article/list/1 [原]osgmotionblur例子 该例子演示了运动模糊的效果.一下内容是转自网上的:原理 ...

  2. SQLServer地址搜索性能优化例子

    这是一个很久以前的例子,现在在整理资料时无意发现,就拿出来再改写分享. 1.需求 1.1 基本需求: 根据输入的地址关键字,搜索出完整的地址路径,耗时要控制在几十毫秒内. 1.2 数据库地址表结构和数 ...

  3. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

    第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...

  4. REGEX例子

    作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...

  5. CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子

    CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子 本文涉及的VolumeRendering相关的C#代码是从(https://github.com/toolchai ...

  6. 简单例子了解View的事件分发

    什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...

  7. 简单的例子了解自定义ViewGroup(一)

    在Android中,控件可以分为ViewGroup控件与View控件.自定义View控件,我之前的文章已经说过.这次我们主要说一下自定义ViewGroup控件.ViewGroup是作为父控件可以包含多 ...

  8. kqueue例子

    网络服务器通常都使用epoll进行异步IO处理,而开发者通常使用mac,为了方便开发,我把自己的handy库移植到了mac平台上.移植过程中,网上居然没有搜到kqueue的使用例子,让我惊讶不已.为了 ...

  9. 今天有群友不是很清楚htm直接存数据库的危害,我简单举个例子

     通过这个案例就知道为什么不要把原生的html放数据库了  常见的几种转码  常用的几种显示方法 只有原生html和最下面一种弹框了,变成了持久xss 如果是Ajax的方式,请用@Ajax.JavaS ...

随机推荐

  1. python生成随机数据插入mysql

    import random as r import pymysql first=('张','王','李','赵','金','艾','单','龚','钱','周','吴','郑','孔','曺','严' ...

  2. centos7.5 ab压力测试安装和swoole压力测试

    Apache Benchmark(简称ab) 是Apache安装包中自带的压力测试工具 ,简单易用 1.ab安装 yum -y install httpd-tools 2.ab参数详解,传送门:htt ...

  3. asp.net传多个值到其它页面的方法

    网站开发中,在页面之间的跳转,经常会用到传值,其中可能会传递多个值. 一.CommadArgument传多个值到其他页面. 像Gridview dataList repeater等数据绑定控件中,可以 ...

  4. 【转载】ARouter-万能路由协议

    Github源码地址:https://github.com/alibaba/ARouter 一.功能介绍 支持直接解析标准URL进行跳转,并自动解析参数注入 支持多模块工程使用 支持添加多个拦截器,自 ...

  5. 11.6八校联考T1,T2题解

    因为版权问题,不丢题面,不放代码了(出题人姓名也隐藏) T1 这,是一道,DP题,但是我最开始看的时候,我思路挂了,以为是一道简单题,然后就写错了 后来,我正确理解题意后写了个dfs,幸亏没有记忆化, ...

  6. jQuery before 和 after

    A.after(B) ==== B.insertAfter(A) B 放在 A 的后面A.before(B) ==== B.insertBefore(A) B 放在 A 的前面 A.append(B) ...

  7. FastReport.Net使用:[4]分组

    1.绘制报表标题和栏首. 2.设置报表栏,为数据区添加一个分组 3.右键分组页眉,在其右键菜单中选择“编辑”,显示分组编辑对话框. 设置分组条件,可直接通过下拉菜单选择Table表中的[学号]列:也能 ...

  8. 2018BNU校赛总决赛

    题解是qls的题解我就懒得写了23333 A塞特斯玛斯塔 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld ...

  9. 【洛谷】P1631: 序列合并

    P1631 序列合并 题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N2个和,求这N2个和中最小的N个. 输入输出格式 输入格式: 第一行一个正整数N: 第二行N个整数Ai​ ...

  10. 【点分治】【路径小于等于k的条数】【路径恰好等于k是否存在】

    POJ1741:Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 29574   Accepted: 9915 Des ...