当前位置: 首页 > news >正文

本网站只做信息展示不提供在线交易价格低油耗低的车

本网站只做信息展示不提供在线交易,价格低油耗低的车,前端需要会哪些技术,性能优化工具虚拟现实中有很多效果#xff0c;如雨效、雪效、雾效等#xff0c;这些都可以通过粒子系统来实现。一个真实的粒子系统的模式能使三维场景达到更好的效果。 本章对OSG粒子系统的使用以及生成自定义粒子系统的方法进行了详细介绍最后还附带说明了阴影的使用方法。在实时的场景…        虚拟现实中有很多效果如雨效、雪效、雾效等这些都可以通过粒子系统来实现。一个真实的粒子系统的模式能使三维场景达到更好的效果。 本章对OSG粒子系统的使用以及生成自定义粒子系统的方法进行了详细介绍最后还附带说明了阴影的使用方法。在实时的场景中阴影是非常重要的是一个很大的范畴笔者也没有深入研究因此这里只是简单介绍一下。 粒子系统 粒子系统是一个非常复杂的粒子模拟过程。在 OSG中专门定义了新的名字空间 osgParticle 来处理粒子系统的模拟。 osgParticle 能够高效地模拟粒子系统生成非常真实的效果。在OSG 预定义的粒子系统中大部分的粒子系统模拟都采用的是 Billboard 与色彩融合技术生成粒子。Billboard 技术前面已经讲到过虽然它还存在很多问题但是总体来说效果还是非常不错的。色彩融合技术就是在渲染的过程中将各种颜色如顶点颜色、光照颜色、质颜色和纹理颜色等按照 Alpha 值按一定的比例进行融合以达到真实的效果。在本书自定义的粒子系统示例中会向读者展示一个爆炸的效果当然只是演示一个简单的技术如果深入的话还需要重新定义模块。 粒子系统的主要模块 当打开粒子系统的文档时读者会发现里面包含很多类但很多类都是内部操作在模拟一个粒子系统时只需要使用其中的一部分就可以完成很好的模拟效果具体使用的类如图11-1 所示。 11-1子系统成块 对于一个普通的粒子系统的模拟可以用图 11-1 来显示主要模块。通过图 11-1 让读者明白一个粒子系统所需要的模块。下面分别介绍这些模块。 放射极(osgParticle::Emitter):一个标准放射极(osgParticle::ModularEmitter)包括一个计数器、一个放置器和一个发射器它为用户控制粒子系统中多个元素提供了一个标准机制。粒子系统(osgParticle::ParticleSystem):维护并管理一系列粒子的生成、更新染和销毁。粒子系统类继承自Drawable类用于控制粒子的渲染因此与其他 Drawable对象的渲染类似控制其渲染属性StateAttribute 即可。OSG提供了一个方便的函数以允许用户控制3个常用的渲染状态属性方法setDefaultAttributes可用于指定材质(或指定为NULL以禁用材质)、允许/禁止附加的图像融合及允许/禁止光照。粒子(osgParticle::Particle):粒子系统的基本单元。粒子类同时具有物理属性和图像属性,它的形状可以是任意的点(PONT)、四边形(QUAD)、四边形带(QUADTRIPSTRIP)、六角形(HEXAGON)或线(LINE)。每个粒子都有自己的生命周期生命周期也就是每个粒子可以存活的秒数生命周期为负数的粒子可以存活无限长时间。所有的粒子都具有大小(SIZE)、Alpha值和颜色(COLOR)属性每组粒子都可以指定其最大和最小值。为了便于粒子生命周期的管理粒子系统通过改变生命周期的最大和最小值来控制单个粒子的渲染它会根据已经消耗的时间在最小和最大值之间进行线性插值。放置器(osgParticle::Placer):设置粒子的初始位置。用户可以使用预定义的放置器或定义自己的放置器已经定义的放置器包括点放置器 PointPlacer(所有的粒子从同一点出生)、扇面放置器SectorPlacer(所有的粒子从一个指定中心点、半径范围和角度范围的扇面出生)以及多段放置器MultiSegmentPlacer(用户指定一系列的点粒子沿着这些点定义的线段出生)。发射器 (osgParticle::Shooter):指定粒子的初始速度。RadialShooter 类允许用户指定一个速度范围(米/秒)以及弧度值表示的方向方向由两个角度指定(theta角是与Z轴的夹角phi角是与XY平面的夹角)。计数器 (osgParticle::Counter):控制每一产生的粒子数。RandomRateCounter 类允许用户指定每帧产生粒子的最大和最小数。粒子系统更新器(osgParticle::ParticleSystemUpdater):用于自动更新粒子将其置于场景中时它会在拣选遍历中调用所有“存活”粒子的更新方法。标准编程器(osgParticle::ModularProgram):在单个粒子的生命周期中用户可以使用ModularProgram实例控制粒子的位置ModularProgram需要与Operator对象组合使用。操作器(osgParticle::Operator):提供了控制粒子在其生命周期中的运动特性的方法。用户可以改变现有 Operator 类实例的参数或定义自己的 Opcrator 类。OSG提供的Operator类包括AccelOperator(加速度)、AngularAccelOperator(角加速度)、FluidFrictionOperator (空气阻力或流体操作)以及ForceOperator(压力)。 在OSG中除了这些粒子系统的主要模块以外还包含其他的已经定义好的模块如osgParticle::ExplosionDebrisEfect(爆炸碎片)、osgParticle::ExplosionEffect (爆炸模拟)、osgParticle::SmokeEfect(烟雾模拟)和 osgParticle::FireEffect(火光模拟)。 还有一个比较重要的类osgParticle::PrecipitationEfect它是OSG定义的新类,用来模拟一些在OSG中已经定义好的粒子系统如雨效和雪效使用方法很简单可以直接加入到场景中。 ​​​​​​​粒子系统的模拟过程 下面将介绍如何模拟一个真实的粒子系统。对于模拟粒子系统的过程可以分为两种一是OSG中已经定义好的粒子系统模块二是根据需要自定义粒子系统。预定义粒子系统模块模拟过程如下; (1) 创建预定义粒子系统模块对象设置相应的参数。 (2) 作为子节点加到场景节点中。从上面列举的子系统的关系继承图中可以看出它们继承自osg::Node或osg::Group 节点因此可以直接作为一个节点加入到场景中。 自定义粒子系统模拟过程如下: (1)创建粒子系统(osgParticle::ParticleSystem)并将其加入到场景中设置相应的属性如材质、放射及光照。 (2)创建粒子模板(osgParticle::Particle)控制场景中每一个粒子的特性并关联到粒子系统设置粒子模板对应的特性如大小、颜色、生命周期及重量等。 (3)创建粒子系统放射器(osgParticle::ModularEmitter)标准的放射器包括计数器(Counter)、放置器(Placer)和发射器(Shooter)3 部分设置相应的属性如位置、形状、速度和方向等。 (4)创建粒子系统编程器对象(osgParticle::Program)控制粒子在声明周期内的运动。一个标准编程器对象包含各种操作器如osgParticle::AccelOperator和osgParticle;:FluidFrictionOperator等。 (5)创建粒子系统更新器(osgParticle::ParticleSystemUpdater)用于管理每一帧的粒子的属性如位置、速度和方向等。 通过上面的步骤可以完成一个简单的粒子系统的模拟。对于一般的需要而言是没有任何问题的。如果需要更高要求的可以从shader 开始编写属于自己的粒子系统。 ​​​​​​​雾效模示例 雾效其实并不是一种粒子系统只是一种状态属性放在这里来演示因为它本身很像一种粒子系统。 雾效的管理主要是由osg::Fog来控制染的。osg::Fog类直接继承自osg::StateAttribute类继承关系图如图11-2所示。 图11-2 osg::Fog 的继承关系图 从继承关系图中可以看到它继承自osgStateAttribute类因此它同样可以通过设置状态模式来控制雾效的开启或关闭代码如下: root-getOrCreateStateSet()-setAttributeAndModes(fog.get(),osg::StateAttribute::ON);  在OSG中雾效有两种模式可以通过下面的方式来获取或设置: void setMode(Mode mode)  Mode getMode() const  enum Mode  {      LINEAR  GL_LINEAR,// 线性务      EXP  GL_EXP, //全局雾      EXP2  GL_EXP2// 全局雾  };  雾的坐标源也有两种可以通过下面的方式来设置或获取: void setFogCoordinateSource(GLint source)  GLint getFogCoordinateSource() const  enum FogCoordinateSource  {      FOG_COORDINATE  GL_FOG_COORDINATE,//雾坐标      FRAGMENTDEPTH  GL_FRAGMENT_DEPTH// 眼坐标  };  雾的坐标源在使用固定管道的顶点处理时雾效的值可以是眼坐标系中的y坐标值也可以是经过插值的雾坐标这是由雾的标源是设置成GL_FRAGMENT_DEPTH还是GL_FOG_COORDINATE决定的在可编程管线中应用比较多。 雾效的特性还有颜色、浓度和起始位置等可以调用下列类的成员函数来设置相应的特性: void setDensity(float density)// 设置浓度  float getDensity() const  void setStart(float start)// 设置起点  float getStart() const  void setEnd(float end)// 设置终点  float getEnd() const  void setColor(const Vec4 color) // 设置雾的颜色  const Vec4 getColor() const   雾效的特性已经都讲了解释了雾效可能需要设置所有特性下面来看一个简单的示例。 代码如程序清单11-1 所示。 // 创建雾效 osg::ref_ptrosg::Fog createFog(bool m_Linear) {// 创建Fog对象osg::ref_ptrosg::Fog fog new osg::Fog();// 设置颜色fog-setColor(osg::Vec4(1.0, 1.0, 1.0, 1.0));// 设置浓度fog-setDensity(0.01);// 设置雾效模式为线性雾if (!m_Linear){fog-setMode(osg::Fog::LINEAR);}else// 设置雾效模式为全局零{fog-setMode(osg::Fog::EXP);}// 设置雾效近点浓度fog-setStart(5.0);// 设置雾效远点浓度fog-setEnd(2000.0);return fog.get(); }void fog_11_1(const string strDataFolder) {osg::ref_ptrosgViewer::Viewer viewer new osgViewer::Viewer();osg::ref_ptrosg::GraphicsContext::Traits traits new osg::GraphicsContext::Traits;traits-x 40;traits-y 40;traits-width 600;traits-height 480;traits-windowDecoration true;traits-doubleBuffer true;traits-sharedContext 0;osg::ref_ptrosg::GraphicsContext gc osg::GraphicsContext::createGraphicsContext(traits.get());osg::ref_ptrosg::Camera camera viewer-getCamera();camera-setGraphicsContext(gc.get());camera-setViewport(new osg::Viewport(0, 0, traits-width, traits-height));GLenum buffer traits-doubleBuffer ? GL_BACK : GL_FRONT;camera-setDrawBuffer(buffer);camera-setReadBuffer(buffer);osg::ref_ptrosg::Group root new osg::Group();// 读取模型string strDataPath strDataFolder lz.osg;osg::ref_ptrosg::Node node osgDB::readNodeFile(strDataPath);root-addChild(node.get());// 启用雾效root-getOrCreateStateSet()-setAttributeAndModes(createFog(false), osg::StateAttribute::ON);// 优化场景数据osgUtil::Optimizer optimize;optimize.optimize(root.get());viewer-setSceneData(root.get());viewer-realize();viewer-run(); } 运行程序截图如图11-3所示 图11-3 雾效模拟示例截图
http://www.dnsts.com.cn/news/159976.html

