• <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等多種語言 程序猿

            以前看過很長時間的boost,記得上面有STATIC_ASSERT
            在loki庫中也有類似的宏
            1 LOKI_STATIC_CHECK(expr, msg)
            其中expr代表要斷言的表達式
            當其為假,則讓程序無法通過編譯
            其實現很簡單
            利用模板特化:

            1     template<int> struct CompileTimeError;
            2     template<> struct CompileTimeError<true> {};
            當表達式為真則使用模板特化形式
            注意其模板在這里僅僅做前向引用
            再看具體的宏:
            1 #define LOKI_STATIC_CHECK(expr, msg) \
            2     { Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; } 
            使用代碼塊(statement block)
            聲明一個編譯時錯誤對象
            (具體原因在于當條件為假則模板對象沒有具體實現,拋出一個未定義完全的對象)
            9 D:\Dev-Cpp\prj\test\main.cpp aggregate `Loki::CompileTimeError<0> ERROR_wo' has incomplete type and cannot be defined 

            對于其宏的實現在我看來
            (void)ERROR_##msg;這句是多余的(不知道這句的作用是什么??誰能告訴我)
            posted @ 2010-04-01 21:44 ccsdu2009 閱讀(2553) | 評論 (13)編輯 收藏
             
                 摘要: 設計引擎的時候一直在考慮什么時候才可以支持多渲染器,比如d3d9比如軟件渲染器為了盡可能的讓opengl的API盡可能的與引擎代碼分離我加上了一個初步封裝了opengl API的類VideoDriver當前只是簡單的封裝了很多opengl的函數代碼如下: Code highlighting produced by Actipro CodeHighlighter (freeware)http://...  閱讀全文
            posted @ 2010-04-01 21:05 ccsdu2009 閱讀(321) | 評論 (3)編輯 收藏
             
            1.ode引擎中的幾何體
            ode物理引擎中的幾何體有球體,盒子,膠囊,射線,平面,圓柱,網格等等
            對于一般的幾何體比如球體,盒子等其默認的位置為原點,也就是其中心點在坐標原點
            那么對于box來說描述一個盒子只需要3個參變量分別為長高寬
            對于Capped Cylinder來說
            其特點就是在圓柱的上下地上各加了一個半圓形的帽子,其新生產的圓柱軸總是z軸
            2.ode geom和body的關系
            geom是簡單的幾何體
            body可以代表物理場景對象
            一般而言一個body總是對應于1個或者多個幾何體
            一個物理對象總是包含1個或者多個幾何體
            當然ode有函數可以檢測給定幾何體和物理對象的管理
            對于body之間也有函數檢測他們是不是相連的
            3. ode關節類型
            ode 具有5種類型的關節分別為
            hinge,ball,slider,unversal(萬向輪)以及hinge2
            hinge是常見的合頁那種關節形式
            ball類型于游戲搖桿
            slider:插銷形式
            hinge2則是帶有軸的關節
            其中大多數關節都具有內置的馬達而球-渦球則不具有
            Mos t joints  have motors  built in.Ball and sockets do not
            3.彈簧-阻尼系統
            2種解決方式
                1.簡單的:使用erp和cfm
                2.復雜點的:使用物理方程式
                
                 1.erp模式:施加力保持關節附著物理不偏離
                 2.cfm模式-constraint force mixing

                 胡克定律:非k*(ra-a);
                帶阻尼的形式: f = k*(ra-a)-d*da
            4.如何保持ode模擬的平穩性
                 1.僵硬的彈簧不可取
                 2.嚴格的束縛條件
                 3....
            5.如果保持ode模擬更快
                 1.使用較少的關節
                 2.使用簡單的替代物替換多重關節
                 3.使用較少的接觸面
                 4.如果可能使用無摩擦或者粘性接觸面替換庫倫摩擦接觸面
            6.ode質量函數類..
            清空質量
            void dMassSetZero (dMass *);
            void dMassSetSphere (dMass *, dReal density, dReal radius);
            void dMassSetSphereTotal (dMass *, dReal total_mass, dReal radius);
            void dMassSetCappedCylinder (dMass *, dReal density, int direction,dReal radius, dReal length);
            void dMassSetCappedCylinderTotal (dMass *, dReal total_mass,int direction, dReal radius, dReal length);
            void dMassSetCylinder (dMass *, dReal density, int direction,dReal radius, dReal length);
            void dMassSetCylinderTotal (dMass *, dReal total_mass, int direction,dReal radius, dReal length);    
            void dMassSetBox (dMass *, dReal density,dReal lx, dReal ly, dReal lz);
            void dMassSetBoxTotal (dMass *, dReal total_mass,dReal lx, dReal ly, dReal lz);         
            void dMassAdjust (dMass *, dReal newmass);
            void dMassTranslate (dMass *, dReal x, dReal y, dReal z);  
            void dMassRotate (dMass *, const dMatrix3 R);
            void dMassAdd (dMass *a, const dMass *b);
               

             
              
            posted @ 2010-03-31 10:45 ccsdu2009 閱讀(2117) | 評論 (0)編輯 收藏
             
            這是新版蓋莫游戲引擎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 @ 2010-03-30 12:07 ccsdu2009 閱讀(1332) | 評論 (3)編輯 收藏
             
            這是使用蓋莫游戲引擎播放視頻的例子

            當前解碼器為ffmpeg.

            以后還會使用dxshow解碼
            播放代碼如下:
             1 #include <stdio.h>
             2 #include <GEngine/Gaimo.hpp>
             3 
             4 using namespace core;
             5 
             6 bool state = 0;
             7 //! 視頻播放完成后的處理工作
             8 inline void IsVideoEnded(){state = 1;} 
             9 
            10 using namespace core; 
            11 int main()
            12 {
            13     RefPtr<Device> device = InitDevice("視頻播放");
            14     //! 獲取視頻播放器指針
            15     RefPtr<VideoPlayer> player = device->GetVideoPlayer();
            16     //! 不處理音頻的話那么視頻將會是無聲的O(∩_∩)O~ 
            17     core::RefPtr<core::AudioDevice> audiodevice = device->GetAudioDevice();
            18     uint16 number = audiodevice->GetAudioDeviceNumber(); 
            19     engine_string audiodeviceinde = audiodevice->GetDeviceByIndex(1);
            20     std::cout<<audiodevice->GetDeviceByIndex(1)<<std::endl; 
            21     std::cout<<audiodevice->GetDefaultDeviceName()<<std::endl; 
            22     std::cout<<"初始化音頻設備"<<audiodevice->Init(audiodeviceinde,4,0)<<std::endl;  
            23     player->isstoped.connect( sigc::ptr_fun(&IsVideoEnded));
            24     player->Play("..\\video//1.Mp4",Rectf(-1,-1,2,2)); 
            25     player->SetVolume(1.0f);    
            26     
            27     BEGIN_LOOP(device)
            28         player->Update();
            29         BREAK_LOOP(state,1);
            30     END_LOOP(device)
            31     return 0;
            32 }
            33 


            可以看出當前代碼使用sigc++作為插槽系統當播放結束的時候程序自動退出(當然可選sigslot)O(∩_∩)O~

            截圖如下:

            posted @ 2010-03-27 08:54 ccsdu2009 閱讀(339) | 評論 (0)編輯 收藏
             
            這幾天一直在做引擎的視頻播放問題
            1.3版本的引擎采用的是vlc視頻處理庫
            使用vlc庫其實還可以 就是外掛的插件太多了對我這樣的懶人來說又不大愿意動手去編譯本來
            引擎的視頻本來是打算采用,ffmpeg
            最后考慮引擎當前是基于opengl的那就采用ffmpeg吧(最少這個也可以跨平臺達到引擎設計的一貫要求)

            視頻播放我感覺還是有點難度的
            這涉及圖形,音頻多線程問題
            所加的線程無非就是音頻線程解碼線程系統處理線程

            需要說明的就是
            手頭有3個ffmpeg版本(比較╮(╯_╰)╭)
            a.包含了老版本的image_convert,avcodec_decode_audio
            b.有 avcodec_decode_audio2,avcodec_decode_audio3,
            c.是最新的sdk;FFmpeg-full-SDK-3.2

            簡單描述下:
            image_convert 大致上相當于:sws_scale
            而avcodec_decode_audio2基本等于avcodec_decode_audio(注意是基本而不是絕對等于)
            不過還有一個比較新的avcodec_decode_audio3

            如果采用的是ffplay那種方式的話不會涉及到多線程渲染
            對于蓋莫引擎來說 當前基于opengl,那么在這里使用opengl多線程是十分必要的
            因為要在主線程渲染,在視頻解碼線程build圖片

            另外對于avpicture_get_size,avpicture_fill這些函數需要選擇合適的PIX_FMT_RGB
            要不然會出現圖形錯亂

            此外視頻和音頻同步也是很重要的,引擎這里采用的是同步到視頻的方法

            至于音頻的處理問題當然是蓋莫音頻引擎了現成的啊.

            最后說下涉及到得ffmpeg版本問題
            關于avcodec_decode_audio2
            如果舊的視頻代碼采用的是avcodec_decode_audio工作正常的話
            如果替換為較新版本的avcodec_decode_audio2話 這里可能會出現內存錯誤的問題
            我的解決方案就是使用最新的ffmpeg解決它



            posted @ 2010-03-25 21:31 ccsdu2009 閱讀(2823) | 評論 (2)編輯 收藏
             
            這是當前蓋莫游戲引擎設計的簡單線程相關模塊,比較簡單
            當然也就通俗易懂了

            最基本的Mutex...

             1 ////////////////////////////////////////////////////////
             2 /// 定義引擎線程互斥
             3 ////////////////////////////////////////////////////////
             4 class Mutex : public Object
             5 {
             6 public:
             7     Mutex(){}
             8     virtual ~Mutex(){}
             9 public:
            10      ////////////////////////////////////////////////////
            11     /// 鎖線程
            12     ////////////////////////////////////////////////////
            13     virtual void Lock() = 0;
            14      ////////////////////////////////////////////////////
            15     /// 解線程
            16     ////////////////////////////////////////////////////    
            17     virtual void UnLock() = 0;     
            18     
            19     DECLARE_OBJECT(Mutex)
            20 };

            方便的線程鎖
             1 ////////////////////////////////////////////////////////
             2 /// 定義引擎線程基本鎖
             3 ////////////////////////////////////////////////////////
             4 template<class Lock = RefPtr<Mutex> >
             5 class MutexLock
             6 {
             7 public:   
             8     MutexLock(Lock ptr):mutex(ptr){mutex->Lock();}
             9     ~MutexLock(){mutex->UnLock();}
            10 private:
            11     Lock mutex;    
            12 };

            簡單的更新和渲染同步類
             1 template<class T,class Mutex,class Condition>
             2 class ThreadSync
             3 {
             4 public:
             5     double time;    //! timestamp
             6     float  difftime;
             7     int    physics_frame;
             8     int    render_frame;
             9     Mutex  lock;
            10     Condition physics_condition;
            11     Condition render_condition;          
            12 };

            至于具體的使用嗎 期待蓋莫2.1.1版本吧O(∩_∩)O~

            posted @ 2010-03-24 16:36 ccsdu2009 閱讀(1500) | 評論 (1)編輯 收藏
             
                 摘要: 對于像游戲引擎的程序設計而言引擎的體系結構的重要性質是不言而喻的其中對象基類的設計也是很重要的主要的功能應該包含以下方面:1.對象類型識別2.對象的繼承關系識別3.獲取對象名字4.獲取對象編號5.附帶有智能指針6.當然必要的序列話作用也是必要的最基本的是對象引用計數類:  1 //////////////////////////////////////////////////...  閱讀全文
            posted @ 2010-03-21 16:46 ccsdu2009 閱讀(1491) | 評論 (7)編輯 收藏
             
            應用程序正常初始化(0xc0000005)失敗.請單擊確定,終止應用程序是一個很常見的錯誤
            常見的原因有指針初始化錯誤
            不過因為是正常初始化失敗所有錯誤原因可能源于全局的靜態變量
            對于具體的程序設計其原因還可能與涉及的其他動態庫有關系O(∩_∩)O~
            posted @ 2010-03-19 20:26 ccsdu2009 閱讀(2373) | 評論 (0)編輯 收藏
             

            有時候我們需要typedef 一種模板
            但是c++并沒有直接的解決方案
            也就是這樣是不可行的.
            typedef std::vector<T> myvector<T>;

            間接的解決方式是:
            (該代碼源于蓋莫游戲引擎代碼)

             1     #include <loki/flex/flex_string.h>
             2     typedef flex_string<char> engine_string;
             3     #include <loki/yasli/yasli_vector.h>     
             4     template<class T>      
             5     struct vector_typedef
             6     {
             7         typedef yasli::vector<T,std::allocator<T> > type;
             8     };   
             9     template<class T>      
            10     struct list_typedef
            11     {
            12         typedef yasli::vector<T,std::allocator<T> >           type;       
            13     };  

            使用的時候是這樣的
                 list_typedef<int>::type  v;
                 list_typedef<Vector3f>::typedef veclist;
                 ...
            posted @ 2010-03-19 12:55 ccsdu2009 閱讀(5554) | 評論 (4)編輯 收藏
            僅列出標題
            共38頁: First 30 31 32 33 34 35 36 37 38 
             
            亚洲愉拍99热成人精品热久久| 无码AV波多野结衣久久| 久久精品麻豆日日躁夜夜躁| 中文字幕亚洲综合久久菠萝蜜 | 狠狠人妻久久久久久综合蜜桃| 久久久久亚洲精品日久生情| 久久久久久国产精品免费免费| 久久久久久免费一区二区三区 | 亚洲综合熟女久久久30p| 日本精品一区二区久久久| 国产精品久久久99| 久久精品国产半推半就| 久久精品国产网红主播| 久久综合狠狠综合久久| 亚洲精品无码久久久久久| 久久婷婷五月综合国产尤物app | 99久久免费国产精品特黄| 欧美久久久久久| 成人久久免费网站| 亚洲国产精品18久久久久久| 久久久久久久波多野结衣高潮| 97精品国产97久久久久久免费| 一本色道久久99一综合| 久久综合给合久久狠狠狠97色69 | 久久国产精品无码一区二区三区| 国产aⅴ激情无码久久| 精品熟女少妇a∨免费久久| 91精品国产9l久久久久| 久久精品国产只有精品2020| 99久久亚洲综合精品网站| 久久精品国产亚洲精品| 久久综合色之久久综合| 97久久国产综合精品女不卡| 少妇久久久久久被弄高潮| 996久久国产精品线观看| 97超级碰碰碰碰久久久久| 久久天天躁狠狠躁夜夜2020老熟妇| 久久精品中文字幕大胸| 久久久噜噜噜www成人网| 精品国产91久久久久久久a | 7777精品伊人久久久大香线蕉|