OSG学习过程中的笔记 - 图文 联系客服

发布时间 : 星期一 文章OSG学习过程中的笔记 - 图文更新完毕开始阅读6d511337e87101f69e319540

osg笔记四

2011-08-03 16:10:23| 分类:OSG | 标签: |字号大中小订阅

九例子系统

osgParticle:explosionEffect用于爆炸的模拟,fireEffect用于火的模拟,explosionDebrisEffect用于爆炸后四散的颗粒的模拟。

osgParticle的中坚类:

osgParticle::Particle 粒子模板,块定粒子的大小,颜色,生命周期等等。 osgParticle::ParticleSystem 粒子系统的总体属性,粒子总数,纹理等。 osgParticle::Counter 粒子产生的数目范围

osgParticle::Placer 粒子出生点的形状态如环圆点形 osgParticle::Shooter 粒子发射器,决定粒子的初速

osgParticle::Emitter 上述模板以及操作都为此类服务,类名:发射器 osgParticle::Program 可接受对粒子的操作,如轨迹的定义,矩阵的变换等等 osgParticle::Operator 粒子操作或用户自定义粒子操作

osgParticle::ParticleEffect 可单独使用的粒子渲染,模仿烟雾,爆炸等等 osgParticle::osgPrecipitationEffect 可以使用雾效,雪效等等 osg使用粒子系统所经历步骤: 1. 确定意图包括粒子的运动方式等等

2. 建立粒子模板按所需要的类型确定粒子的角度,形状,生命周期等 3. 建立粒子系统设置总的属性

4. 设置发射器发射形状,发射粒子的数目变化等等 5. 设置操作旋转度,风力等等 6. 加入节点,更新 视口&LOD&多通道 1. 多视口

创建视口必须有以下几件东西:

第一:了解整个屏幕分辨率有多大,这样可以分辨视口的大小,以便进行分割 第二:上下文,我们必须手动的打开设置上下文 2. LOD

2.1文件的输出

LOD比起PagedLOD而言并非十分的常用,有个地方用的特别多,那就是把一个好好的模型加一个视距压成一个模型,这个模型比以前的看来就是多个视距的控制,远了看不见,近了看的见。这需要用到OSG的文件输出,这样才能把LOD节点和模型节点一起输出。

2.2在模型中加LOD节点 3. 多通道

4. Imposter 用动态图片替换场景的技术可以把它当作LOD一样使用,只不过不是把模型变没有,而是使它换成一张图

十文字&模型阴影 显示汉字

文字显示的原理:读取字体点阵信息à转换为图像à反走样à最终图像

osg笔记五

2011-08-06 10:58:27| 分类:OSG | 标签: |字号大中小订阅

访问器的设计允许用户将某个特定节点的指定函数,应用到当前场景遍历的所有此类节点中。遍历的类型包括:NODE_VISITOR(节点访问器),UPDATE_VISITOR(更新时遍历访问器),COLLECT_OCCLUDER_VISITOR(封闭节点),CULL_VISITOR(挑选)。

访问器遍历模式:TRAVERSE_NONE(只访问当前节点), TRAVERSE_PARENTS(访问父节点), TRAVERSE_ALL_CHILDREN(访问所有子节点), TRAVERSE_ACTIVE_CHILDREN(遍历激活状态的孩子节点)。

基类访问器类是NodeVisitor类,其中提供的apply方法重载了所有类型节点。访问器所允许的访问方式将在此类的子类中得到实现,以及访问时所进行的操作也在此中定义。

启动访问器的操作:利用osg::Node的accept方法可以实现节点访问器的启动。选择某个执行accept方法的节点,我们就可以控制遍历的开始的位置。遍历的方向是通过选择便利模式来进行来决定的,而节点类型的区分则是通过重载相应的apply方法实现的。Accept方法将响应某一类的遍历请求,并执行用户指定节点的所有子类节点的apply方法。

osgSim::MultiSwitch多重开关节点。方法setSingleChildOn可以设置其中的一个节点有效,而同组的其他节点无效.

自由度节点操作:osgSim::DOFTransfrom 自由度节点,DOFTransform::setCurrentHPR用于设置节点自由度h:heading,p:pitch,r:roll。heading:头部的左右偏转;pitch:俯仰角的设置;roll为旋转角的设置。

