一种基于世界空间的粒子发射方法与流程

文档序号:15640927发布日期:2018-10-12 22:03阅读:276来源:国知局

本发明涉及计算机图形技术领域,更具体地说,是粒子系统在世界空间下发射的一种实现方法以及优化技术。



背景技术:

粒子系统是3d场景特效的一个重要组成部分,许多特殊的效果都可以通过粒子系统模拟出来,因此一个健全且稳定高效的粒子系统能够让应用的表达更丰富,如:雨,雪,落叶,烟,雾,火等自然效果都可以通过粒子系统实现。

一般的粒子系统实现主要集中在两个部分,一是粒子发射器的实现,一是粒子运行过程中的形态变化部分,这里我们主要是针对粒子的发射器部分进行改进,渲染引擎中实现了粒子发射器部分的功能,但是其实现的是为在局部坐标系下的粒子发射器,也即是说,当粒子系统节点移动时,粒子发射器新发射出来的粒子以及已发射的粒子会随着粒子系统节点的移动而移动,这种发射方法在需要效率的实时渲染中非常高效,在实现诸如火堆,烟雾效果时也足够,但是在实现诸如流星拖尾效果时,需要将发射出来的粒子留在发射位置,所以本发明即是解决在世界空间下发射粒子的问题,并且同时相对于在局部坐标系下发射粒子在世界空间坐标系下发射粒子会带来额外的计算量,因此在这个过程中我们也会采用一些技术手段来优化计算,增加效率。



技术实现要素:

为了达到上述目的,本发明提供一种基于世界空间的粒子发射方法,包括如下步骤:

s1、对渲染引擎提供的例子系统进行封装,创建一个particlesystem对象,该对象内部创建一个渲染引擎提供的粒子系统用particlesys变量保存;particlesystem对象对外提供一个position以及一个_worldquat属性,position属性是一个es6中的get和set属性;

s2、根据当前particlesystem对象所处的空间设置position,根据particlesystem对象simulationspace属性判断当前粒子的发射空间是局部空间还是世界坐标系空间,如果simulationspace等于simulationtype.local则表示当前粒子系统在局部坐标系空间下发射粒子,如果simulationspace等于simulationtype.world则表示当前粒子系统在世界坐标系下发射粒子;

s3、根据simulationspace参数值设置粒子系统的位置,如果simulationspace等于simulationtype.local则直接设置particlesys的position,如果simulationspace等于simulationtype.world则先将粒子系统节点的实际位置用particlesystem的私有变量_position保存下来不设置particlesys的position,然后设置每一个新生成的粒子的position;

s4、设置_worldquat属性来控制粒子的方向,如果是在局部坐标系下则直接设置particlesys的quaternion属性,即可将整个粒子系统进行旋转,如果是在世界坐标系空间下,则设置_worldquat保存粒子的旋转,然后在生成粒子时改变其方向;

s5、通过particlesystem对象的position以及_worldquat属性保存在局部坐标系以及世界坐标系下粒子系统位置方向;

s6、处理发射出的粒子的位置以及旋转,如果是在局部坐标系下则不做任何处理,如果是在世界坐标系空间下,则直接通过particlesystem对象的_position以及_worldquat属性设置其位置和旋转,

s7、通过3d的对象resparticle封装particlesystem对象,将particlesystem的particlesys添加到根节点中,通过resparticle对象的position以及rotation属性来表明其在场景节点树中的位置,然后通过每一帧同步resparticle对象的position以及rotation的属性给particlesystem的position以及_worldquat来实现粒子系统在世界坐标系空间下的发射。

本发明通过使用粒子系统本身的局部坐标系空间作为世界坐标系空间,所带来的运算开销只有设置每一个新生成的粒子位置以及额外的保存粒子系统的坐标以及方向的存储空间,避免了在每一个粒子的生命周期内去实时的计算其世界坐标,节省了大量的计算量。

具体实施方式

为了更好的理解本发明,下面详细说明本发明。