相关文章:

  • 河南省建设教育培训中心网站网站建设费开票收候开在哪个类别里
  • 一个小型网站设计导航主题wordpress
  • 网站建站前期准备工作大型app定制开发
  • 威海建设集团信息网站建设银行江苏官网招聘网站
  • 网站建设有什么工作黔西县住房和城乡建设局网站
  • 网址与网站的区别海盐网站建设
  • 小型网站设计开发小程序外包
  • 高端网站建设公网站开发需要的技能
  • 建设银行手机银行银行下载官方网站建了个网站百度上会有么
  • 在线制作表白网站的源码服务器网络配置
  • 企业网站报价青岛做网站方案
  • 建设学生社团网站的可行性分析wordpress主题云落
  • django做网站和js做网站网站代码建设+实例
  • django做待办事项网站常德市做网站的公司
  • 自己做采集电影网站手机智能建网站
  • 微信网站备案外网访问不了内网建设的网站
  • 网站开发需要的编程软件纯代码给wordpress增加淘客功能
  • 医院网站建设存在问题莆田 做网站的公司
  • 电子商务网站建设系统功能创意的广告图片
  • 外贸网站翻译建设哈尔滨网站建设制作费用
  • 万家建设有限公司网站网站模板 html5
  • 网站名称有哪些wordpress制作短链接
  • 做网站 用 显示器vps看网站蜘蛛
  • 外贸网站如何换域名wordpress主题源代碼
  • 青岛seo整站优化哪家专业汉服网站开发背景
  • 电子商务网站设计与...杭州市网站制作
  • 网页制作素材印象数码怎么弄出来东莞网站建设seo优化
  • 买了一个域名怎么做网站微信开发者工具代码怎么写
  • 厦门地税网站建设手机做的兼职网站设计
  • 厦门思明区建设局网站WordPress标题换行显示