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

隨筆 - 5, 文章 - 0, 評論 - 24, 引用 - 0
數據加載中……

2008年10月19日

linux使用Ogre+SDL進行游戲開發

我選擇的是ubuntu8.04 + codeblocks8.02的開發環境。
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 閱讀(2950) | 評論 (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 閱讀(4392) | 評論 (5)編輯 收藏

2008年9月28日

感謝您,出租車司機[皖A82038]

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

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

2008年9月27日

OpenGL背景回顧篇以及實現一個軌跡球[arcball]

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

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

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 );

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

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

一旦場景中的這個點被找到,問題的關鍵就是建立一個從攝象機位置到這個點的光線,然后尋找這個光線和這個軌跡球的交點。這個光線是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以及標量r,所以可以推出來t,這是一個二次方程,如果無解,說明光線和軌跡球無交點。如果有2個解,應當選擇最靠近眼睛的那個解。

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

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

* 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 閱讀(6366) | 評論 (7)編輯 收藏

2008年9月24日

Ogre在游戲開發中逐幀更新

最新的Ogre穩定版本是1.6.0RC1[shoggoth],在1.6.0版本中OgreFrameListener.h中的類FrameListener多出了一個叫virtual bool frameRenderingQueued( const FrameEvent& evt ) { return true; }的函數。這個函數和virtual bool frameStarted( const FrameEvent& evt ) { return true; }有明顯的區別。
在源代碼中對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.
        */
大體翻譯是:
當一幀將要開始渲染的時候被調用。
這個事件發生在所有渲染目標已經開始更新之前。
而在源代碼中對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.
  */
翻譯為:
在所有渲染目標已經傳出他們的渲染命令之后,并且在渲染窗口被要求去釋放他們的幀之前。
這個事件的用途其實是為了把GPU處理的渲染命令推入隊列,這些只花費一點功夫去完成,
而就這一段時間cpu可以被用來處理一些有用的事情。一旦釋放幀這個時間發生,這條線程請求將要被
堵塞直到GPU準備好了,這可能浪費了cpu的渲染時間,然而,作為回調函數去逐幀處理也是一個好注意。
當然因為幀的渲染命令已經被放出,任何你做的改變只對下一幀有效,但是大多數情況下這不是很明顯的。

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

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


//類的前向聲明
class BrilyfApplication;