本发明实现了一种基于世界空间的粒子发射系统,能够让粒子在发射以后不随粒子局部空间的改变而改变,达到方便编辑与调节的目的,即所见即所得。并且此发明设计了相应的优化算法来保证该种发射形式的运行效率。

渲染引擎提供的粒子系统是在局部坐标系空间下发射的粒子系统,所以当粒子发射以后会随着粒子系统节点的位置方向的改变而改变,在节点化的场景中的体现,则是随着粒子系统节点及其父节点位置方向的变化而变化,所以为了实现世界坐标系空间下粒子的发射,即发射后的粒子不随粒子系统节点的位置方向变化而变化,则不能将渲染引擎提供的粒子系统直接加入到场景节点中,需要将其封装,并提供额外的属性来设置其发射出的粒子的位置和方向,即是利用渲染引擎粒子系统提供的局部坐标系空间下发射粒子的功能,如果是在局部坐标系下发射粒子,则直接渲染引擎粒子系统节点,如果是在世界坐标系下发射粒子,则不移动节点直接改变新发射粒子的位置,让其等于该节点应该在的位置,所以整个设计思路则是用粒子系统节点的局部坐标系空间模拟世界坐标系空间。

首先,对渲染引擎提供的粒子系统进行封装,创建一个particlesystem对象,该对象内部创建一个渲染引擎提供的粒子系统用particlesys变量保存,同时该对象对外提供一个position以及一个_worldquat属性,position属性是一个es6中的get和set属性,当设置position时会根据当前particlesystem对象所处的空间进行处理,在particlesystem对象simulationspace属性表明当前粒子的发射空间是局部空间还是世界坐标系空间,如果simulationspace等于simulationtype.local则表示当前粒子系统在局部坐标系空间下发射粒子,如果simulationspace等于simulationtype.world则表示当前粒子系统在世界坐标系下发射粒子,上面说到的position属性内部会根据这个参数来设置粒子系统的位置,如果simulationspace等于simulationtype.local则直接设置particlesys的position,如果simulationspace等于simulationtype.world则先将粒子系统节点的实际位置用particlesystem的私有变量_position保存下来不设置particlesys的position,然后设置每一个新生成的粒子的position,这样既可保证已经发射出的粒子不会随着粒子系统节点的移动而移动,粒子的方向则是通过_worldquat属性来控制,如果是在局部坐标系下则直接设置particlesys的quaternion属性,即可将整个粒子系统进行旋转,如果是在世界坐标系空间下,则设置_worldquat保存粒子的旋转,然后在生成粒子时改变其方向。

在通过particlesystem对象的position以及_worldquat属性实现了在局部坐标系以及世界坐标系下粒子系统位置方向的保存,在渲染引擎的particlesys对象发射的粒子有自己的生命周期控制,其中一个是当粒子生成时会调用的particleonbirty,我们在这里处理发射出的粒子的位置以及旋转,如果是在局部坐标系下则不做任何处理,如果是在世界坐标系空间下,则直接通过particlesystem对象的_position以及_worldquat属性设置其位置和旋转,这样做的原因是当场景中的节点没有父节点,且其位置在原点并且没有旋转时,则它本身的坐标系可以当做世界坐标系,基于这个原理,实现了粒子系统的发射空间在世界坐标系同局部坐标系的切换。

最后我们通过3d的对象resparticle封装particlesystem对象,将particlesystem的particlesys添加到根节点中,通过resparticle对象的position以及rotation属性来表明其在场景节点树中的位置,然后通过每一帧同步resparticle对象的position以及rotation的属性给particlesystem的position以及_worldquat来实现粒子系统在世界坐标系空间下的发射。

通过使用粒子系统本身的局部坐标系空间作为世界坐标系空间,所带来的运算开销只有设置每一个新生成的粒子位置以及额外的保存粒子系统的坐标以及方向的存储空间,避免了在每一个粒子的生命周期内去实时的计算其世界坐标,节省了大量的计算量。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1