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

天行健 君子當自強而不息

創建3D圖形引擎(1)

 

下載源碼和工程


3D圖形引擎的代碼以創建游戲內核中編寫的代碼為基礎進行開發。


使用單一的網格模型雖然可以同時渲染整個層次,但卻意味著那些沒有被看到的部分在通過渲染管道時會被裁剪掉,也就是說這樣做會浪費時間。不要沮喪,因為使用一個單獨的網格模型進行層次的渲染仍然有一些非常好的方法。比如說,在游戲世界中包括了單獨的地牢,每個地牢包含不同的房間,所有的房間通過走廊連接到一起。其實,每個房間和走廊就是一個單獨的網格模型,所要做的就是在游戲的處理過程中加載以及釋放那些代表地牢房間的網格模型。


我們首先定義一些成員變量來存儲數據。

class APP : public APPLICATION
{
private:
    GRAPHICS        _graphics;
    CAMERA          _camera;

    INPUT           _input;
    INPUT_DEVICE    _keyboard;
    INPUT_DEVICE    _mouse;    
    MESH            _room_meshes[2];
    OBJECT          _room_objects[8];

    
float           _x_pos, _z_pos;
}

初始化窗口:

    APP()
    {
        _width  = 640;
        _height = 480;

        _style = WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU;

        strcpy(_class_name, "mesh level class");
        strcpy(_caption, "mesh level demo");
    }

加載網格模型:

    BOOL init()
    {
        
// initialize graphics and set display mode
        _graphics.init();
        _graphics.set_mode(get_hwnd(), TRUE, TRUE);
        _graphics.set_perspective(D3DX_PI / 4, 1.3333f, 1.0f, 10000.0f);

        
// initialize input and input device
        _input.init(get_hwnd(), get_inst());
        _keyboard.create(&_input, KEYBOARD);
        _mouse.create(&_input, MOUSE, TRUE);

        
// load the room meshes
        _room_meshes[0].load(&_graphics, "..\\Data\\Corridor.x", "..\\Data\\");
        _room_meshes[1].load(&_graphics, "..\\Data\\Room.x", "..\\Data\\");    

        
// setup the room objects
        _room_objects[0].create(&_graphics, &_room_meshes[1]);
        _room_objects[1].create(&_graphics, &_room_meshes[0]);  
        _room_objects[2].create(&_graphics, &_room_meshes[1]);
        _room_objects[3].create(&_graphics, &_room_meshes[0]);
        _room_objects[4].create(&_graphics, &_room_meshes[0]);
        _room_objects[5].create(&_graphics, &_room_meshes[1]);
        _room_objects[6].create(&_graphics, &_room_meshes[0]);
        _room_objects[7].create(&_graphics, &_room_meshes[1]);

        
// place room object in specified position
        _room_objects[0].move(-2000.0f, 0.0f,  2000.0f);
        _room_objects[1].move(    0.0f, 0.0f,  2000.0f);  
        _room_objects[2].move( 2000.0f, 0.0f,  2000.0f);
        _room_objects[3].move(-2000.0f, 0.0f,     0.0f);
        _room_objects[4].move( 2000.0f, 0.0f,     0.0f);
        _room_objects[5].move(-2000.0f, 0.0f, -2000.0f);
        _room_objects[6].move(    0.0f, 0.0f, -2000.0f);
        _room_objects[7].move( 2000.0f, 0.0f, -2000.0f);

        
// rotate room object into proper orientation
        _room_objects[1].rotate(0.0f,  1.57f, 0.0f);
        _room_objects[2].rotate(0.0f,  1.57f, 0.0f);
        _room_objects[5].rotate(0.0f, -1.57f, 0.0f);
        _room_objects[6].rotate(0.0f, -1.57f, 0.0f);
        _room_objects[7].rotate(0.0f,  3.14f, 0.0f);

        
// position view in a room
        _x_pos = -2000.0f;
        _z_pos = -2000.0f;

        
return TRUE;
    }
 

這里加載了兩個網格模型corridor.x 和room.x,一個是走廊,一個是房間。

走廊:

房間:

游戲中的每個走廊和房間都使用了一個OBJECT對象,其與網格模型依次相關聯。

