【Ogre编程入门与进阶】第十三章 公告板与粒子系统_虚幻旧粒子公告板-程序员宅基地

技术标签: 粒子系统  Orge模块  公告板  ogre  ogre粒子系统  

13.1 公告板

        公告板在多数的英文教程中译为Billboard,我们平时逛街的时候,总会看到路边摆放着的交通指示牌、商场周围的广告牌等。这一章我们所学的“公告板”就跟这些指示牌、广告牌等在概念上很类似。只不过这里的“公告板”的概念和用法会更加简单。

        在Ogre中(事实上在计算机图形学中也是如此),公告板是在场景中随摄像机角度的变化而变换方向的简单四边形。也就是说,公告板的角度会根据摄像机的位置进行相应的调整,使公告板的正面法向量总是与摄像机方向相同。

        通常公告板随着摄像机的视方向旋转以便与摄像机的视线方向对齐。为了效率考虑,公告板与摄像机的视线方向对齐,而不是与从公告板到摄像机的向量对齐。大部分情况下两者没有明显的区别。如果想使用后一种的对齐形式,也可以办到,可以牺牲一些性能作为代价,这个我们在之后的章节会介绍。

        图13-1中展示了公告板的朝向位置。

图13-1:在(a)中公告板正朝向摄像机。

在(b)中,摄像机已经移动并且公告板也旋转自动朝向摄像机。

 

        具体来讲,公告板的应用是十分广泛的,我们可以把它想象成一个可以放置任何东西的大的容器,也或者是可以把它想象成一个表层。我们可以将公告板放置在场景中的任何位置,放置好以后,它就会一直朝向摄像机方向,即随着摄像机方向的变换而转动自己的角度。我们可以把普通的文本或是渲染纹理等一些基础的东西放置在公告板上,也可以通过放置一张图片来实现这个图片上的内容要反映的效果,比如我们可以放置一张硝烟滚滚的图片来模拟这种烟雾缭绕的效果。在一些大型的网络游戏中,我们通常会看到一些角色的头上会顶着一些随着角色移动而移动的文字或是图标等等,比如角色名字,这就是通过公告板实现的。

 

笔者注:

        为了提高执行效率,公告板虽然面向摄像机方向,但实际上并不是严格面向从公告板到摄像机的向量,而是有一定的误差,在大多实际应用中,这些误差并不明显。

我们在设计程序的时候可以实现让公告板来“分毫不差”的与摄像机向量对应,不过这会影响系统地执行效率。公告板本身看似很神奇,但是它只提供了一种在三维世界中创建特效的装置。公告板在默认情况下是有Ogre进行管理的,当然我们也可以从Ogre的手中将公告板“接管”过来,但这种做法是不被推荐的。

 

13.1.1公告板集合

        公告板不能独立存在,它们也不能自我渲染,它们必须属于某个公告板集合。公告板集合可认为是一组公告板的管理器,公告板集合内的所有公告板有相同的尺寸、相同的材质等等,这样做的原因是相同的尺寸和材质有助于提升计算机的计算和渲染效率。如果一个公告板集合拥有的公告板数量比较多的时候,使用相同的尺寸、相同的材质是十分必要的;不过当公告板集合中的公告板数量很少时,就没必要非得限制其中的公告板尺寸和材质等的一致性了。当然,我们单独改变一个公告板集合中的某一个或某几个公告板的尺寸或材质,但这样做会导致计算机计算和渲染性能的下降,因为公告板集合本身在设计的时候就是针对相同尺寸或材质的公告板进行优化的。  

        Ogre认为公告板集合是一个独立可操作的单位,集合中的公告板要么都不渲染,要么全部进行渲染。当然,我们也可以对集合中的某个单独的公告板进行操作,但这样做也会导致系统效率的下降。

 

笔者注:

        集合中公告板的位置是相对于集合在场景中挂载场景节点的相对位置。因为所有集合中的公告板都是用了相同的材质,进而可以在相同批次中被渲染,这就意味着对于GPU渲染来说200个公告板和2000个并没有什么大的不同。

 

