osglightpoint例子 [转]

该例子演示了光点的效果,主要应用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,接下来大家一起思考。

时间: 2024-10-19 08:46:25

osglightpoint例子 [转]的相关文章

osg实例介绍

转自:http://blog.csdn.net/yungis/article/list/1 [原]osgmotionblur例子 该例子演示了运动模糊的效果.一下内容是转自网上的:原理:引用内容对于运动画面,将当前帧画面与上一帧画面进行alpha融合,以产生出残影——运动模糊效果.通过使用累积缓存来完成这项工作.OpenGL提供一个累积缓存,可以用来存储当前指定的颜色缓存里面的内容,并进行一定的运算操作.通过函数glAccum可以对累积缓存进行操作. glAccum介绍如下:引用内容void g

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

JSON 简单例子

代码: json [ { "title" : "a", "num" : 1 }, { "title" : "b", "num" : 1 }, { "title" : "c", "num" : 1 }] 例子1 js var box=[ { title:'a', num:1, height:177, }, { title:'b',

最简单的基于FFmpeg的AVDevice例子(读取摄像头)【转】

转自:http://blog.csdn.net/leixiaohua1020/article/details/39702113 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] libavdevice使用 注意事项 代码 结果 下载 =====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDevice例子(读取摄像头) 最简单的基于FFm

Clustering by Passing Messages Between Data Points(Brendan J.Frey* and Delbert Dueck)例子

例1,数据点聚类:AP应用到25个二维数据中,使用负平法误差作为相似度  聚类数目不用预先指定 AP的一个优点是聚类数目不用预先指定,而是在消息传递方法中慢慢浮现,取决于输入参考度(preference),这种自动模型的选择,基于先验指定每一个数据点有多合适作为exemplar. 下图表示输入常量参考度对聚类数目的影响,这种关系近乎同样于在精确最小平方误差中的关系. 例2,人脸识别:使用优化标准为均方差,识别900张灰度图像   AP一致的能够实现更低的误差,在时间上花费要少于两个数量级. AP

Python之路42-socket介绍及简单例子

socket对数据的底层收.发做了封装 实现通信要通过IP+port 一个socket服务端和客户端实现的伪代码 # 发送端 # import socket # socket.TCP/IP # connect(a.ip,a.port) # socket.send("hello") # socket.recv() # socket.close() # 接收端 # import socket # socket.TCP/IP # listen(0.0.0.0,6969) # waiting(

c语言一个例子对比php学习随记

今天开始学写一些简单的C例子,发现很多和PHP不一样的地方,做个笔记. #include <stdio.h> int main(void) { int a,b; printf("请输入整数a"); //这里是用双引号,不能用单引号,PHP类似的地方可以用单引号,这里需注意 scanf("%d",&a); //获取用户输入值存入a printf("请输入整数b"); scanf("%d",&b);//

判断当前进程是否以管理员权限运行(AllocateAndInitializeSid后,用CheckTokenMembership与AdministratorsGroup进行比较,和Delphi的那个例子还有点不一样)

在Win7下(Vista以上的...)有时某些操作就是会让人郁闷 开启了UAC的话,得以管理员权限运行才不会出现Access is denied... 但是,程序又不是非得什么时候都用那破管理员权限的 总不能在manifest里加权限,然后用户运行时老弹确认吧? 当然啦,可以将需要管理员权限的部分写到另一个小程序,需要时调用它就行了 不过还是不爽,如果是一个小小的程序还要再加另一个小小小程序的话 那好,干脆判断是不是Win7...开启了UAC没有之类 开启的话再判断下是不是以管理员权限运行,不是

Web前端入门学习(6)——浮动例子之鉴赏

浮动例子之鉴赏 在浮动原理及清除浮动一文中(http://cherry360.blog.51cto.com/12176744/1864258),简单介绍了浮动的相关基础知识,为了巩固知识点,本篇结合代码展示关于浮动的几个常见例子. 例1:九格子 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>九格子</titl