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

天行健 君子當自強而不息

創建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一区二区怡红| 久久黄色网页| 欧美大片网址| 亚洲小说春色综合另类电影| 欧美一区1区三区3区公司| 久久久蜜臀国产一区二区| 欧美福利视频在线观看| 国产精品美女久久久久av超清| 国产精品人人爽人人做我的可爱| 国产日韩综合| 日韩图片一区| 久久黄色网页| 亚洲激情中文1区| 亚洲一区日韩| 欧美成人一区在线| 国产日韩精品在线播放| 亚洲欧洲日产国产网站| 性欧美xxxx大乳国产app| 免费日韩成人| 亚洲综合大片69999| 蜜臀av国产精品久久久久| 国产精品网站在线| 日韩亚洲在线观看| 久久人人精品| 亚洲综合第一页| 欧美黑人一区二区三区| 国产日韩欧美在线观看| 亚洲精品免费看| 欧美在线视频在线播放完整版免费观看| 欧美成人在线免费观看| 亚洲欧美国产精品va在线观看| 免费在线观看精品| 国产字幕视频一区二区| 性视频1819p久久| 9l视频自拍蝌蚪9l视频成人 | 亚洲综合激情| 欧美精选在线| 亚洲狠狠婷婷| 欧美99久久| 久久精品电影| 国产日韩一区二区三区在线播放| 亚洲精品欧美在线| 欧美 日韩 国产精品免费观看| 午夜国产精品影院在线观看| 欧美日韩在线另类| 欧美aⅴ一区二区三区视频| 一二三区精品| 欧美日韩精品免费观看视频完整| 91久久精品一区二区三区| 久久亚洲精品欧美| 欧美在线免费观看亚洲| 国产视频亚洲精品| 久久国产精品亚洲va麻豆| 亚洲视频在线看| 国产精品一区二区男女羞羞无遮挡| 一区二区免费在线播放| 亚洲美女精品一区| 欧美日韩亚洲在线| 亚洲午夜精品久久久久久浪潮| 91久久国产综合久久| 欧美女主播在线| 亚洲图片欧洲图片日韩av| 99精品福利视频| 国产精品美女久久| 午夜欧美视频| 久久国产精品久久久久久电车| 国产综合在线看| 欧美黄色小视频| 欧美日韩成人在线视频| 亚洲一级在线| 小辣椒精品导航| 在线精品观看| 亚洲精品一区二区三区蜜桃久| 欧美日韩国产成人在线免费 | 国产精品久久一卡二卡| 欧美综合第一页| 久久人91精品久久久久久不卡| 亚洲国产欧美一区二区三区久久 | 欧美精品亚洲一区二区在线播放| 亚洲毛片在线| 午夜日韩视频| 亚洲精品你懂的| 一区二区毛片| 激情一区二区三区| 亚洲理伦在线| 国产资源精品在线观看| 91久久国产精品91久久性色| 国产精品一区2区| 亚洲福利国产| 国产伦一区二区三区色一情| 欧美高清在线精品一区| 国产精品日韩在线| 欧美激情综合色| 国产麻豆午夜三级精品| 亚洲二区免费| 韩国免费一区| 国产精品99久久久久久白浆小说 | 午夜精品久久久久久久99樱桃| 欧美在线精品一区| 久久综合综合久久综合| 国产精品香蕉在线观看| 欧美高清你懂得| 国产精品日韩电影| 亚洲欧洲日产国码二区| 韩国欧美一区| 亚洲永久字幕| 亚洲在线免费| 欧美日韩裸体免费视频| 欧美成人国产| 激情综合亚洲| 午夜精品久久一牛影视| 亚洲一区二区三区四区五区黄| 免费成人黄色| 免费久久精品视频| 精品88久久久久88久久久| 午夜日韩视频| 久久精品水蜜桃av综合天堂| 国产精品卡一卡二卡三| 99精品久久免费看蜜臀剧情介绍| 亚洲国产欧美在线人成| 久久久久久免费| 麻豆精品一区二区av白丝在线| 国产日韩欧美精品一区| 午夜精品99久久免费| 欧美在线观看一二区| 国产毛片精品国产一区二区三区| 一本综合久久| 亚洲欧美日韩一区| 国产精品天美传媒入口| 亚洲视频在线观看三级| 亚洲综合第一| 国产精品卡一卡二| 亚洲欧美在线网| 久久久久久久一区二区| 韩日精品视频一区| 久久午夜视频| 亚洲第一网站| 一区二区毛片| 国产精品一级二级三级| 欧美在线观看视频| 美女在线一区二区| 亚洲片国产一区一级在线观看| 女人香蕉久久**毛片精品| 亚洲国产天堂久久综合| 99视频超级精品| 国产精品久久久久99| 欧美一区二区三区在线| 欧美电影在线| 亚洲一区二区三区免费观看| 国产欧美日韩综合一区在线观看 | 一区二区av在线| 国产精品久久二区| 久久gogo国模裸体人体| 欧美大秀在线观看| 亚洲午夜伦理| 狠狠综合久久av一区二区小说| 狼狼综合久久久久综合网| 亚洲欧洲日本专区| 欧美一级大片在线免费观看| 娇妻被交换粗又大又硬视频欧美| 免费日韩成人| 亚洲免费一区二区| 欧美成人精品在线| 欧美激情久久久久| 欧美mv日韩mv国产网站| 制服丝袜亚洲播放| 精久久久久久久久久久| 欧美日韩情趣电影| 久久精品视频亚洲| 9色porny自拍视频一区二区| 久久久久久色| 中文欧美在线视频| 亚洲二区在线视频| 国产精品高潮久久| 欧美成人四级电影| 欧美在线网站| 亚洲图片欧洲图片日韩av| 免费成人毛片| 欧美在线综合视频| 亚洲特色特黄| 亚洲人www| 黄网站免费久久| 国产精品日本精品| 欧美日韩国产a| 美女国内精品自产拍在线播放| 亚洲一区视频在线| 亚洲美女一区| 亚洲激情午夜| 欧美国产第二页| 久久久久久久久伊人| 午夜精品999| 一区二区三区四区精品| 亚洲精品小视频| 亚洲国产91精品在线观看| 国产在线观看91精品一区|