13.1.2公告板池(Billboard Pools) 

                                                       

        在Ogre中使用公告板以及公告板集合的时候,我们需要像使用其他资源一样,对公告板以及公告板集合进行管理,公告板集合聚集在一起就形成了公告板池,公告板池的尺寸对应着公告板池内公告板集合的数量。Ogre会提前做好创建公告板的工作,以便在必要的使用提供给用户使用。公告板池内有两个队列:活动队列和空闲队列,分别用于盛放活动状态和空闲状态的公告板。公告板池的大小可以动态的扩大,可以通过代码将其在需要的时候扩大到原有尺寸的2倍,当然,公告板池尺寸的扩大就意味着要消耗更多的计算机资源来对其进行处理,从而会影响计算机的运行效率,实际应用中并不推荐这种扩大公告板池尺寸的做法,通常为保证系统的效率还是会选择原有公告板池的大小。                                                                             

13.2 粒子系统

        下面请读者思考一下,当我们在3D场景中添加一个人物模型的时候,只需要在程序中添加一句代码就可以轻松的实现,这是因为这个要添加在场景中的3D模型是一个“整体”。那么,我们在3D场景中要如何实现下雨的效果、喷泉喷放的效果、以及爆竹爆炸的效果?相信细心的读者已经可以发现,诸如下雨的效果、喷泉喷放的效果、以及爆竹爆炸的效果这些效果的对象:雨水、喷泉、炸裂的爆竹等等都不是一个独立的“整体”,那么这些效果在Ogre中要如何实现呢?下面,让我们马上来学习粒子系统这一节,相信在这之后读者朋友就可以轻松的实现这些效果了。事实上,粒子系统是3D程序中产生多种视觉特效的基础。虽然有些时候我们也可以用一些其他的方式来实现这些特效,不过使用粒子系统的好处就在于它的简单性。

13.2.1 粒子系统基础与3D场景

        粒子系统可以使用相应的脚本来定义,相对于硬编码的实现方式,脚本显得更加容易修改、而且脚本可以更好的为读者使用。如同Ogre系统中任何其它可以通过脚本来定义的系统一样,你也可以完全通过代码来创建和配置粒子系统。在粒子系统中所使用的粒子脚本在实际的使用中其实是一个粒子模板,你可以通过它在程序中产生多个实例。换句话说,你如果想创建多个相同的粒子效果,你不用定义多个粒子脚本,只要从一个脚本创建多个实例就好了。

        粒子系统会被挂到场景节点上,因此,节点的平移,缩放,旋转会关联到粒子系统,影响粒子反射。进一步说,粒子会被发射到世界空间中,这意味着当场景移动时,它会牵连到发射器,但已经发射出去的粒子不受影响。但是随着场景节点的变换,粒子发射器却跟随着一同产生相应的变换,发射出来的粒子却被遗留在后面(这就好像,移动的燃烧物遗留下来的烟迹一般)。假如需要这些粒子受结点的影响,可以把粒子发射到本地空间(local space)中。粒子系统不能无限制的发射粒子,它有一个限额(quota)。一旦到达限额,粒子系统不会再发射粒子,直到已经存在的粒子消亡。在默认的情况下,这个限制的数量是10,所以在你真正的应用中,需要把这个数值扩大到你需要的量上面。

 

笔者注:

        粒子系统必须拥有一个发射数量的配额,这就是它发射粒子的数量限制。一旦发射出来的粒子总数达到了这个限额,粒子系统就会停止发射,直到已经存在的粒子在达到其生命周期消失后,然后才能继续发射新的粒子。在默认的情况下,这个限制的数量是10,所以在实际应用中,需要及时设置这个数值已达到我们期望的目的。

 