class BrilyfListenSystem : public Singleton<BrilyfListenSystem>public FrameListener
{
    
bool frameRenderingQueued( const FrameEvent& evt ) 
    
{
        
//一些系統缺省的設置
        
        
//關鍵部分
        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>
{
    
//一些對于單件初始化的處理
    
    
    
//對應的事件
    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 閱讀(2222) | 評論 (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>
            亚洲午夜精品久久久久久浪潮| 韩曰欧美视频免费观看| 亚洲欧洲在线视频| 亚洲一区二区三区视频| 99re在线精品| 久久精品成人一区二区三区蜜臀| 一区二区三区日韩精品视频| 久热精品视频在线观看一区| 久久综合久久综合九色| 国产欧美视频一区二区三区| 亚洲一区免费| 欧美一区二区成人| 国产农村妇女精品一区二区| 亚洲免费中文字幕| 久久av一区二区三区| 国产精品视频免费在线观看| 亚洲欧美久久久| 久久av在线看| 在线成人免费视频| 日韩午夜激情电影| 这里只有精品在线播放| 欧美日韩成人网| 亚洲美女一区| 午夜精品久久久久久久久| 久久全国免费视频| 欧美成人精品1314www| 亚洲第一精品夜夜躁人人爽| 欧美国产欧美亚州国产日韩mv天天看完整 | 欧美日韩一区二区三区在线视频| 国产日韩欧美精品一区| 亚洲欧美日韩精品久久奇米色影视| 亚洲午夜精品视频| 国产精品美女久久久免费| 日韩一区二区精品| 小嫩嫩精品导航| 国产综合色产| 欧美电影在线观看完整版| 久久中文久久字幕| 最近看过的日韩成人| 欧美精品手机在线| 亚洲一区高清| 久久福利毛片| 亚洲日韩欧美视频| 国产日产亚洲精品| 免费成人黄色片| 在线午夜精品自拍| 欧美大色视频| 欧美自拍偷拍| 一本到高清视频免费精品| 国产区欧美区日韩区| 欧美成人精品福利| 亚洲一二三区在线| 欧美激情导航| 久久久精品tv| 亚洲男同1069视频| 亚洲国产专区校园欧美| 国产欧美日韩视频一区二区| 久久青青草原一区二区| 亚洲午夜国产一区99re久久| 鲁大师成人一区二区三区| 亚洲欧美日韩国产一区二区三区| 亚洲国产欧洲综合997久久| 国产精品久久久一区麻豆最新章节| 在线视频欧美一区| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲午夜久久久久久久久电影网| 国产午夜精品理论片a级探花| 欧美大片91| 久久九九电影| 午夜精品亚洲一区二区三区嫩草| 亚洲在线观看视频网站| 亚洲国产日韩一区| 国产一区视频观看| 国产精品影视天天线| 欧美日韩一区二区三区| 欧美 日韩 国产精品免费观看| 性色av一区二区三区在线观看| 亚洲伦理久久| 99在线|亚洲一区二区| 欧美一级久久久| 亚洲激情成人在线| 久久久久久久成人| 久久精品一区| 欧美一区三区二区在线观看| 亚洲一区二区三区精品视频| 在线午夜精品自拍| 中日韩高清电影网| 一区二区三区产品免费精品久久75| 在线免费观看视频一区| 在线精品亚洲| 亚洲国产99| 亚洲精品一区久久久久久| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲精品资源| 亚洲黄色在线| 欧美电影免费观看高清完整版| 久久久九九九九| 久久综合色播五月| 欧美成人自拍视频| 国产亚洲一区精品| 国产欧美日韩精品在线| 国产视频在线观看一区二区三区| 国产精品入口66mio| 国模精品一区二区三区| 在线观看亚洲专区| 一区二区三区视频在线| 午夜精品www| 久久综合九色综合欧美就去吻| 久久综合网hezyo| 免费在线视频一区| 亚洲免费成人av| 亚洲欧美激情在线视频| 久久久久久久一区| 欧美精品一区二区蜜臀亚洲 | 亚洲乱码国产乱码精品精98午夜 | 久久激情一区| 欧美日韩国产亚洲一区 | 欧美暴力喷水在线| 国产美女一区| 亚洲女优在线| 宅男噜噜噜66一区二区| 亚洲精选国产| 午夜激情综合网| 亚洲精品乱码久久久久久蜜桃91| 欧美在线一二三| 国产精品久久久久久模特| 亚洲国产网站| 欧美不卡激情三级在线观看| 欧美在线视频观看免费网站| 国产精一区二区三区| 亚洲免费影视第一页| 亚洲动漫精品| 欧美成人中文| 日韩视频永久免费观看| 久久成人久久爱| 欧美在线国产| 国产三级欧美三级日产三级99| 亚洲欧美日韩一区二区三区在线观看 | 国产一区二区三区四区在线观看| 亚洲欧美日韩一区二区| 亚洲美女在线一区| 国产精品va在线| 久久精品国产精品亚洲综合| 久久成人资源| 国产啪精品视频| 麻豆国产精品va在线观看不卡| 久久综合九九| 亚洲美女视频在线观看| 一区二区三区免费看| 国产精品美女在线观看| 欧美在线免费观看| 久久女同精品一区二区| 亚洲精品免费一二三区| 9国产精品视频| 亚洲一区二区三区四区在线观看| 国产欧美精品一区| 蜜桃av噜噜一区| 欧美日韩精选| 欧美一级成年大片在线观看| 久久se精品一区精品二区| 亚洲第一精品夜夜躁人人爽| 亚洲人成网站999久久久综合| 欧美日韩精品国产| 一区二区三区 在线观看视| 午夜一区二区三区在线观看| 亚洲高清一区二| 亚洲一区二区在线免费观看| 黄色日韩在线| aⅴ色国产欧美| 国产一区亚洲| 日韩亚洲欧美成人一区| 影院欧美亚洲| 亚洲一区二区三区四区在线观看| 在线精品国精品国产尤物884a| 亚洲午夜精品久久| 亚洲欧洲日夜超级视频| 亚洲欧美三级伦理| 在线视频精品| 卡一卡二国产精品| 亚洲精品一区二区三区婷婷月| 国产精品美女久久久久久2018| 欧美成人免费小视频| 国产日韩欧美一二三区| 亚洲伦理中文字幕| 亚洲欧洲午夜| 久久久久se| 久久国产精品99久久久久久老狼| 欧美日韩久久精品| 亚洲春色另类小说| 国产一区再线| 亚洲性av在线| 亚洲一区二区三区在线播放| 欧美成在线视频| 久久性天堂网| 国产欧美一区二区三区沐欲| 一本综合精品| 正在播放日韩| 欧美日韩国产页| 亚洲人在线视频| 亚洲精品国产精品国产自|