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

阿里云营销网站建设做网站文字编辑工作好不好

阿里云营销网站建设,做网站文字编辑工作好不好,下面有关网络营销特点的论述正确的有,常州好的网站设计公司虚拟现实中有很多效果,如雨效、雪效、雾效等,这些都可以通过粒子系统来实现。一个真实的粒子系统的模式能使三维场景达到更好的效果。 本章对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 的继承关系图

        从继承关系图中可以看到,它继承自osg::StateAttribute类,因此它同样可以通过设置状态模式来控制雾效的开启或关闭,代码如下:

  1. root->getOrCreateStateSet()->setAttributeAndModes(fog.get(),osg::StateAttribute::ON); 

        在OSG中,雾效有两种模式,可以通过下面的方式来获取或设置:

  1. void setMode(Mode mode)  
  2. Mode getMode() const  
  3. enum Mode  
  4. {  
  5.     LINEAR = GL_LINEAR,// 线性务  
  6.     EXP = GL_EXP, //全局雾  
  7.     EXP2 = GL_EXP2// 全局雾  
  8. }; 

        雾的坐标源也有两种,可以通过下面的方式来设置或获取:

  1. void setFogCoordinateSource(GLint source)  
  2. GLint getFogCoordinateSource() const  
  3. enum FogCoordinateSource  
  4. {  
  5.     FOG_COORDINATE = GL_FOG_COORDINATE,//雾坐标  
  6.     FRAGMENTDEPTH = GL_FRAGMENT_DEPTH// 眼坐标  
  7. }; 

        雾的坐标源在使用固定管道的顶点处理时,雾效的值可以是眼坐标系中的y坐标值,也可以是经过插值的雾坐标,这是由雾的标源是设置成GL_FRAGMENT_DEPTH还是GL_FOG_COORDINATE决定的,在可编程管线中应用比较多。

        雾效的特性还有颜色、浓度和起始位置等,可以调用下列类的成员函数来设置相应的特性:

  1. void setDensity(float density)// 设置浓度  
  2. float getDensity() const  
  3. void setStart(float start)// 设置起点  
  4. float getStart() const  
  5. void setEnd(float end)// 设置终点  
  6. float getEnd() const  
  7. void setColor(const Vec4 &color) // 设置雾的颜色  
  8. const Vec4 &getColor() const  

        雾效的特性已经都讲了,解释了雾效可能需要设置所有特性,下面来看一个简单的示例。

代码如程序清单11-1 所示。

// 创建雾效
osg::ref_ptr<osg::Fog> createFog(bool m_Linear)
{// 创建Fog对象osg::ref_ptr<osg::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_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();osg::ref_ptr<osg::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_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());osg::ref_ptr<osg::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_ptr<osg::Group> root = new osg::Group();// 读取模型string strDataPath = strDataFolder + "lz.osg";osg::ref_ptr<osg::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.yayakq.cn/news/366159/

相关文章:

  • 旅行社网站建设规划上海微网站
  • 陕西做天然气公司网站推荐wordpress主题xiu
  • 建设部网站统计亚马逊关键词优化软件
  • 代做论文 软件指导去哪些网站建设工程机械鉴定中心官网
  • 重庆网站推广服务asp网站检查
  • 卖车网站网站按抓取手机软件贵阳
  • 如何做微信电子书下载网站网站的前端怎么做
  • 曲靖 曲靖网站建设软件(app)开发媒体公关公司
  • 网站模块插件是怎么做的黄山网站建设策划
  • 如何查找做网站的服务商有限责任公司公司章程范本
  • seo怎样优化网站四川网站制作成都
  • 潍坊专业网站建设哪家便宜网站后台是怎么做出来的
  • 网站代码开发定制可以直接进入的正能量网站
  • 邢台网站制作哪家好设计网站公司专注y湖南岚鸿知 名
  • 网站二级导航制作烟台莱州网站建设
  • 网站关键词几个好wordpress收费插件
  • 制作网站商长春网站seo公司
  • 涞源网站建设做微信用什么网站
  • 网站制作应该选什么有哪些网站建设工作室
  • 网站建设 盈利佛山建设网站制作
  • 国产 做 视频网站软件定制开发服务公司
  • 佛山专业网站制作公司电子商务网站建设题目
  • 智能建站公司网站的设计规划
  • 四川省住房与城乡建设 厅网站论文 网站建设可行性
  • 付费小说网站建设网站建设实训报告的内容怎么写
  • 国建设银行e路通网站申用什么网站能直接做dj
  • 哪个网站有做电箱电柜的图纸青岛网站开发学校
  • 网站交易平台怎么注册建设论坛网站需要做什么的
  • 一元抢宝网站开发做网站的外包公司可以进吗
  • 做百度个人网站百度小说排行榜风云榜单