OGRE粒子系统脚本详解
粒子脚本允许实例化地在自己的脚本代码中定义粒子系统,而不必在源代码中进行设置,可以在做任何修改对哦能得到快速的回应,脚本里定义的粒子系统被用作模版,并且多个实际的系统可以在运行时从脚本里被创建。
粒子系统脚本在系统初始化时被装载:默认它在普通资源所在位置搜寻.particle后缀的文件并分析它,如果想分析不同扩展名的文件,调用ParticleSystemManager::getSingleton().parseAllSources方法,或者是想分析单个文件,使用ParticleSystemManager::getSingletion().parseScripe. 一旦脚本被分析完,就可以基于这些代码使用SceneManager::createParticleSystem()方法实例化系统。
粒子脚本格式解析
particle_system Examples/GreenyNimbus
{
//设置这个系统中的全体粒子将要使用的材质名称。此系统中的全部粒子使用相同的材质,尽管每一个粒子可以通过使用它自己的颜色属性为材质附加颜色。
//格式:material<material_name> 示例:material Example/Flare 默认:none(空材质)
material Examples/FlarePointSprite
//在世界坐标中,设置粒子的宽度,当billboard_type()被设置为point或者perpendicular_self时,这个属性是绝对值,而当billboard_type是oriented_common , oriented_self
//或者perpendicular_common时,它是依方向向量的长度而定的。
particle_width 35
//在世界坐标中,设置粒子的高度。当billboard_type()被设置为point或者perpendicular_self时,这个属性是绝对值,而当billboard_type是oriented_common , oriented_self
//或者perpendicular_common时,它是依方向向量的长度而定的。
particle_height 35
//所有的粒子系统都被包括在一个包含这个系统所有粒子的边界盒内,这对一般的局部的有限的粒子系统,如大部分粒子是同时可见的或者是同时不可见的,是足够的,但是,
//对于那些在更大面积上扩散的粒子(例如,一个雨水系统),实际上也许想要单独的处理每一个粒子以便节约时间,因为很可能只有一小部分的粒子是可见的,可以通过设置 //cull__each的参数为真。默认的是false
cull_each false
//设置这个系统在某一时刻所允许包含的最多粒子数。当达到这个限制时,粒子发射器将不允许再发射粒子,直到某些粒子被消灭(例如,它们的time_to_live存续时间用尽)。值得注意的是,你几乎是肯定要改变这个设置的,因为默认值太短了(粒子池只能增加,而不能减少)。
格式: quota <max_particles>
示例: quota 10000
默认: 10
quota 5000
//
这实际上是'公告板'粒子渲染器(默认)的一个属性,同时也是通过在系统声明中直接声明的方法给粒子渲染器传递属性的一个示例。使用默认渲染器的粒子被用公告板进行渲染,即由2个旋转到面向指定方向的三角形组成的矩形构成的平面。但是,定向一个公告板有不止一种方法。传统方法是公告板直接面对摄像机:这也是默认的方法。但是,这种安排只是对于表现像光晕一样的模糊的球状物看上去还算可以。对于更多的诸如激光射线这样的线性效果,事实上你想要粒子有其自己的方向。
格式: billboard_type <point|oriented_common|oriented_self|perpendicular_common|perpendicular_self>
示例: billboard_type oriented_self
默认: point
此参数有如下选项:
- point
- 默认排列,它估计球状粒子和公告板总是完全面对摄像机。
- oriented_common
- 粒子面向一个共同的固定的方向向量,即它们的局部Y轴。公告板只围绕这个轴旋转,给粒子一些方向感。利于暴风雨,流星等粒子按一个方向移动的效果——较oriented_self(见下面)略快。
- oriented_self
- 粒子面向它们自己的方向向量,即它们的局部Y轴。隨着粒子改变方向,公告板也重定向它自己面向这个方向。利于激光射线,焰火,以及其它的按其自己的方向行进的粒子。
- perpendicular_common
- 粒子垂直于一个共同的固定的方向向量(参考common_direction),即它们的局部Z轴和它们的局部Y轴共同确定的平面,有共同的方向和向上的向量(参考common_up_vector)。公告板从未旋转至面向摄像机,你可能使用双面材质以便确保粒子不会被背面包含。利于光环,圆环等粒子将垂直于地面的效果
- perpendicular_self
- 粒子垂直于它们自己的方向向量,即它们的Z轴和Y轴共同确定的平面,有它们自己的方向向量和共同的向上向量(参考common_up_vector)。公告板从未旋转至面向摄像机,你可能使用双面材质以便确保粒子不会被背面包含。利于圆环堆等粒子将垂直于它们的行进方向的效果。
billboard_type point
renderer
粒子渲染器可以有属性,并且可以通过在根粒子系统中设定属性进行传递。
sorted
默认情况下,粒子是不排序的。若设定这个属性为'真',粒子将会根据摄影机的位置关系被排序,最远的优先。通过花费一小点儿排序的代价,就可以制作出特定的渲染效果。
local_space
billboard_origin
示例: billboard_origin top_right
billboard_rotation_type
格式: billboard_rotation_type <vertex|texcoord>
示例: billboard_rotation_type vertex
common_direction
如果billboard_type被设置为oriented_common或者perpendicular_common才需要,这个向量是用于定位系统中所有粒子的共用向量。
格式: common_direction <x> <y> <z>
common_up_vector
如果billboard_type被设置为perpendicular_self或者perpendicular_common才需要,这个向量是用于定位系统中所有粒子的共用向上向量。
格式: common_up_vector <x> <y> <z>
point_rendering
事实上,这是‘公告板’粒子渲染器(默认设置)的一个属性,设置与否关系到公告板将使用点渲染而不是手动生成渲染画面。
虽然使用点渲染较手动生成渲染区域更快,但是多了许多限制。限制如下:
如果你使用这个选项,你将几乎是肯定要打开材质通路中的point attenuation和point sprites。
accurate_facing
iteration_interval
nonvisible_update_timeout
当粒子系统在其已经无法可见需要停止更新时设置。默认情况下,可见粒子系统一直更新,即使不在视口内。这意味着当它们进入视口时可以保证一致性。但是,更新粒子系统所花费的代价可能是很昂贵的。
这个选项让你在粒子系统上设置一个'timeout'时限,以便如果它这么长时间不可见,即停止更新,直到它下次可见。值0表示关闭timeout,总是更新。
格式: nonvisible_update_timeout <secs>
示例: nonvisible_update_timeout 10
默认: nonvisible_update_timeout 0
粒子发射器按类型划分为几类,例如:Point发射器从单独一点发射,而Box发射器则是从一块儿区域随机发射。新的发射器可以通过插件加入到Ogre中去。向系统中增加一个发射器需要将发射器嵌入到其它块中,以关键字“emitter”后跟发射器类型名(大小写敏感)开头。Ogre现在支持'Point','Box','Cylinder','Ellipsoid','HollowEllipsoid'以及'Ring'发射器。
angle
colour
colour_range_start和colour_range_end
除了这两个属性必须一起制定外,其它的都和'colour'属性一样,并且制定了被发射出去的粒子的可用颜色范围。实际的颜色将会在这两个值之间随机选择。
示例(随机生成红蓝之间的颜色): colour_range_start 1 0 0 colour_range_end 0 0 1
direction
设置发射器的方向。这与粒子系统所在的SceneNode有关,意思就是随着其它可移动物体改变节点方向,发射器也会随着移动。
emission_rate
格式: emission_rate <particles_per_second>
position
velocity
给所有粒子设置发射时的速率。也可参看velocity_min和velocity_max两个属性,它们允许你设置一个速率范围,而不是一个固定不变的值。
格式: velocity <world_units_per_second>
velocity_min & velocity_max
这两个属性除了是设置一个速率范围外,其它的与'velocity'一样。而且每一个粒子都是以在这个范围内的随机速率被发射出去的。
示例: velocity_min 50 velocity_max 100
time_to_live
time_to_live_min & time_to_live_max
这两个属性除了是设置一个生命时间范围以外,其它的与time_to_live一样,并且每个粒子在发射时得到这一范围内的一个随机的数值,作为其存在时间。
示例: time_to_live_min 2 time_to_live_max 5
duration
duration_min & duration_max
除了这两个属性是设置一个可变的时间范围外,其它的与duration一样。
示例: duration_min 2 duration_max 5
repeat_delay
设置重新开始发射需要等待的秒数。参看repeat_delay_min和repeat_delay_max属性,这两个属性允许你设置一个repeat_delays时间范围,而不是设置一个固定的值。
repeat_delay_min & repeat_delay_max
这两个属性除了是设置重新开始需要等待的时间范围外,其它的与repeat_delay一样,并且每次发射器被启动,它都会在这个范围内得到一个随机数值,作为重新开始发射需要的等待时间。
示例: repeat_delay 2 repeat_delay 5
Point Emitter
这个发射器从一个定点,即它所在的位置,发射粒子。除了标准发射器属性,这个发射器没有其它属性。
要创建一个点发射器,需要在你的粒子系统脚本中包含类似下面的部分:
emmiter Point {// Settings go here }
Box Emitter
这个发射器从一个3维盒子里的随机位置发射粒子。它有额外的属性:
- width
- 设置盒子的宽度(这是盒子沿着它自己的X轴的长度,依赖于形成盒子Z坐标的'direction'属性)。
- 格式:width <units>
- 示例:width 250
- 默认:100
- height
- 设置盒子的高度(这是盒子沿着它自己的Y轴的长度,依赖于形成盒子Z坐标的'direction'属性)。
- 格式:height <units>
- 示例:height 250
- 默认:100
- depth
- 设置盒子的深度(这是盒子沿着它自己的Z轴的长度,与'direction'属性相同)
- 格式:depth <units>
- 示例:depth 250
- 默认:100
要创建一个盒发射器,需要在你的粒子系统脚本中包含类似下面的部分:
emitter Box {// Settings go here }
Cylinder Emitter
Ellipsoid Emitter
这个发射器是从一个椭圆体形状的区域里发射粒子的,例如一个球体或者压扁了的球体区域。参数再一次与Box Emitter相似,除了维度描述为每个坐标轴上的范围最广的点。
Hollow Ellipsoid Emitter
这个发射器很像Ellipsoid Emitter,除了椭圆体中心有一个空洞区域不发射粒子。因此,它有3个额外的参数定义这个空洞区域:
Ring Emitter
这个发射器从一个环状区域发射粒子。除了只有2个维度外,有点像Hollow Ellipsoid Emitter。
Emitting Emitters
在粒子逾期时产生新的发射器是可能的,例如产生火焰类型的效果。这是通过以下指令控制的:
- emit_emitter_quota
- 这个参数是一个系统级参数,就是告诉系统任意一次可能使用多少个发射器。也就是允许进行空间分配处理。
- name
- 这个参数是一个发射器级参数,即给发射器确定一个名字。这样,当粒子消亡时,其它粒子发生器可以引用这个名字作为生成的新发射器。
- emit_emitter
- 这个参数是一个发射器级参数,如果指定,则意为当这个发射器发射的粒子消亡时,生成一个新的发射器。
粒子影响器可以在粒子存续期间对粒子进行修改。它们按“类型”分为:LinearForce影响器,对所有粒子应用一个力;ColourFader影响器改变飞行中的粒子的颜色。新的影响器可以通过创建插件的形式增加到Ogre中来。你可以通过将影响器嵌套在另一个别的程序块里的办法,向系统中增加一个影响器,以关键字affector开头,后跟影响器的类型名(注意:大小写敏感)。Ogre当前支持LinearForce和ColourFader两种影响器。
粒子影响器事实上没有统一的属性;属性都是每种影响器特有的。
Linear Force Affector
这个影响器对所有粒子施加一个力,改变粒子的运动轨迹。可以用于重力,风力,或者其它线性力。其额外属性有:
- force_vector
- 为应用到每一个粒子的那个力设置向量。这个向量的模决定了力的大小。
- 格式:force_vector <x> <y> <z>
- 示例:force_vector 50 0 -50
- 默认:0 -100 0(一个重力效果)
- force_application
- 设置这个力向量作用于粒子动量的方法。
- 格式:force_application <add|average>
- 示例:force_application average
- 默认:add
-
可选参数有:
- average
- 最终动量是这个力与粒子当前运动的平均值。这样也就使得其本身虽然是稳定的,但是在粒子改变方向时的速度是非线性的。
- add
- 最终动量是粒子的当前运动与这个力之和。这是传统的力的叠加,但是潜在地可能导致无限速率。
要创建一个线性力影响器,需要你的粒子系统脚本中包含一段如下代码:
affector LinearForce {// 设置写在这里 }
请注意:影响器类型的名字(LinearForce)是大小写敏感的。
ColourFader Affector
- red
-
设置每秒时间内粒子颜色中的红色分量的调整量。
- 格式:red <delta_value>
- 示例:red -0.1
- 默认:0
- green
-
设置每秒时间内粒子颜色中的绿色分量的调整量。
- 格式:green <delta_value>
- 示例:green -0.1
- 默认:0
- blue
-
设置每秒时间内粒子颜色中的蓝色分量的调整量。
- 格式:blue <delta_value>
- 示例:blue -0.1
- 默认:0
- alpha
-
设置每秒时间内粒子颜色中的alpha分量的调整量。
- 格式:alpha <delta_value>
- 示例:alpha -0.1
- 默认:0
- 要创建一个颜色减弱影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector ColourFader {// 设置写在这里 }
ColourFader2 Affector
此影响器类似ColourFader Affector,只不过这个影响器有两个颜色改变状态。在粒子存续期内,指定还剩一段时间时,激活第二个颜色改变状态。
- red1
-
设置在第一个状态期间每秒时间内粒子颜色的红色分量的调整量。
- 格式:red <delta_value>
- 示例:red -0.1
- 默认:0
- green1
-
设置在第一个状态期间每秒时间内粒子颜色的绿色分量的调整量。
- 格式:green <delta_value>
- 示例:green -0.1
- 默认:0
- blue1
-
设置在第一个状态期间每秒时间内粒子颜色的蓝色分量的调整量。
- 格式:blue <delta_value>
- 示例:blue -0.1
- 默认:0
- alpha1
-
设置在第一个状态期间每秒时间内粒子颜色的alpha分量的调整量。
- 格式:alpha <delta_value>
- 示例:alpha -0.1
- 默认:0
- red2
-
设置在第二个状态期间每秒时间内粒子颜色的红色分量的调整量。
- 格式:red <delta_value>
- 示例:red -0.1
- 默认:0
- green2
-
设置在第二个状态期间每秒时间内粒子颜色的绿色分量的调整量。
- 格式:green <delta_value>
- 示例:green -0.1
- 默认:0
- blue2
-
设置在第二个状态期间每秒时间内粒子颜色的蓝色分量的调整量。
- 格式:blue <delta_value>
- 示例:blue -0.1
- 默认:0
- alpha2
-
设置在第二个状态期间每秒时间内粒子颜色的alpha分量的调整量。
- 格式:alpha <delta_value>
- 示例:alpha -0.1
- 默认:0
- state_change
-
当一个粒子还有这么多存续时间时,它将转入状态二。
- 格式:state_change <seconds>
- 示例:state_change 2
- 默认:1
要创建一个颜色减弱2影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector ColourFader2 {// 设置写在这里 }
Scaler Affector
要创建一个伸缩影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector Scaler {// 设置写在这里 }
Rotator Affector
此影响器依靠旋转粒子的贴图纹理来旋转飞行中的粒子。额外的属性有:
- rotation_speed_range_start
-
赋值给发射出去的粒子的旋转速度范围的初始值。
- 格式:rotation_speed_range_start <degrees_per_second>
- 示例:rotation_speed_range_start 90
- 默认:0
- rotation_speed_range_end
-
赋值给发射出去的粒子的旋转速度范围的结束值。
- 格式:rotation_speed_range_end <degrees_per_second>
- 示例:rotation_speed_range_end 180
- 默认:0
- rotation_range_start
-
赋值给发射出去的粒子的旋转角度的初始值。
- 格式:rotation_range_start <degrees>
- 示例:rotation_range_start 0
- 默认:0
- rotation_range_end
-
赋值给发射出去的粒子的旋转角度的结束值。
- 格式:rotation_range_end <degrees>
- 示例:rotation_range_end 360
- 默认:0
要创建一个旋转影响器,需要在你的粒子系统脚本中包含如下一段代码:
ColourInterpolator Affector
类似于ColourFader和ColourFader2,此影响器也是修改飞行中的粒子的颜色。只不过这个影响器有一组不定个数的已经定义好的状态。它在粒子存续期内在几种状态间插值变换粒子的颜色。额外的属性有:
- time0
-
状态0的时间点。
- 格式:time0 <0到1,基于粒子的存续时间>
- 示例:time0 0
- 默认:1
- colour0
-
状态0时的颜色。
- 格式:colour0 <r g b> [<a>]
- 示例:colour0 1 0 0 1
- 默认:0.5 0.5 0.5 0.0
- time1
-
状态1的时间点。
- 格式:time1 <0到1,基于粒子的存续时间>
- 示例:time1 0.5
- 默认:1
- colour1
-
状态1时的颜色。
- 格式:colour1 <r g b> [<a>]
- 示例:colour1 0 1 0 1
- 默认:0.5 0.5 0.5 0.0
- time2
-
状态2的时间点。
- 格式:time2 <0到1,基于粒子的存续时间>
- 示例:time2 1
- 默认:1
- colour2
-
状态2时的颜色。
- 格式:colour2 <r g b> [<a>]
- 示例:colour2 0 0 1 1
- 默认:0.5 0.5 0.5 0.0
- [...]
状态数是可变的。最多6个。即time5和colour5是最后的参数。要想创建一个颜色插值影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector ColourInterpolator {// 设置写在这里 }
ColourImage Affector
这是另一个改变飞行粒子的颜色的影响器,但替代编程定义颜色的是,从一个指定的图像文件中取得颜色。在粒子的存续时间内,颜色的取值范围是从图像的左侧开始向右移动,因此,只使用了水平方向的图像。额外属性有:
- image
-
赋值给发射出去的粒子的旋转速度范围的初始值。
- 格式:image <image_name>
- 示例:image rainbow.png
- 默认:无
要创建一个图像颜色影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector ColourImage {// 设置写在这里 }
DeflectorPlane Affector
此影响器定义一个平面,这个平面反弹碰到它的粒子。额外的属性有:
- plane_point
-
反弹平面上一点。与plane_normal一起使用。
- 默认:plane_point 0 0 0
- plane_normal
-
反弹平面的法线向量。与plane_point一起使用。
- 默认:plane_normal 0 1 0
- bounce
-
当一个粒子被反弹时的弹力大小。0表示没有反弹,1表示100%反弹。
- 默认:bounce 1.0
DirectionRandomiser Affector
- randomness
-
每一轴向上随机性的大小。
- 示例:randomness 5
- 默认:randomness 1
- scope
-
每一轮受影响的粒子的百分比。
- 示例:scope 0.5
- 默认:scope 1.0
- keep_velocity
-
决定是否不改变粒子的速率。
- 示例:keep_velocity true //不改变粒子速率
- 默认:keep_velocity false //即改变粒子速率
// Make em float upwards
affector LinearForce
{
force_vector 0 100 0
force_application add
}
// Fader
affector ColourFader
{
red -0.25
green -0.25
blue -0.25
}
}
OGRE粒子系统脚本详解相关推荐
- sshd系统自带启动脚本详解
SSH 为 Secure Shell 的缩写.sshd服务是linux系统中最经常使用的服务之一.由于其规避了明文传送口令.内容本文及中间人***的安全隐患,因此经常作为远程管理系统的首选方案.虽然各 ...
- shell脚本详解(十二)——Here Document免交互及Expect自动化交互
shell脚本详解(十二)--Here Document免交互及Expect自动化交互 一.Here Document 免交互 1.格式 2.注意事项 3.免交互方式实现对行数的统计,将要统计的内容置 ...
- shell脚本详解(十)——sed编辑器的使用方法
shell脚本详解(十)--sed编辑器的使用方法 一.sed编辑器 二.sed编辑器工作流程 1.读取: 2.执行: 3.显示: 4.注: 三.命令格式 四.常用选项 五.常用操作 六.使用地址 s ...
- shell脚本详解(九)——一键部署DNS正向解析
shell脚本详解(九)--一键部署DNS正向解析 一.DNS正向解析 二.shell脚本一键部署 一.DNS正向解析 详情请点击:DNS正向解析 二.shell脚本一键部署 #!/bin/bash ...
- shell脚本详解(七)——正则表达式、sort、uniq、tr
shell脚本详解(七)--正则表达式.sort.uniq.tr 一.排序命令--sort 1.格式 2.常用选项 3.示例 二.去除重复行操作命令--uniq 1.格式 2.常用选项 3.示例 三. ...
- shell脚本详解(六)——数组简介和排序算法
shell脚本详解(六)--数组简介和排序算法 一.数组 1.数组的定义方法 ①.方式一: ②.方式二: ③.方式三: ④.方式四: 2.数组包括的数据类型 3.获取数组长度 4.获取数据列表 5.读 ...
- shell脚本详解(四)——循环语句之while循环和until循环(附加例题及解析)
shell脚本详解(四)--循环语句之while循环和until循环 一.until循环 1.循环结构 2.例题 二.while循环 1.循环结构 2.例题(每个人的思路不同,会导致脚本内容不一样,这 ...
- shell脚本详解(三)——循环语句之for循环
shell脚本详解(三)--循环语句之for循环 一.echo命令 – 输出字符串或提取Shell变量的值 1.格式 2.常用参数 3.示例 二.for循环语句 1.for循环结构 2.例题 ①.例题 ...
- shell脚本详解(二)——条件测试、if语句和case分支语句
shell脚本详解(二)--条件测试.if语句和case分支语句 一.条件测试 1.test命令 2.文件测试 3.整数值比较 4.字符串比较 5.逻辑测试 二.if条件语句 1.单分支 2.双分支 ...
最新文章
- 计算机网络的八股文自述(持续更新)
- 帝国cms7.5多终端刷新单条内容信息时不起作用的解决方法
- A.01.01—模块的输入—低端输入
- Server.Transfer()與Response.Redirect()的區別
- Bean生命周期配置
- Thread类中的join方法
- c语言的基本数据类型和表达式,C语言–基本数据类型和表达式.ppt
- Visual studio code清除终端数据
- 博图如何上载wincc程序_博图导入触摸屏程序 如何通过博图下载触摸屏程序
- FPGA零基础学习:按键控制LED
- KeilC51基本关键字
- linux 安装pureftp
- 使用python画出简易的滑稽表情
- 怪异,漂亮的几个数学恒等式(转)
- 扣图神器, 用Python 5行代码解决
- GBase 8a管理集群gcware的日志-vote leader、flower、candidate部分
- Component series.line not exists. Load it first.
- Excel导出带有多个图表(柱状图、折线图、饼状图等)
- 贵阳c语言学习,贵阳市c语言编程
- 2022-2028年全球与中国零售会计软件行业发展趋势及竞争策略研究
热门文章
- java mye_JAVA环境搭建之MyEclipse10+jdk1.8+tomcat8环境搭建详解
- MYSQL:Unknown column ‘字段名‘ in ‘field list‘ 错误解决方案
- android源码大放送啦(实战开发必备)
- [YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测
- 解决APP抓包问题【网络安全】
- vue_2.0_fyf
- 2019日历全年一张_2020年剑桥英语全年考试日历发布,参与活动还能赢取实体台历!...
- 使用PHPExcel生成Excel文件和图表
- 用JavaScript编写的一个点名系统
- xshell、CRT上使用vbscript更高效连接定位到服务器以及目录、数据库