青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 5, 文章 - 0, 評論 - 24, 引用 - 0
數(shù)據(jù)加載中……

2008年10月19日

linux使用Ogre+SDL進行游戲開發(fā)

我選擇的是ubuntu8.04 + codeblocks8.02的開發(fā)環(huán)境。
Ogre用的是1.4.5的版本。
下面是用SDL進行的一個簡單的代碼.
#include <Ogre.h>
#include 
<iostream>
#include 
<SDL/SDL.h>
#include 
<SDL/SDL_syswm.h>
#include 
<SDL/SDL_events.h>

using namespace std;
using namespace Ogre;
class AppListener : public FrameListener
{
public:
    AppListener( RenderWindow 
*_win ) : win( _win )
    {
    }
public:
    
bool frameStarted(const FrameEvent& evt)
    {
        
if ( !FrameListener::frameStarted( evt ) )
            
return false;

            SDL_PollEvent( 
&event );
        
return true;
    }
    
bool frameEnded(const FrameEvent& evt)
    {
        
if ( !FrameListener::frameEnded( evt ) )
            
return false;

        SDL_PollEvent( 
&event );
        
if ( event.type == SDL_KEYDOWN )
        {
            
if ( event.key.keysym.sym == SDLK_ESCAPE )
                
return false;
        }
        
return true;
    }
private:
    RenderWindow 
*win;
    SDL_Event 
event;
};
void parseWindowGeometry( Ogre::ConfigOptionMap& config, unsigned int& width, unsigned int& height, bool& fullscreen );
int main()
{
    Root 
*root = new Root( "plugins.cfg" );
    RenderWindow 
*win;

    
if ( !root->showConfigDialog() )
        
return 0;
    
if ( SDL_WasInit( SDL_INIT_VIDEO ) == 0 )
    {
        unsigned 
int height = 300, width = 400;
        
bool fullscreen;
        parseWindowGeometry( root
->getRenderSystem()->getConfigOptions(), width, height, fullscreen );

        root
->initialise( false );

        SDL_Init( SDL_INIT_VIDEO );
        SDL_SetVideoMode( width, height 
/ 200 );
        SDL_WM_SetCaption( 
"OgreTest""ogretest" );

        SDL_SysWMinfo info;
        SDL_VERSION(
&info.version);

        SDL_GetWMInfo(
&info);

        std::
string dsp(&(DisplayString(info.info.x11.display)[1]));
        std::vector
<Ogre::String> tokens = Ogre::StringUtil::split(dsp, ".");

        Ogre::NameValuePairList misc;
        std::
string s = Ogre::StringConverter::toString((long)info.info.x11.display);
        s 
+= ":" + tokens[1+":";
        s 
+= Ogre::StringConverter::toString((long)info.info.x11.window);
        misc[
"parentWindowHandle"= s;
        win 
= root->createRenderWindow("ogre", width, height, fullscreen, &misc);

        
///we need to set the window to be active by ourselves, since GLX by default sets it to false, but then activates it upon recieving some X event (which it will never recieve since we'll use SDL).
        
///see OgreGLXWindow.cpp
        win->setActive(true);
        win
->setAutoUpdated(true);
    }
    
else
    {
        win 
= root->initialise( true );
    }

    root
->addFrameListener( new AppListener( win ) );
    root
->startRendering();
    
return 0;
}

void parseWindowGeometry( Ogre::ConfigOptionMap& config, unsigned int& width, unsigned int& height, bool& fullscreen )
{
    Ogre::ConfigOptionMap::iterator opt 
= config.find( "Video Mode" );
    
if ( opt != config.end() )
    {
        Ogre::String val 
= opt->second.currentValue;
        Ogre::String::size_type pos 
= val.find( 'x' );
        
if ( pos != Ogre::String::npos )
        {
            width 
= Ogre::StringConverter::parseUnsignedInt( val.substr( 0, pos ) );
            height 
= Ogre::StringConverter::parseUnsignedInt( val.substr( pos + 1 ) );
        }

        opt 
= config.find( "Full Screen" );
        
if ( opt != config.end() )
        {
            fullscreen 
= ( opt->second.currentValue == "Yes" );
        }
    }
}
原理很簡單。
圖:


posted @ 2008-10-19 17:11 brilyf 閱讀(2996) | 評論 (8)編輯 收藏

2008年9月29日

OpenGL中用FreeImage

     摘要: FreeImage is an Open Source library project for developers who would like to support popular graphics image formats like PNG, BMP, JPEG, TIFF and others as needed by today's multimedia applications. F...  閱讀全文

posted @ 2008-09-29 13:14 brilyf 閱讀(4416) | 評論 (5)編輯 收藏

2008年9月28日

感謝您,出租車司機[皖A(yù)82038]

    午夜時分,分外寂靜,喧囂爭客源的場面在這時已叫停,真的很難打到車,更何況我這個帶血的傷員?
    我使勁地揮手給他們,他們走近看到我流血的手,連招呼都不招呼,利馬走人,而你不一樣,你不相信迷信。
    你沒有告訴我你的名字,甚至連姓都沒有,因為血正流,你顧不及多說一句話。
    將我?guī)У搅俗罱尼t(yī)院掛了急診,當(dāng)我要付錢的時候,你卻推辭了。然后連招呼沒打就走了,這一切好像都是真的。我真的很難相信這個金錢的社會還會有這樣的一位好人。我真的不知道怎么感謝,畢竟我窮學(xué)生一個。你挽救的不只是我的一只手,更多的是我的夢想,作為一個程序員要用我的手來創(chuàng)造未來。我現(xiàn)在不能給你物質(zhì)方面的感謝,也不能為你做些什么。但是我真的發(fā)自內(nèi)心希望你好人一生平安,全家幸福。我一直想辦法去感謝您,今天我就通過blog吧。為你祈福!!!

posted @ 2008-09-28 08:52 brilyf 閱讀(1460) | 評論 (8)編輯 收藏

2008年9月27日

OpenGL背景回顧篇以及實現(xiàn)一個軌跡球[arcball]

OpenGL發(fā)展的歷史:
    OpenGL的前身是SGI公司所開發(fā)的IRIS GL圖形函數(shù)庫,OpenGL不是一種編程語言,而是一個更像C運行時函數(shù)庫。OpenGL是一個開放的工業(yè)標(biāo)準(zhǔn),雖然它是由SGI首創(chuàng),但它的標(biāo)準(zhǔn)不是控制在SGI手中,而是由OpenGL體系結(jié)構(gòu)審核委員會(ARB)掌管。ARB是由SGC、DEC、IBM、Intel和Microsoft等著名公司于1992年創(chuàng)立,后來陸續(xù)加了nVidia、ATI等圖形芯片領(lǐng)域的巨擎。ARB每4年開一次會,對OpenGL規(guī)范進行維護和改善,并出臺計劃對OpenGL標(biāo)準(zhǔn)進行升級,使OpenGL一直與時代保持同步。
    2006年,SGI公司把OpenGL標(biāo)準(zhǔn)的控制從ARB移交給Khronos小組(www.khronos.org)。Khronos是一個由成員提供資金的行業(yè)協(xié)會,專注于開放媒體標(biāo)準(zhǔn)的創(chuàng)建和維護。目前Khronos負責(zé)OpenGL的發(fā)展和升級。
如圖:

與OpenGL相關(guān)的函數(shù)庫:
    OpenGL工具函數(shù)庫(GLU)包含了一些函數(shù),它們利用低層的OpenGL函數(shù)來執(zhí)行一些特定的任務(wù)。設(shè)定特定的矩陣(gluLookAt等),OpenGL中的GLU必須以glu開頭。
對于窗口系統(tǒng)的功能也進行了擴展,如果在linux下使用x窗口的話,使用GLX函數(shù)庫,而必須以glX開頭。對于微軟來說,以wgl開頭。IBM的os/2而言,PGL是顯示管理器與OpenGL之間的接口,以pgl開頭。對于Apple,AGL是支持OpenGL的系統(tǒng)接口,所有的AGL函數(shù)都以agl開頭。
    OpenGL實用工具庫( GLUT,OpenGL Utility Toolkit )是Mark Kilgrad所編寫的一個獨立于窗口系統(tǒng)的工具包,它的目的是隱藏不同窗口系統(tǒng)所帶來的復(fù)雜性。GLUT是下一節(jié)的主題,GLUT函數(shù)以glut開頭。
在OpenGL中,我們常用到軌跡球,下面就對軌跡球來做點東西:
當(dāng)我們觀察三維空間的物體有很多種方法讓一個用戶來選擇一個視點,但是我認為軌跡球是最好的。
軌跡球的基本原理是:
創(chuàng)建一個圍繞著物體的球,然后用戶單擊球上面的一個點,再拖動這個點到一個位置(在屏幕上),讓對象跟著這個向量旋轉(zhuǎn)。
尋找鼠標(biāo)位置:
第一步就是尋找到鼠標(biāo)的位置,我們可以通過獲得視見變換矩陣。
可以通過下面的形式來獲得狀態(tài)矩陣:

GLdouble projection_matrix[16= 1000010000100001 };
GLdouble modelview_matrix[
16= 1000010000100001 };
int viewport_matrix[4= 00640480 };

glGetDoublev( GL_PROJECTION_MATRIX, projection_matrix );
glGetDoublev( GL_MODELVIEW, modelview_matrix );
glGetIntegerv( GL_VIEWPORT, viewport_matrix );

我們獲取這些矩陣后面使用,我們可以使用他們來處理鼠標(biāo)輸入,鼠標(biāo)坐標(biāo)mouse_x和mouse_y,可以通過gluUnProject來獲得鼠標(biāo)下面場景中的一個點。

GLdouble x, y, z;
gluUnProject( mouse_x, mouse_y, 
             modelview_matrix, 
             projection_matrix,
             viewport_matrix,
             
&x, &y, &z );

一旦場景中的這個點被找到,問題的關(guān)鍵就是建立一個從攝象機位置到這個點的光線,然后尋找這個光線和這個軌跡球的交點。這個光線是E + t * ( P - E )的點集,這里E是眼睛點位置,P是場景中的那個點,t是一個變量,而軌跡球是S的點集,這里S^2 = r,r是軌跡球的半徑。如果S = E + t * ( P - E ),那么存在一個點既在軌跡球上,又在光線上,這樣,我們可以通過帶入法推出:( E + t * ( P - E ) ) ^ 2 = r。我們知道向量E、P以及標(biāo)量r,所以可以推出來t,這是一個二次方程,如果無解,說明光線和軌跡球無交點。如果有2個解,應(yīng)當(dāng)選擇最靠近眼睛的那個解。

軌跡球的旋轉(zhuǎn)問題:
如果你單擊拖拽軌跡球上的一個點到另一個位置,該如何做呢?
一個簡單的方法,做起點到結(jié)束點的x乘為旋轉(zhuǎn)軸,然后尋找將要旋轉(zhuǎn)的角度,這個可以通過做點乘得到。

計算旋轉(zhuǎn)矩陣:
我們通過四元數(shù)來解決它。四元數(shù)是二維復(fù)數(shù)的擴展,特別適合做旋轉(zhuǎn)。
如果我們有一個單位向量( x, y, z ),我們可以通過乘以旋轉(zhuǎn)角度的正弦的一半獲得四元數(shù)的x, y, z部分的修正值,w是由旋轉(zhuǎn)角的的余弦的一半決定。大家知道所有的這么值可以被組裝進一個旋轉(zhuǎn)矩陣:

* w + x *- y * y - z * z,  2 * x * y + 2 * w * z,          2 * x * z - 2 * w * y,          0 
2 * x * y - 2 * w * z,         w * w - x * x + y * y - z * z,  2 * y * z + 2 * w * x,          0 
2 * x * z + 2 * w * y,         2 * y * z - 2 * w * x,          w * w - x * x - y * y + z * z,  0 
0,                             0,                              0,  w * w + x * x + y * y + z * z



 

posted @ 2008-09-27 13:57 brilyf 閱讀(6391) | 評論 (7)編輯 收藏

2008年9月24日

Ogre在游戲開發(fā)中逐幀更新

最新的Ogre穩(wěn)定版本是1.6.0RC1[shoggoth],在1.6.0版本中OgreFrameListener.h中的類FrameListener多出了一個叫virtual bool frameRenderingQueued( const FrameEvent& evt ) { return true; }的函數(shù)。這個函數(shù)和virtual bool frameStarted( const FrameEvent& evt ) { return true; }有明顯的區(qū)別。
在源代碼中對frameStarted的注釋是:
        /** Called when a frame is about to begin rendering.
  @remarks
   This event happens before any render targets have begun updating.
            @return
                True to go ahead, false to abort rendering and drop
                out of the rendering loop.
        */
大體翻譯是:
當(dāng)一幀將要開始渲染的時候被調(diào)用。
這個事件發(fā)生在所有渲染目標(biāo)已經(jīng)開始更新之前。
而在源代碼中對frameRenderingQueued的注釋是:
  /** Called after all render targets have had their rendering commands
   issued, but before render windows have been asked to flip their
   buffers over.
  @remarks
   The usefulness of this event comes from the fact that rendering
   commands are queued for the GPU to process. These can take a little
   while to finish, and so while that is happening the CPU can be doing
   useful things. Once the request to 'flip buffers' happens, the thread
   requesting it will block until the GPU is ready, which can waste CPU
   cycles. Therefore, it is often a good idea to use this callback to
   perform per-frame processing. Of course because the frame's rendering
   commands have already been issued, any changes you make will only
   take effect from the next frame, but in most cases that's not noticeable.
  @return
   True to continue rendering, false to drop out of the rendering loop.
  */
翻譯為:
在所有渲染目標(biāo)已經(jīng)傳出他們的渲染命令之后,并且在渲染窗口被要求去釋放他們的幀之前。
這個事件的用途其實是為了把GPU處理的渲染命令推入隊列,這些只花費一點功夫去完成,
而就這一段時間cpu可以被用來處理一些有用的事情。一旦釋放幀這個時間發(fā)生,這條線程請求將要被
堵塞直到GPU準(zhǔn)備好了,這可能浪費了cpu的渲染時間,然而,作為回調(diào)函數(shù)去逐幀處理也是一個好注意。
當(dāng)然因為幀的渲染命令已經(jīng)被放出,任何你做的改變只對下一幀有效,但是大多數(shù)情況下這不是很明顯的。

加入了這個函數(shù)也說明了Ogre1.6.0對gpu重視了。
在ogre自帶的例子中,幾乎都是用examplelistener來處理游戲循環(huán)。這明顯不符合比較大點的游戲開發(fā)。而如果
你想要在大型游戲中應(yīng)用這個游戲循環(huán)。我感覺首先應(yīng)該有一個單件的幀監(jiān)聽系統(tǒng)通過游戲主應(yīng)用程序來初始化。然后就是用設(shè)計模式中的Bridge的將聲明和執(zhí)行分開的功能來處理這個方法。
偽代碼:

//一個部件的類
class BrilyfWidgets
{
    
bool frameRenderingQueued( const FrameEvent& evt ); 
    
}
;


//類的前向聲明
class BrilyfApplication;

class BrilyfListenSystem : public Singleton<BrilyfListenSystem>public FrameListener
{
    
bool frameRenderingQueued( const FrameEvent& evt ) 
    
{
        
//一些系統(tǒng)缺省的設(shè)置
        
        
//關(guān)鍵部分
        BrilyfApplication::getSingletonPtr()->frameRenderQueued( const FrameEvent& evt );
        BrilyfApplication::getSingletonPtr()
->frameEnded( const FrameEvent& evt );
    }

    
bool frameEnded( const FrameEvent& evt );    
}
;

//所有的其他一些部件的初始化都要通過BrilyfApplication,它就是游戲的主管道,控制著所有部件的生命周期,提供了
//frameRenderingQueued和frameEnded的接口供其他的部件來填充。
class BrilyfApplication : public Singleton<BrilyfApplication>
{
    
//一些對于單件初始化的處理
    
    
    
//對應(yīng)的事件
    bool frameRenderingQueued( const FrameEvent& evt ) 
    

        
for ( int i = 0; i < 16; i++ )
            BrilyfWidgets.frameRenderingQueued(  );
    }

    
bool frameEnded( const FrameEvent& evt );

    BrilyfWidgets mWidgets[
16];
}
;

