Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
这是新版盖莫游戏引擎2.1.1中全脚本控制的粒子系统
相关的配套lua脚本(以后还会加入对python等脚本的支持)
  1 -- 这是盖莫引擎中使用lua脚本的测试粒子
  2 
  3 -- 定义粒子池粒子个数
  4 max_particles = 2400
  5 
  6 -- 定义粒子初始位置
  7 particle_pos_x = 0.0
  8 particle_pos_y = 0.0
  9 particle_pos_z = 2.0
 10 
 11 -- 定义重力加速度
 12 gravity = 9.8
 13 
 14 -- 定义粒子大小
 15 particle_size = 0.8
 16 
 17 -- 定义粒子寿命
 18 particle_life = 8.2
 19 
 20 -- 定义批处理粒子个数
 21 batch_particles = 80
 22 
 23 -- 定义粒子和地面之间的摩擦力
 24 friction = 0.75
 25 
 26 -- 定义粒子系统发射半径
 27 fountain_radius = 1.6
 28 
 29 -- 定义粒子范围半径
 30 particle_r = (fountain_radius + particle_size/2)*(fountain_radius + particle_size/2)
 31 
 32 -- 初始化随机种子
 33 function InitRand()
 34    math.randomseed(os.time())
 35 end
 36   
 37 -- 定义粒子速度
 38 particle_vel = 8.0
 39 
 40 -- 获取时间对应的速度值
 41 function GetVelByTime(t)
 42     return particle_vel*(0.8 + 0.1*(math.sin(0.5*t)+math.sin(0.31*t)))
 43 end
 44    
 45 -- 获取xy平面随机转角
 46 function GetRandRotXY()
 47     return (2.0*3.14159265/4096.0* math.random(1,4095)
 48 end   
 49 
 50 function InitParticles(dt)
 51     -- 定义粒子初始位置
 52     local xpos=particle_pos_x
 53     local ypos=particle_pos_y
 54     local zpos=particle_pos_z
 55     -- 初始化粒子颜色red,green,blue
 56     local red=0.7 + 0.3 * math.sin(0.34*dt + 0.1)
 57     local green=0.6 + 0.4 * math.sin(0.63*dt + 1.1)
 58     local blue=0.6 + 0.4 * math.sin(0.91*dt + 2.1)
 59     ---- 获取粒子随机速度x分量
 60     local xy_angle = GetRandRotXY()
 61     local vt = GetVelByTime(dt)
 62     local xvel=0.45 * math.cos(xy_angle)*vt
 63     -- 获取粒子随机速度y分量
 64     xy_angle = GetRandRotXY()
 65     vt = GetVelByTime(dt)
 66     local yvel=0.45 * math.sin(xy_angle)*vt
 67     -- 获取粒子初始速度
 68     local zvel=0.7 + (0.3/4096.0* (math.random(1,4095))
 69     return xpos,ypos,zpos,
 70            red,green,blue,
 71            xvel,yvel,zvel
 72 end
 73 
 74 -- 更新粒子状态
 75 function UpdateParticles(life,xpos,ypos,zpos,xvel,yvel,zvel,red,green,blue,dt)
 76     -- 修正粒子生命
 77     local new_life = life - dt * (1.0 / particle_life)
 78     -- 修正粒子速度
 79     local new_zvel = zvel - gravity  *dt
 80     local new_xpos = xpos + xvel*dt
 81     local new_ypos = ypos + yvel*dt
 82     local new_zpos = zpos + new_zvel*dt 
 83     if new_zvel < 0.0 then
 84         if new_xpos*new_xpos + new_ypos*new_ypos < particle_r and new_zpos < particle_pos_z + particle_size/2 then
 85             new_zvel = -friction * new_zvel
 86             new_zpos  = particle_pos_z + particle_size/2 + friction * (particle_pos_z + particle_size/2 - new_zpos)
 87         -- 当粒子碰撞到地面应该跳起来
 88         elseif new_zpos < particle_size/2 then
 89             new_zvel = -friction * new_zvel
 90             new_zpos  = particle_size/2 + friction * (particle_size/2 - new_zpos)
 91         end
 92     end   
 93     
 94     return new_life,
 95            new_xpos,new_ypos,new_zpos,
 96            red,green,blue,
 97            xvel,yvel,new_zvel
 98 end
 99 
100 --[[
101 盖莫引擎2.1.1使用的lua粒子脚本格式如下:
102 全局变量:
103 batch_particles
104 particle_size
105 particle_life
106 max_particles
107 
108 粒子初始化函数:
109 InitParticles(dt)(参数当前时间)
110 返回位置,颜色,速度
111 
112 粒子更新函数:
113 UpdateParticles(life,xpos,ypos,zpos,xvel,yvel,zvel,dt)
114 返回更新后的粒子寿命,位置,颜色以及速度
115 ]]
116 
这是引擎当前粒子系统配置的脚本文件
可以改动的就是例子初始化和更新函数的实现
粒子初始化函数有1个时间输入参数
9个输出参数分别为:位置颜色速度
更新函数有粒子寿命,位置颜色速度和当前时间
传回参数有粒子新寿命,粒子位置,颜色和速度
另外几个不可缺少的全局粒子变量有
batch_particles
particle_size
particle_life
max_particles
含义就不提了
对应的cpp代码如下:

 1 #include <GEngine/Gaimo.hpp>
 2 using namespace core; 
 3 void TransForm(double t);
 4  
 5 //! 设备指针 
 6 RefPtr<Device> device;
 7 //! 视频驱动指针
 8 RefPtr<VideoDriver> videodriver; 
 9 //! 3角函数表指针
10 RefPtr<libmath::TriTable> table; 
11 
12 int main(int argc, char **argv)
13 {
14     double     t0, t;
15     device = core::InitDevice("盖莫引擎粒子测试1",argv[0]);
16     videodriver = device->GetVideoDriver(); 
17     table = device->GetTriTable();
18     
19     core::ParticleSystemDesc desc = device->GetLuaContext()->GetParticleSystemDesc("..\\script//particle1.lua");
20     core::RefPtr<core::ParticleSystem> ps = device->GetSceneManager()->GetParticleSystem(desc);
21 
22     t0 = device->GetTime();
23     BEGIN_LOOP(device)
24         t = device->GetTime() - t0;
25         videodriver->SetViewPort(Recti(0,0,640,480));
26         videodriver->SetClearColor(Color(0.0f0.0f0.3f1.0f));
27         videodriver->SetClearBuffer(ENGINE_CLEAR_COLOR | ENGINE_CLEAR_DEPTH);
28         videodriver->SetPerpective(65.0f,64.0/48.0,1.0f,60.0f);
29         TransForm(t);
30         ps->Render();
31     END_LOOP(device)
32     return 0;
33 }
34 
35 void TransForm(double t)
36 {
37     double xpos, ypos, zpos, angle_x, angle_y, angle_z;
38     static double t_old = 0.0;
39     float  dt = (float)(t-t_old);
40     t_old = t;
41 
42     angle_x = 80;
43     angle_y = 10.0 * table->SinTable( 0.3 * t );
44     angle_z = 10.0 * t;
45  
46     xpos =  15.0 * table->SinTable( (M_PI/180.0* angle_z ) +
47              2.0 * table->SinTable( (M_PI/180.0* 3.1 * t );
48     ypos = -15.0 * table->CosTable( (M_PI/180.0* angle_z ) +
49              2.0 * table->CosTable( (M_PI/180.0* 2.9 * t );
50     zpos = 4.0 + 2.0 * table->CosTable( (M_PI/180.0* 4.9 * t );
51     videodriver->SetPilotView(xpos,ypos,zpos,angle_z,angle_y,angle_x);
52 }

使用方法很简单就是从设备指针获取lua上下文然后传入粒子配置脚本文件
获取粒子描述符
之后以其为参数从场景管理中获取粒子系统即可使用
够简洁吧
截图如下:
posted on 2010-03-30 12:07 ccsdu2009 阅读(1317) 评论(3)  编辑 收藏 引用 所属分类: Game引擎
Comments
  • # re: 盖莫2.1.1版游戏引擎粒子系统-全脚本控制下的粒子系统[未登录]
    清风
    Posted @ 2010-03-31 10:40
    恩...粒子的更新我还一直想放到GPU上去计算,放到脚本里恐怕粒子数量稍大就歇菜了,特别对于复杂的效果.  回复  更多评论   
  • # re: 盖莫2.1.1版游戏引擎粒子系统-全脚本控制下的粒子系统
    ccsdu2009
    Posted @ 2010-03-31 10:47
    @清风
    这是当然
    不过当前使用多线程计算粒子数据 可以弥补一点损失  回复  更多评论   
  • # re: 盖莫2.1.1版游戏引擎粒子系统-全脚本控制下的粒子系统
    99书城官方网站
    Posted @ 2010-03-31 13:32
    哈哈师大的俺不是大的呢  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理