| 
 | 
 
盖莫 2.1.1版游戏引擎粒子系统-全脚本控制下的粒子系统 
这是新版盖莫游戏引擎2.1.1中全脚本控制的粒子系统 
相关的配套lua脚本(以后还会加入对python等脚本的支持) 
-- 这是盖莫引擎中使用lua脚本的测试粒子 
-- 定义粒子池粒子个数 
max_particles = 2400 
-- 定义粒子初始位置 
particle_pos_x = 0.0 
particle_pos_y = 0.0 
particle_pos_z = 2.0 
-- 定义重力加速度 
gravity = 9.8 
-- 定义粒子大小 
particle_size = 0.8 
-- 定义粒子寿命 
particle_life = 8.2 
-- 定义批处理粒子个数 
batch_particles = 80 
-- 定义粒子和地面之间的摩擦力 
friction = 0.75 
-- 定义粒子系统发射半径 
fountain_radius = 1.6 
-- 定义粒子范围半径 
particle_r = (fountain_radius + particle_size/2)*(fountain_radius + particle_size/2) 
-- 初始化随机种子 
function InitRand() 
   math.randomseed(os.time()) 
end 
   
-- 定义粒子速度 
particle_vel = 8.0 
-- 获取时间对应的速度值 
function GetVelByTime(t) 
    return particle_vel*(0.8 + 0.1*(math.sin(0.5*t)+math.sin(0.31*t))) 
end 
    
-- 获取xy平面随机转角 
function GetRandRotXY() 
    return (2.0*3.14159265/4096.0) * math.random(1,4095) 
end    
function InitParticles(dt) 
    -- 定义粒子初始位置 
local xpos=particle_pos_x 
local ypos=particle_pos_y 
local zpos=particle_pos_z 
-- 初始化粒子颜色red,green,blue 
local red=0.7 + 0.3 * math.sin(0.34*dt + 0.1) 
local green=0.6 + 0.4 * math.sin(0.63*dt + 1.1) 
local blue=0.6 + 0.4 * math.sin(0.91*dt + 2.1) 
---- 获取粒子随机速度x分量 
local xy_angle = GetRandRotXY() 
    local vt = GetVelByTime(dt) 
    local xvel=0.45 * math.cos(xy_angle)*vt 
    -- 获取粒子随机速度y分量 
    xy_angle = GetRandRotXY() 
    vt = GetVelByTime(dt) 
    local yvel=0.45 * math.sin(xy_angle)*vt 
-- 获取粒子初始速度 
local zvel=0.7 + (0.3/4096.0) * (math.random(1,4095)) 
return xpos,ypos,zpos, 
        red,green,blue, 
     xvel,yvel,zvel 
end 
-- 更新粒子状态 
function UpdateParticles(life,xpos,ypos,zpos,xvel,yvel,zvel,red,green,blue,dt) 
    -- 修正粒子生命 
    local new_life = life - dt * (1.0 / particle_life) 
    -- 修正粒子速度 
    local new_zvel = zvel - gravity  *dt 
    local new_xpos = xpos + xvel*dt 
    local new_ypos = ypos + yvel*dt 
    local new_zpos = zpos + new_zvel*dt 
    if new_zvel < 0.0 then 
        if new_xpos*new_xpos + new_ypos*new_ypos < particle_r and new_zpos < particle_pos_z + particle_size/2 then 
            new_zvel = -friction * new_zvel 
            new_zpos  = particle_pos_z + particle_size/2 + friction * (particle_pos_z + particle_size/2 - new_zpos) 
        -- 当粒子碰撞到地面应该跳起来 
        elseif new_zpos < particle_size/2 then 
            new_zvel = -friction * new_zvel 
            new_zpos  = particle_size/2 + friction * (particle_size/2 - new_zpos) 
        end 
    end    
 
return new_life, 
        new_xpos,new_ypos,new_zpos, 
     red,green,blue, 
     xvel,yvel,new_zvel 
end 
--[[ 
盖莫引擎2.1.1使用的lua粒子脚本格式如下: 
全局变量: 
batch_particles 
particle_size 
particle_life 
max_particles 
粒子初始化函数: 
InitParticles(dt)(参数当前时间) 
返回位置,颜色,速度 
粒子更新函数: 
UpdateParticles(life,xpos,ypos,zpos,xvel,yvel,zvel,dt) 
返回更新后的粒子寿命,位置,颜色以及速度 
]] 
 
这是引擎当前粒子系统配置的脚本文件 
可以改动的就是例子初始化和更新函数的实现 
粒子初始化函数有1个时间输入参数 
9个输出参数分别为:位置颜色速度 
更新函数有粒子寿命,位置颜色速度和当前时间 
传回参数有粒子新寿命,粒子位置,颜色和速度 
另外几个不可缺少的全局粒子变量有 
batch_particles 
particle_size 
particle_life 
max_particles 
含义就不提了 
对应的cpp代码如下: 
#include <GEngine/Gaimo.hpp> 
using namespace core; 
void TransForm(double t); 
 
//! 设备指针 
RefPtr<Device> device; 
//! 视频驱动指针 
RefPtr<VideoDriver> videodriver; 
//! 3角函数表指针 
RefPtr<libmath::TriTable> table; 
 
int main(int argc, char **argv) 
{ 
    double     t0, t; 
    device = core::InitDevice("盖莫引擎粒子测试1",argv[0]); 
    videodriver = device->GetVideoDriver(); 
    table = device->GetTriTable(); 
    
    core: articleSystemDesc desc = device->GetLuaContext()->GetParticleSystemDesc("..\\script//particle1.lua"); 
    core::RefPtr<core::ParticleSystem> ps = device->GetSceneManager()->GetParticleSystem(desc); 
 
    t0 = device->GetTime(); 
    BEGIN_LOOP(device) 
        t = device->GetTime() - t0; 
        videodriver->SetViewPort(Recti(0,0,640,480)); 
        videodriver->SetClearColor(Color(0.0f, 0.0f, 0.3f, 1.0f)); 
        videodriver->SetClearBuffer(ENGINE_CLEAR_COLOR | ENGINE_CLEAR_DEPTH); 
        videodriver->SetPerpective(65.0f,64.0/48.0,1.0f,60.0f); 
        TransForm(t); 
        ps->Render(); 
    END_LOOP(device) 
    return 0; 
} 
 
void TransForm(double t) 
{ 
    double xpos, ypos, zpos, angle_x, angle_y, angle_z; 
    static double t_old = 0.0; 
    float  dt = (float)(t-t_old); 
    t_old = t; 
 
    angle_x = 80; 
    angle_y = 10.0 * table->SinTable( 0.3 * t ); 
    angle_z = 10.0 * t; 
 
    xpos =  15.0 * table->SinTable( (M_PI/180.0) * angle_z ) + 
             2.0 * table->SinTable( (M_PI/180.0) * 3.1 * t ); 
    ypos = -15.0 * table->CosTable( (M_PI/180.0) * angle_z ) + 
             2.0 * table->CosTable( (M_PI/180.0) * 2.9 * t ); 
    zpos = 4.0 + 2.0 * table->CosTable( (M_PI/180.0) * 4.9 * t ); 
    videodriver->SetPilotView(xpos,ypos,zpos,angle_z,angle_y,angle_x); 
} 
使用方法很简单就是从设备指针获取lua上下文然后传入粒子配置脚本文件 
获取粒子描述符 
之后以其为参数从场景管理中获取粒子系统即可使用 
够简洁吧 
截图如下: 
 
  |   
 
 
 
 |