13.2.2 创建第一个粒子系统

        在进行详细介绍Ogre的粒子系统之前,我们同样先来看一个简单的示例,让我们一睹Ogre中的粒子效果。

        同样,我们使用我们在前面章节保存的模板代码,修改createScene函数中的内容如下:

void createScene()

{

Ogre::ParticleSystem*partSystem =mSceneMgr->createParticleSystem("Smoke","Examples/Smoke");

mSceneMgr->getRootSceneNode()->attachObject(partSystem);

}

        编译并运行程序,你将会看到以下效果:

        代码分析:

        我们可以看到通过简单的两行代码就可以看到一个相当不错的烟雾特效,其实读者朋友应该不难想象,虽然我们在程序中只加了两行代码,但是大部分的内容都和我们定义材质的时候一样,粒子脚本允许你实例化的在你的脚本中定义粒子系统,而不必在源代码中进行设置,使得你做任何修改都能得到快速回应。在程序代码中,我们只需

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhanghua1816/article/details/46763131

智能推荐

FTP命令字和返回码_ftp 登录返回230-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏13次。为了从FTP服务器下载文件,需要要实现一个简单的FTP客户端。FTP(文件传输协议) 是 TCP/IP 协议组中的应用层协议。FTP协议使用字符串格式命令字,每条命令都是一行字符串,以“\r\n”结尾。客户端发送格式是:命令+空格+参数+"\r\n"的格式服务器返回格式是以:状态码+空格+提示字符串+"\r\n"的格式,代码只要解析状态码就可以了。读写文件需要登陆服务器,特殊用..._ftp 登录返回230

centos7安装rabbitmq3.6.5_centos7 安装rabbitmq3.6.5-程序员宅基地

文章浏览阅读648次。前提:systemctl stop firewalld 关闭防火墙关闭selinux查看getenforce临时关闭setenforce 0永久关闭sed-i'/SELINUX/s/enforcing/disabled/'/etc/selinux/configselinux的三种模式enforcing:强制模式,SELinux 运作中,且已经正确的开始限制..._centos7 安装rabbitmq3.6.5

idea导入android工程,idea怎样导入Android studio 项目?-程序员宅基地

文章浏览阅读5.8k次。满意答案s55f2avsx2017.09.05采纳率:46%等级:12已帮助:5646人新版Android Studio/IntelliJ IDEA可以直接导入eclipse项目,不再推荐使用eclipse导出gradle的方式2启动Android Studio/IntelliJ IDEA,选择 import project3选择eclipse 项目4选择 create project f..._android studio 项目导入idea 看不懂安卓项目

浅谈AI大模型技术:概念、发展和应用_ai大模型应用开发-程序员宅基地

文章浏览阅读860次,点赞2次,收藏6次。AI大模型技术已经在自然语言处理、计算机视觉、多模态交互等领域取得了显著的进展和成果,同时也引发了一系列新的挑战和问题,如数据质量、计算效率、知识可解释性、安全可靠性等。城市运维涉及到多个方面,如交通管理、环境监测、公共安全、社会治理等,它们需要处理和分析大量的多模态数据,如图像、视频、语音、文本等,并根据不同的场景和需求,提供合适的决策和响应。知识搜索有多种形式,如语义搜索、对话搜索、图像搜索、视频搜索等,它们可以根据用户的输入和意图,从海量的数据源中检索出最相关的信息,并以友好的方式呈现给用户。_ai大模型应用开发

非常详细的阻抗测试基础知识_阻抗实部和虚部-程序员宅基地

文章浏览阅读8.2k次,点赞12次,收藏121次。为什么要测量阻抗呢?阻抗能代表什么?阻抗测量的注意事项... ...很多人可能会带着一系列的问题来阅读本文。不管是数字电路工程师还是射频工程师,都在关注各类器件的阻抗,本文非常值得一读。全文13000多字,认真读完大概需要2小时。一、阻抗测试基本概念阻抗定义:阻抗是元器件或电路对周期的交流信号的总的反作用。AC 交流测试信号 (幅度和频率)。包括实部和虚部。​图1 阻抗的定义阻抗是评测电路、元件以及制作元件材料的重要参数。那么什么是阻抗呢?让我们先来看一下阻抗的定义。首先阻抗是一个矢量。通常,阻抗是_阻抗实部和虚部