我們接著來看看如何渲染這些網格模型。

    BOOL frame()
    {
        
static DWORD time_now = timeGetTime();

        
// calculate elapsed time (plus speed boost)
        ulong time_elapsed = (timeGetTime() - time_now) * 2;

        time_now = timeGetTime();

        
// read input device data
        _keyboard.read();
        _mouse.read();

        
// process input and update everything, ESC quits program.
        if(_keyboard.get_key_state(KEY_ESC))
            
return FALSE;

        
float x_move = 0.0f;
        
float z_move = 0.0f;

        
// ok, now let me explain next codes.
        //
        // _camera.get_y_rotation():
        //      get camera vector in xoz plane.
        //
        // sin(_camera.get_y_rotation()):
        //      get x-coordinate of camera vector.
        //
        // cos(_camera.get_y_rotation()):
        //      get z-coordinate of camera vector.

        // move viewpoint forward
        if(_keyboard.get_key_state(KEY_UP))
        {
            x_move = (
float) sin(_camera.get_y_rotation()) * time_elapsed;
            z_move = (
float) cos(_camera.get_y_rotation()) * time_elapsed;
        }

        
// move viewpoint backward
        if(_keyboard.get_key_state(KEY_DOWN))
        {
            x_move = -(
float) sin(_camera.get_y_rotation()) * time_elapsed;
            z_move = -(
float) cos(_camera.get_y_rotation()) * time_elapsed;
        }

        
// translate camera left-right movement into up-down movement.
        //
        // _camera.get_y_rotation() - 1.57f:
        //      rotate camera 90 degree anticlockwise.
        //
        // sin(_camera.get_y_rotation() - 1.57f):
        //      get x-coordinate of camera vector after camera rotation.
        //
        // cos(_camera.get_y_rotation() - 1.57f):
        //     get z-coordinate of camera vector after camera rotation. 
        
        // move viewpoint left
        if(_keyboard.get_key_state(KEY_LEFT))
        {
            x_move = (
float) sin(_camera.get_y_rotation() - 1.57f) * time_elapsed;
            z_move = (
float) cos(_camera.get_y_rotation() - 1.57f) * time_elapsed;
        }

        
// _camera.get_y_rotation() + 1.57f:
        //      rotate camera 90 degree clockwise.
        //
        // sin(_camera.get_y_rotation() + 1.57f):
        //      get x-coordinate of camera vector after camera rotation.
        //
        // cos(_camera.get_y_rotation() + 1.57f):
        //      get z-coordinate of camera vector after camera rotation.

        // move viewpoint right
        if(_keyboard.get_key_state(KEY_RIGHT))
        {
            x_move = (
float) sin(_camera.get_y_rotation() + 1.57f) * time_elapsed;
            z_move = (
float) cos(_camera.get_y_rotation() + 1.57f) * time_elapsed;
        }

        
// update view coordinates
        _x_pos += x_move;
        _z_pos += z_move;

        
// position camera and rotate based on mouse position

        _camera.move(_x_pos, 400.0f, _z_pos);

        
// _mouse.get_y_delta():
        //      get mouse's relative x movement coordinate.
        //
        // _mouse.get_x_delta():
        //      get mouse's relative y movement coordinate.

        _camera.rotate_rel(_mouse.get_y_delta() / 200.0f, _mouse.get_x_delta() / 200.0f, 0.0f);

        
// set camera
        _graphics.set_camera(&_camera);

        
// render everything
        _graphics.clear(D3DCOLOR_RGBA(0, 64, 128, 255));

        
// begin render now
        if(_graphics.begin_scene())
        {
            
// render each room
            for(short i = 0; i < 8; i++)
                _room_objects[i].render();

            _graphics.end_scene();
        }

        _graphics.display();

        
return TRUE;
    }

用上下左右鍵控制相機的位置,用鼠標控制相機的朝向。

截圖:


posted on 2007-10-18 19:50 lovedday 閱讀(727) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩成人免费| 欧美大胆人体视频| 欧美大片在线看| 久久精品亚洲乱码伦伦中文 | 亚洲欧美日韩综合| 亚洲国产成人在线播放| 亚洲成人在线视频播放| 亚洲黄色av一区| 在线视频精品| 欧美色图五月天| 国产精品羞羞答答xxdd| 精品91视频| 韩日精品中文字幕| 狠狠色综合色区| 亚洲最新在线| 久久精品国产久精国产思思| 亚洲另类春色国产| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日韩一区在线播放| 在线观看亚洲a| 久久久久久久久久久久久久一区 | 久久久久久九九九九| 99av国产精品欲麻豆| 麻豆成人精品| 欧美一级午夜免费电影| 亚洲小少妇裸体bbw| 欧美aⅴ一区二区三区视频| 美女露胸一区二区三区| 欧美极品影院| 亚洲国内精品| 欧美+亚洲+精品+三区| 久久gogo国模裸体人体| 国产女主播一区二区| 午夜电影亚洲| 日韩视频久久| 国产精品福利影院| 久久国产精品免费一区| 亚洲一区二区三区成人在线视频精品| 欧美日韩一区三区| 亚洲综合色在线| 一本久久综合亚洲鲁鲁| 国产精品亚洲不卡a| 欧美成黄导航| 亚洲三级影院| 香港成人在线视频| 国产精品亚洲一区| 性色av一区二区三区| 亚洲特色特黄| 国产日韩欧美二区| 久久久久久久国产| 久久精品日韩欧美| 影音先锋久久久| 噜噜噜在线观看免费视频日韩| 性亚洲最疯狂xxxx高清| 国产一区二三区| 久久青草久久| 久久久亚洲人| 99精品欧美一区| 午夜伦欧美伦电影理论片| 亚洲国产精品电影| 亚洲午夜视频| 亚洲第一中文字幕| 国产精品99久久久久久久久久久久 | 老司机午夜免费精品视频 | 欧美jizzhd精品欧美喷水 | 亚洲精品日本| 香蕉久久夜色精品国产| 亚洲国产精品v| 亚洲小说区图片区| 红桃视频欧美| 日韩视频久久| 好男人免费精品视频| 亚洲黑丝在线| 久久精品一级爱片| 在线一区二区三区四区| 亚洲韩日在线| 红桃视频亚洲| 一区二区三欧美| 亚洲国产黄色| 校园激情久久| 亚洲图片欧美午夜| 久久久精品一区二区三区| 亚洲精品一级| 久久久精品国产一区二区三区| 亚洲高清毛片| 国产精品99久久久久久白浆小说| 亚洲精选成人| 国产精品成人在线| 国产日韩在线看片| 欧美激情亚洲综合一区| 国产精品嫩草99a| 亚洲成人在线网站| 国内精品模特av私拍在线观看| 亚洲毛片在线看| 亚洲国产美女| 久久精品91| 性色av香蕉一区二区| 久久久噜噜噜久久中文字幕色伊伊| 亚洲一区二区精品| 免费黄网站欧美| 久久久久久久久久看片| 欧美日韩视频在线一区二区观看视频 | 国产主播喷水一区二区| 日韩一区二区免费高清| 亚洲国产另类久久久精品极度| 午夜精品电影| 亚洲欧美日韩成人| 欧美日韩综合网| 亚洲区欧美区| 亚洲精品久久久久久久久久久久久| 欧美一区二区三区电影在线观看| 亚洲日本成人网| 亚洲国产精品欧美一二99| 狠狠色香婷婷久久亚洲精品| 欧美亚洲视频一区二区| 欧美一区国产一区| 欧美黄色影院| 久久精品在线免费观看| 国产日产欧产精品推荐色| 亚洲综合色丁香婷婷六月图片| 最新日韩av| 久久精品理论片| 蜜乳av另类精品一区二区| 国语对白精品一区二区| 久久久国产精品一区| 欧美aⅴ一区二区三区视频| 亚洲第一精品夜夜躁人人爽| 久久伊人精品天天| 亚洲福利免费| 精品成人一区二区| 欧美一级专区免费大片| 久久深夜福利| 最新日韩中文字幕| 欧美伦理影院| 亚洲中字在线| 久久在线观看视频| 亚洲日本欧美| 国产精品青草久久| 亚洲最新视频在线| 9i看片成人免费高清| 国产精品theporn| 亚洲女同性videos| 免费视频最近日韩| 中文国产亚洲喷潮| 国产欧美日韩视频一区二区三区| 久久精品国产久精国产一老狼| 欧美在线视频一区二区三区| 国产欧美丝祙| 媚黑女一区二区| 中文精品视频| 久久综合九色九九| 一区二区日韩伦理片| 亚洲天堂成人在线视频| 亚洲小视频在线观看| 亚洲国产精品va在线看黑人| 欧美亚洲自偷自偷| 亚洲精品欧洲| 欧美激情一二三区| 亚洲第一福利社区| 欧美怡红院视频| 男男成人高潮片免费网站| 欧美日韩国产区| 亚洲综合精品| 欧美日韩国产一中文字不卡| 亚洲电影有码| 欧美一区二区三区在| 在线不卡中文字幕播放| 久久人人爽国产| 亚洲午夜一二三区视频| 欧美激情精品久久久久久变态| 一本久道久久综合狠狠爱| 好看的亚洲午夜视频在线| 欧美日韩国产一区精品一区| 久久精品国产第一区二区三区| 亚洲作爱视频| 亚洲人成亚洲人成在线观看图片| 久久成人免费日本黄色| 永久免费精品影视网站| 欧美午夜电影网| 欧美成人性生活| 一区二区三区日韩在线观看| 欧美激情一区二区三区四区| 久久美女艺术照精彩视频福利播放| 亚洲桃色在线一区| 99成人精品| 亚洲精品乱码久久久久久日本蜜臀 | 欧美电影免费网站| 欧美一区成人| 亚洲午夜激情网页| 日韩一二在线观看| 亚洲国产三级| 在线免费精品视频| 影音先锋另类| 黑人极品videos精品欧美裸| 国产精品久线观看视频| 欧美日韩在线三级| 欧美另类一区| 欧美三级日本三级少妇99| 久久免费精品日本久久中文字幕| 欧美专区中文字幕|