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

天行健 君子當自強而不息

創建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 閱讀(728) 評論(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>
            一区二区三区产品免费精品久久75 | 国产精品日韩在线一区| 亚洲黄色在线视频| 欧美成人激情视频| 欧美在线啊v一区| 国产一区在线免费观看| 久久亚洲欧美国产精品乐播| 久久精品女人的天堂av| 在线国产亚洲欧美| 欧美激情影音先锋| 欧美日韩成人综合天天影院| 亚洲性线免费观看视频成熟| 亚洲欧美日韩第一区| 狠狠干成人综合网| 欧美黄免费看| 欧美午夜精品久久久久久人妖| 国产精品久久久久一区| 亚洲欧美日韩一区在线| 欧美影院在线| 99视频在线精品国自产拍免费观看| 欧美一级淫片aaaaaaa视频| 欧美一区二区三区喷汁尤物| 狠狠色2019综合网| 亚洲国产精品成人一区二区| 国产精品高潮在线| 久久一区二区三区四区五区| 欧美激情乱人伦| 欧美一区二区三区久久精品| 嫩草国产精品入口| 欧美一区二区黄色| 欧美激情成人在线| 久久久综合香蕉尹人综合网| 欧美精品三级在线观看| 久久成人一区二区| 欧美日韩高清免费| 美女91精品| 国产精品视频一| 亚洲国产成人午夜在线一区| 国产丝袜一区二区| 亚洲美女av在线播放| 韩国精品在线观看| 亚洲一区视频在线观看视频| 亚洲精品一区二| 久久久精品一区二区三区| 亚洲深夜影院| 欧美紧缚bdsm在线视频| 鲁大师影院一区二区三区| 欧美视频在线观看 亚洲欧| 欧美成人亚洲| 极品av少妇一区二区| 亚洲免费在线| 亚洲一区二区免费在线| 欧美激情亚洲一区| 欧美激情视频免费观看| 国语自产精品视频在线看抢先版结局 | 久久先锋资源| 国产精品国产三级国产普通话三级| 99视频在线观看一区三区| 欧美亚洲一区二区三区| 亚洲欧美一级二级三级| 欧美日韩免费观看一区| 亚洲福利视频一区| 亚洲国产成人精品女人久久久| 欧美激情第二页| 在线成人www免费观看视频| 久久精品人人爽| 久久综合网络一区二区| 国产喷白浆一区二区三区| 中文在线资源观看网站视频免费不卡 | 国产一区观看| 亚洲欧美日韩人成在线播放| 午夜在线一区| 国产深夜精品| 欧美综合77777色婷婷| 久久久久久久久久久久久久一区 | 欧美a级片网站| 尤物九九久久国产精品的分类| 免费日韩av| 亚洲国产成人久久综合| 欧美国产日本韩| 亚洲狼人精品一区二区三区| 亚洲午夜精品一区二区| 国产精品自拍网站| 久久激情五月婷婷| 欧美福利在线观看| 这里只有精品电影| 国产人成一区二区三区影院| 久久狠狠婷婷| 亚洲日本成人| 午夜在线精品偷拍| 亚洲国产成人精品女人久久久| 在线视频日韩| 久久人人97超碰国产公开结果| 欧美插天视频在线播放| 亚洲伦理一区| 久久久久欧美| 日韩视频在线播放| 国产日韩欧美二区| 久久九九免费视频| 亚洲另类在线视频| 久久精彩免费视频| 亚洲片国产一区一级在线观看| 久久99伊人| 亚洲区一区二区三区| 欧美在线三区| 亚洲日本一区二区| 国产欧美亚洲日本| 欧美高清视频一区二区三区在线观看| 欧美亚洲网站| 99一区二区| 在线精品在线| 国产精品日韩精品| 欧美不卡激情三级在线观看| 亚洲综合激情| 日韩一级黄色大片| 欧美不卡在线视频| 欧美在线亚洲综合一区| 99精品欧美一区| 国产人成一区二区三区影院| 欧美精品成人| 久久人人97超碰人人澡爱香蕉| 美女精品视频一区| 欧美一区二区女人| 这里只有精品电影| 亚洲人成网站精品片在线观看| 久久福利毛片| 一本久道久久综合狠狠爱| 欧美ed2k| 蜜臀91精品一区二区三区| 午夜亚洲伦理| 亚洲一区三区视频在线观看| 99国产精品| 91久久精品国产91性色tv| 国产一区二区三区久久 | 欧美性大战久久久久久久| 六十路精品视频| 久久国产精品黑丝| 亚洲欧美另类国产| 日韩视频在线播放| 亚洲人成高清| 亚洲日本免费| 亚洲日韩欧美视频一区| 亚洲人体偷拍| 亚洲精品久久久久久下一站| 欧美激情区在线播放| 亚洲大片在线观看| 欧美激情一区二区| 亚洲国产岛国毛片在线| 亚洲国产经典视频| 亚洲精品国产品国语在线app| 欧美一区二区免费| 亚洲主播在线| 久久超碰97人人做人人爱| 欧美一区91| 裸体丰满少妇做受久久99精品| 亚洲啪啪91| 一区二区欧美在线观看| 亚洲天堂成人在线视频| 亚洲综合99| 久久久精品五月天| 欧美大片va欧美在线播放| 欧美黄色aa电影| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲午夜国产成人av电影男同| 国产精品日韩在线| 国产一区二区三区在线播放免费观看 | 性做久久久久久| 久久视频精品在线| 欧美精品18| 国产精品久久久久久久午夜片| 久久久一区二区| 欧美国产日韩亚洲一区| 欧美视频观看一区| 国产麻豆日韩欧美久久| 亚洲福利小视频| 亚洲香蕉在线观看| 久久精品国产99国产精品澳门| 99视频精品全部免费在线| 亚洲免费视频成人| 久久综合九色综合欧美狠狠| 亚洲激情成人网| 性xx色xx综合久久久xx| 欧美a级一区| 国产精品视频最多的网站| 一区二区亚洲欧洲国产日韩| 亚洲最新色图| 久久久久久**毛片大全| 亚洲黄色三级| 欧美在线一区二区| 欧美日韩一区自拍| 在线观看视频一区| 亚洲一区区二区| 亚洲高清免费在线| 欧美一区二区三区的| 欧美激情一区二区三区成人 | 亚洲专区欧美专区| 美日韩精品免费| 极品av少妇一区二区| 香蕉久久a毛片| av成人免费在线|