• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Cpper
            C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿
            這是新版蓋莫游戲引擎2.1.1中全腳本控制的粒子系統(tǒng)
            相關(guān)的配套lua腳本(以后還會(huì)加入對python等腳本的支持)
              1 -- 這是蓋莫引擎中使用lua腳本的測試粒子
              2 
              3 -- 定義粒子池粒子個(gè)數(shù)
              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 -- 定義批處理粒子個(gè)數(shù)
             21 batch_particles = 80
             22 
             23 -- 定義粒子和地面之間的摩擦力
             24 friction = 0.75
             25 
             26 -- 定義粒子系統(tǒng)發(fā)射半徑
             27 fountain_radius = 1.6
             28 
             29 -- 定義粒子范圍半徑
             30 particle_r = (fountain_radius + particle_size/2)*(fountain_radius + particle_size/2)
             31 
             32 -- 初始化隨機(jī)種子
             33 function InitRand()
             34    math.randomseed(os.time())
             35 end
             36   
             37 -- 定義粒子速度
             38 particle_vel = 8.0
             39 
             40 -- 獲取時(shí)間對應(yīng)的速度值
             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平面隨機(jī)轉(zhuǎn)角
             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     ---- 獲取粒子隨機(jī)速度x分量
             60     local xy_angle = GetRandRotXY()
             61     local vt = GetVelByTime(dt)
             62     local xvel=0.45 * math.cos(xy_angle)*vt
             63     -- 獲取粒子隨機(jī)速度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 -- 更新粒子狀態(tài)
             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         -- 當(dāng)粒子碰撞到地面應(yīng)該跳起來
             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 粒子初始化函數(shù):
            109 InitParticles(dt)(參數(shù)當(dāng)前時(shí)間)
            110 返回位置,顏色,速度
            111 
            112 粒子更新函數(shù):
            113 UpdateParticles(life,xpos,ypos,zpos,xvel,yvel,zvel,dt)
            114 返回更新后的粒子壽命,位置,顏色以及速度
            115 ]]
            116 
            這是引擎當(dāng)前粒子系統(tǒng)配置的腳本文件
            可以改動(dòng)的就是例子初始化和更新函數(shù)的實(shí)現(xiàn)
            粒子初始化函數(shù)有1個(gè)時(shí)間輸入?yún)?shù)
            9個(gè)輸出參數(shù)分別為:位置顏色速度
            更新函數(shù)有粒子壽命,位置顏色速度和當(dāng)前時(shí)間
            傳回參數(shù)有粒子新壽命,粒子位置,顏色和速度
            另外幾個(gè)不可缺少的全局粒子變量有
            batch_particles
            particle_size
            particle_life
            max_particles
            含義就不提了
            對應(yīng)的cpp代碼如下:

             1 #include <GEngine/Gaimo.hpp>
             2 using namespace core; 
             3 void TransForm(double t);
             4  
             5 //! 設(shè)備指針 
             6 RefPtr<Device> device;
             7 //! 視頻驅(qū)動(dòng)指針
             8 RefPtr<VideoDriver> videodriver; 
             9 //! 3角函數(shù)表指針
            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 }

            使用方法很簡單就是從設(shè)備指針獲取lua上下文然后傳入粒子配置腳本文件
            獲取粒子描述符
            之后以其為參數(shù)從場景管理中獲取粒子系統(tǒng)即可使用
            夠簡潔吧
            截圖如下:
            posted on 2010-03-30 12:07 ccsdu2009 閱讀(1332) 評論(3)  編輯 收藏 引用 所屬分類: Game引擎
            Comments
            • # re: 蓋莫2.1.1版游戲引擎粒子系統(tǒng)-全腳本控制下的粒子系統(tǒng)[未登錄]
              清風(fēng)
              Posted @ 2010-03-31 10:40
              恩...粒子的更新我還一直想放到GPU上去計(jì)算,放到腳本里恐怕粒子數(shù)量稍大就歇菜了,特別對于復(fù)雜的效果.  回復(fù)  更多評論   
            • # re: 蓋莫2.1.1版游戲引擎粒子系統(tǒng)-全腳本控制下的粒子系統(tǒng)
              ccsdu2009
              Posted @ 2010-03-31 10:47
              @清風(fēng)
              這是當(dāng)然
              不過當(dāng)前使用多線程計(jì)算粒子數(shù)據(jù) 可以彌補(bǔ)一點(diǎn)損失  回復(fù)  更多評論   
            • # re: 蓋莫2.1.1版游戲引擎粒子系統(tǒng)-全腳本控制下的粒子系統(tǒng)
              99書城官方網(wǎng)站
              Posted @ 2010-03-31 13:32
              哈哈師大的俺不是大的呢  回復(fù)  更多評論   
             
            性欧美大战久久久久久久| 亚洲中文字幕无码久久精品1| 亚洲国产精品无码久久久秋霞2 | 精品久久久无码人妻中文字幕豆芽| 亚洲精品国产综合久久一线| 国产免费久久精品99久久| 国产精品99久久精品爆乳| 国产成人久久777777| 国产高清美女一级a毛片久久w| 日韩欧美亚洲综合久久影院d3| 91久久成人免费| 久久久久亚洲AV成人网| 蜜桃麻豆www久久国产精品| 色婷婷久久综合中文久久一本| 要久久爱在线免费观看| 久久综合色老色| 奇米影视7777久久精品| 97热久久免费频精品99| 国产成人精品久久亚洲高清不卡 | 久久国产三级无码一区二区| 四虎亚洲国产成人久久精品| 中文字幕无码免费久久| 91精品国产综合久久精品| 亚洲国产精品久久久久网站 | 三级片免费观看久久| 超级97碰碰碰碰久久久久最新| 狠狠色噜噜色狠狠狠综合久久| 国产精品久久久久…| 久久无码一区二区三区少妇 | 久久精品九九亚洲精品天堂| a级毛片无码兔费真人久久| 久久人人爽人人澡人人高潮AV| 亚洲午夜精品久久久久久浪潮| 色欲久久久天天天综合网| 色综合久久中文综合网| 99久久香蕉国产线看观香| 波多野结衣中文字幕久久| 亚洲国产成人精品无码久久久久久综合 | 亚洲另类欧美综合久久图片区| 久久精品国产亚洲av麻豆色欲 | 91精品国产综合久久精品|