使用回调实现在每帧的更新遍历中进行节点的更新:根据遍历方式的不同,分为update(更新),cull(挑选),draw(绘制),回调函数将自动的执行。

更新回调在挑选回调之前,挑选回调在绘制回调之前。

重载osgGA::GUIEventHandler里面的virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa); ea用于区分事件类型,用于接收GUI事件;aa用于生成并向GUI系统发送请求。

告示牌创建

告示牌节点的特性是围绕用户定义的轴(或者点)进行旋转,从而始终面向一个指定的方向。 Billboard类包括可以绕一个轴或者参考点旋转的并朝向指定方向的几何体,Billboard继承自Geode类。

除了继承自Geode类的方法和成员外,告示牌类还包括了用于控制其自身特性的成员和方法:告示牌是否环绕参考点或者轴;如果环绕一个轴的话,它应该朝向什么方向。

可以使用Billboard::setMode(osg::Billboard::Mode),合法参数有POINT_ROT_EYE(绕一个点旋转,相对于眼睛坐标), POINT_ROT_WORLD(绕一个点旋转,相对于世界坐标),AXIAL_ROT(绕一个轴旋转)。如果指定了AXIAL_ROT,用于就可以使用setAxis(osg::vec3)方法来设置告示牌绕之旋转的轴。用户还可以设置法线setNornal(osg::vec3)定义告示牌朝向的法线。为了放置告示牌,

用户还需重载osg::Geode的addGeometry方法。这个方法有两个参数:一个Drawable实例,另一个标志位置的osg::vec3实例。

总述:

向场景中添加告示牌的步骤: 1. 创建一个告示牌实例并添加到场景 2. 创建光照关闭的渲染状态

3. 创建几何体(应用上面的渲染状态)并添加给告示牌节点。 交集测试

Osg2.0以上版本中,已经使用了IntersectionVisitor代替了原有的IntersectVisitor类,新的类功能更强大。

基本类介绍:

线段:osg::LineSegment类,场景中的射线,包括两点,一个是线段的起点,一个是线段的终点,都为osg::vec3向量实例,当交集测试被触发时,它将检测射线的相交情况并执行相应的操作。

交点:osgUtil::Hit:这个类向程序员提供了获取交集检测的基本数据的方法。交点类包括一条射线与场景几何体相交的状态信息,尤为重要的是,它以vec3形式提供了局部和世界坐标的位置以及法线数据。它的成员方法getLocalIntersectPoint getLocalIntersectNormal getWorldIntersectPoint

getWorldIntersectNormal分别以osg::vec3作为返回值,返回局部/世界坐标的相交点/法线数值。

交点类表:osgUtil::IntersectVisitor::HitList:一条单一的线段可能与场景中的多个几何体实例产生交集。对于每一条参与交集测试的线段,系统均会产生一个列表。这个列表包含了所有交集测试产生的Hit实例,如果没有检测到交集,此列表为空。

交集访问器:osgUtil::IntersectVisitor,射线与场景中几何体的交集测试由交集访问器来创建并实现初始化。IntersectionVisitor类继承自NodeVisitor类,因此其创建和触发机制与NodeVisitor大致相似。访问器需要维护一个进行交集测试的线段列表,而对于其中的每一条线段,访问器都会创建一个交点列表(osgUtil::IntersectVisitor::HitList实例)。

粒子系统

ParticleSystem类继承自Drawable类,故可以将其作为Geode的子节点加入。 粒子系统添加的步骤:

1. 创建粒子系统实例并将其添加到场景:作为Geode的子节点加入 2. 设置粒子系统的渲染状态属性,非必须 3. 创建粒子对象并将其关联到粒子系统 4. 设置粒子参数,非必须

5. 创建粒子系统更新器,并将其关联到粒子系统实例,并添加到场景中

6. 创建标准放射极,以定义:计数器—每帧创建的粒子数,放射器—粒子出生位置,发射器—初始速度非必须

7. 将标准放射极关联到粒子系统非必须

8. 创建ModularProgram标准编程器实例,以控制粒子在生命周期内的运动:首先创建并定义Operator计算器;然后添加计算器到标准编程器。

基本步骤是:创建一个粒子系统对象,一个更新器对象,以及一个粒子对象,同时设置场景