小学生python游戏编程arcade----基本知识1_arcade语言 like-程序员宅基地

文章浏览阅读955次。前面章节分享试用了pyzero,pygame但随着想增加更丰富的游戏内容,好多还要进行自己编写类,从今天开始解绍一个新的python游戏库arcade模块。通过此次的《连连看》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。_arcade语言 like

随便推点

【增强版短视频去水印源码】去水印微信小程序+去水印软件源码_去水印机要增强版-程序员宅基地

文章浏览阅读1.1k次。源码简介与安装说明:2021增强版短视频去水印源码 去水印微信小程序源码网站 去水印软件源码安装环境(需要材料):备案域名–服务器安装宝塔-安装 Nginx 或者 Apachephp5.6 以上-安装 sg11 插件小程序已自带解析接口,支持全网主流短视频平台,搭建好了就能用注:接口是公益的,那么多人用解析慢是肯定的,前段和后端源码已经打包,上传服务器之后在配置文件修改数据库密码。然后输入自己的域名,进入后台,创建小程序,输入自己的小程序配置即可安装说明:上传源码,修改data/_去水印机要增强版

verilog进阶语法-触发器原语_fdre #(.init(1'b0) // initial value of register (1-程序员宅基地

文章浏览阅读557次。1. 触发器是FPGA存储数据的基本单元2. 触发器作为时序逻辑的基本元件,官方提供了丰富的配置方式,以适应各种可能的应用场景。_fdre #(.init(1'b0) // initial value of register (1'b0 or 1'b1) ) fdce_osc (

嵌入式面试/笔试C相关总结_嵌入式面试笔试c语言知识点-程序员宅基地

文章浏览阅读560次。本该是不同编译器结果不同,但是尝试了g++ msvc都是先计算c,再计算b,最后得到a+b+c是经过赋值以后的b和c参与计算而不是6。由上表可知,将q复制到p数组可以表示为:*p++=*q++,*优先级高,先取到对应q数组的值,然后两个++都是在后面,该行运算完后执行++。在电脑端编译完后会分为text data bss三种,其中text为可执行程序,data为初始化过的ro+rw变量,bss为未初始化或初始化为0变量。_嵌入式面试笔试c语言知识点

57 Things I've Learned Founding 3 Tech Companies_mature-程序员宅基地

文章浏览阅读2.3k次。57 Things I've Learned Founding 3 Tech CompaniesJason Goldberg, Betashop | Oct. 29, 2010, 1:29 PMI’ve been founding andhelping run techn_mature

一个脚本搞定文件合并去重,大数据处理,可以合并几个G以上的文件_python 超大文本合并-程序员宅基地

文章浏览阅读1.9k次。问题:先讲下需求,有若干个文本文件(txt或者csv文件等),每行代表一条数据,现在希望能合并成 1 个文本文件,且需要去除重复行。分析:一向奉行简单原则,如无必要,绝不复杂。如果数据量不大,那么如下两条命令就可以搞定合并:cat a.txt >> new.txtcat b.txt >> new.txt……去重:cat new...._python 超大文本合并

支付宝小程序iOS端过渡页DFLoadingPageRootController分析_类似支付宝页面过度加载页-程序员宅基地

文章浏览阅读489次。这个过渡页是第一次打开小程序展示的,点击某个小程序前把手机的开发者->network link conditioner->enable & very bad network 就会在停在此页。比如《支付宝运动》这个小程序先看这个类的.h可以看到它继承于DTViewController点击左上角返回的方法- (void)back;#import "DTViewController.h"#import "APBaseLoadingV..._类似支付宝页面过度加载页

推荐文章

热门文章

相关标签