posted @ 2008-09-24 22:11 brilyf 閱讀(2230) | 評論 (2)編輯 收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩视频免费在线观看| 亚洲国产婷婷香蕉久久久久久99 | 一区二区三区在线观看欧美| 久久精品国产一区二区电影| 午夜精品网站| 国外视频精品毛片| 蜜桃av噜噜一区| 蜜桃av一区二区| 亚洲免费电影在线| 亚洲视频视频在线| 国产日韩欧美自拍| 欧美国产日韩xxxxx| 欧美激情片在线观看| 亚洲深夜激情| 校园春色国产精品| 亚洲国产天堂久久综合网| 亚洲高清一区二| 国产精品二区影院| 久久婷婷av| 欧美大胆a视频| 午夜在线成人av| 久久婷婷蜜乳一本欲蜜臀| 一二三区精品福利视频| 亚洲一区二区三区激情| 在线免费观看日本欧美| 亚洲精品国产精品国自产在线 | 欧美三区美女| 久久久www| 欧美日本韩国一区二区三区| 欧美中文字幕视频在线观看| 久热re这里精品视频在线6| 日韩午夜在线播放| 欧美一级视频| 中日韩高清电影网| 欧美在线视屏| 亚洲一级片在线观看| 久久精品观看| 香蕉久久a毛片| 欧美寡妇偷汉性猛交| 久久本道综合色狠狠五月| 欧美高清视频www夜色资源网| 亚洲欧美一区二区在线观看| 老鸭窝毛片一区二区三区| 午夜在线一区二区| 欧美日韩国产91| 男人的天堂亚洲| 国产视频一区二区三区在线观看| 亚洲国产视频一区| 在线观看日韩一区| 午夜精品一区二区三区四区| 一区二区三区高清在线| 老牛国产精品一区的观看方式| 欧美一级黄色网| 欧美日韩三级电影在线| 亚洲国产欧美一区| 精品成人在线视频| 欧美一区二区高清| 久久激情视频免费观看| 欧美午夜免费影院| 亚洲乱码国产乱码精品精天堂| 亚洲欧洲另类国产综合| 久久精品在线观看| 久久天天躁狠狠躁夜夜av| 国产美女精品视频| 午夜久久资源| 欧美综合77777色婷婷| 国产精品手机视频| 亚洲一区二区黄色| 欧美在线一二三四区| 国产麻豆精品久久一二三| 亚洲网站视频| 欧美中文日韩| 国产亚洲欧洲| 久久激情久久| 美女福利精品视频| 伊甸园精品99久久久久久| 欧美一区午夜精品| 久久一区中文字幕| 激情自拍一区| 男人插女人欧美| 亚洲国产精品尤物yw在线观看| 亚洲第一在线视频| 欧美国产乱视频| 一本色道久久88综合日韩精品| 一区二区三区欧美在线观看| 欧美三级欧美一级| 亚洲欧美中文在线视频| 久久久精品五月天| 亚洲国产日韩欧美综合久久| 欧美激情精品久久久久久蜜臀 | 午夜精品一区二区三区在线播放| 国产精品xxxav免费视频| 一本色道久久综合亚洲精品高清| 亚洲欧美国产精品va在线观看| 国产精品一区二区久久国产| 久久高清一区| 亚洲欧洲精品一区二区三区波多野1战4| 99riav国产精品| 国产视频不卡| 欧美激情国产日韩| 小处雏高清一区二区三区 | 亚洲啪啪91| 欧美视频在线观看免费网址| 欧美一区二区免费| 亚洲国产日韩欧美在线图片 | 国产女精品视频网站免费 | 亚洲日本在线视频观看| 亚洲线精品一区二区三区八戒| 国产欧美日韩伦理| 欧美精品色网| 欧美中文字幕视频在线观看| 亚洲日本免费| 久久久视频精品| 99热在线精品观看| 国产在线高清精品| 欧美日韩在线直播| 久久嫩草精品久久久精品| 一区二区欧美亚洲| 欧美顶级少妇做爰| 香蕉久久久久久久av网站| 亚洲乱码视频| 国产一区二区精品| 欧美天堂亚洲电影院在线播放| 久久久成人网| 亚洲免费视频观看| 99国内精品久久| 欧美激情黄色片| 久久久久九九九| 亚洲午夜av电影| 亚洲激情欧美| 亚洲第一视频网站| 国产偷国产偷精品高清尤物| 欧美日韩在线精品一区二区三区| 久久爱另类一区二区小说| 中文亚洲欧美| 一区二区三区 在线观看视| 欧美成人一区在线| 蜜桃伊人久久| 久久阴道视频| 久久米奇亚洲| 久久久久久久网站| 欧美一区二区三区在线观看| 亚洲一区二区3| 宅男噜噜噜66国产日韩在线观看| 91久久精品久久国产性色也91| 很黄很黄激情成人| 狠狠色香婷婷久久亚洲精品| 国产农村妇女毛片精品久久莱园子| 欧美午夜不卡影院在线观看完整版免费| 欧美a级在线| 欧美精品一区二区三区高清aⅴ| 免费日韩成人| 欧美国产视频在线| 欧美日韩视频一区二区| 欧美三级日韩三级国产三级| 校园春色国产精品| 亚洲一区国产一区| 亚洲免费在线视频| 欧美在线999| 久久资源在线| 亚洲国产三级| 日韩视频国产视频| 亚洲淫性视频| 久久久www免费人成黑人精品| 久久在线观看视频| 欧美久久在线| 国产精品一区二区你懂得| 国产一区二区三区在线播放免费观看 | 欧美承认网站| 亚洲精品视频免费在线观看| 99国内精品久久| 午夜欧美不卡精品aaaaa| 欧美有码在线观看视频| 巨乳诱惑日韩免费av| 欧美精品在线一区二区| 国产精品久久久久aaaa| 国产午夜精品美女视频明星a级| 国外成人网址| 一区二区欧美在线| 久久精品国产第一区二区三区最新章节| 久久久青草青青国产亚洲免观| 欧美大胆成人| 亚洲图片欧美一区| 快射av在线播放一区| 欧美视频你懂的| 激情一区二区| 亚洲天堂偷拍| 狼人社综合社区| 一本色道久久综合| 久久婷婷国产麻豆91天堂| 欧美日韩喷水| 伊人狠狠色j香婷婷综合| 亚洲视频国产视频| 欧美大片免费久久精品三p | 在线视频精品一区| 久久久久亚洲综合| 国产精品日韩欧美一区| 亚洲精品免费在线| 久久久www成人免费精品| 99日韩精品|