游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2496|回复: 0

盖莫 2.1.1版游戏引擎粒子系统-全脚本控制下的粒子系统

[复制链接]

56

主题

94

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2010-3-30 13:18:00 | 显示全部楼层 |阅读模式
盖莫 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上下文然后传入粒子配置脚本文件
获取粒子描述符
之后以其为参数从场景管理中获取粒子系统即可使用
够简洁吧
截图如下:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-5-13 10:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表