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

天行健 君子當(dāng)自強(qiáng)而不息

設(shè)計(jì)一個靈活的Camera類(1)

新建網(wǎng)頁 1

我們使用D3DXMatrixLookAtLH函數(shù)來計(jì)算視圖空間變換矩陣。這個函數(shù)對于在固定位置布置和對準(zhǔn)攝像機(jī)是非常好用的,不過它的用戶接口對于要響應(yīng)用戶輸入來實(shí)現(xiàn)攝像機(jī)移動就不那么好用了。這就激發(fā)我們用我們自己的方法來解決,這里我們展示了怎樣實(shí)現(xiàn)一個Camera類,它使我們能夠比D3DXMatrixLookAtLH函數(shù)更好地操作攝像機(jī),并且可以用來作為飛行模擬攝像機(jī)和第一人稱視角攝像機(jī)。


12.1攝像機(jī)設(shè)計(jì)

我們定義一個相對于世界坐標(biāo)系的位置和攝像機(jī)的方向,這里使用四個攝像機(jī)向量:right vector ,  up vector,look vector 以及 position vector,如圖12.1所示。這些向量用來為攝像機(jī)定義一個坐標(biāo)系來描述在世界坐標(biāo)中的對應(yīng)關(guān)系。因?yàn)?span lang="EN-US"> right ,up look 向量定義了攝像機(jī)在世界中的方向,我們有時把它們?nèi)齻€向量一起稱為方向向量(orientation vectors)。方向向量必須被標(biāo)準(zhǔn)化。假如彼此互相垂直且都是單位長度,那么我們就稱它們是正交標(biāo)準(zhǔn)化向量。我們做這些限制是因?yàn)榈纫粫何覀円獙⒎较蛳蛄坎迦氲揭粋€行矩陣中。因?yàn)樾邢蛄渴钦粯?biāo)準(zhǔn)化的,所以該矩陣也就是正交矩陣?;貞浺幌?,正交矩陣有一個特性就是它的逆矩陣等于它的轉(zhuǎn)置矩陣。

有了這四個向量來描述攝像機(jī),我們的攝像機(jī)就能夠按照下面六種方式變化了:

圍繞right向量旋轉(zhuǎn)(pitch傾斜)

圍繞up向量旋轉(zhuǎn)(yaw偏航)

圍繞look向量旋轉(zhuǎn)(roll滾轉(zhuǎn))

沿著right向量平移(strafe

沿著up向量飛行(fly

沿著look向量移動(move

通過這六種操作,我們能夠沿著三個軸移動以及饒著三個軸旋轉(zhuǎn),這給了我們一個六度的自由。下面的Camera類定義了我們要的描述數(shù)據(jù)以及想要的方法:

   enum eCameraType { LAND_OBJECT, AIR_CRAFT };
   
   
class cCamera
    {
   
private:
        eCameraType        m_camera_type;
        D3DXVECTOR3        m_right;
        D3DXVECTOR3        m_up;
        D3DXVECTOR3        m_look;    
   
   
public:
        D3DXVECTOR3        m_pos;
   
   
public:
        cCamera();
        cCamera(eCameraType camera_type);
        ~cCamera() { };
   
        
void strafe(float units);    // left/right
   
    void fly(float units);        // up/down
   
    void walk(float units);        // forward/backward
   

        
void pitch(float angle);    // rotate on right vector
   
    void yaw(float angle);        // rotate on up vector
   
    void roll(float angle);        // rotate on look vector
   

        
void get_view_matrix(D3DXMATRIX* v);
        
void set_camera_type(eCameraType camera_type);
        
        
void get_right(D3DXVECTOR3* right);
        
void get_up(D3DXVECTOR3* up);
        
void get_look(D3DXVECTOR3* look);
    };

在類中我們定義了一個還沒有討論的eCameraType枚舉類型。目前,我們的攝像機(jī)支持兩種攝像機(jī)模式,LANDO_BJECT模式和AIR_CRAFT模式。AIR_CRAFT模式允許我們在空間中完全自由的移動。不過,在有些游戲中,比如第一人稱設(shè)計(jì)游戲,人是不能飛的;因此我們必須限制它在某些軸上的運(yùn)動。指定為LAND_OBJECT模式的攝像機(jī)就限制了這些。

12.2 實(shí)現(xiàn)細(xì)節(jié)

12.2.1計(jì)算視圖矩陣

我們現(xiàn)在演示怎樣根據(jù)攝像機(jī)向量來計(jì)算視圖矩陣變換的。讓 p = (px,py,pz),r = (rx,ry,rz),u = (ux,uy,uz)以及 d = (dx,dy,dz)分別表示 position, right, up 以及 look 向量。

視圖空間變換是指在世界坐標(biāo)系中進(jìn)行幾何變換以便將照相機(jī)平移變換到坐標(biāo)系的原點(diǎn)并把它的方向旋轉(zhuǎn)至朝向Z軸的正方向(如圖12.2)。

因此,我們希望有一個象這樣的變換矩陣V

 pV = (0, 0, 0)—矩陣V能將攝像機(jī)移動到原點(diǎn)。

 rV = (1, 0, 0)—矩陣V能將攝像機(jī)的right向量與世界坐標(biāo)系中的x軸對齊。

 uV = (0, 1, 0)—矩陣V能將攝像機(jī)的up向量與世界坐標(biāo)系中的y軸對齊。

dV = (0, 0, 1)—矩陣V能將攝像機(jī)的look向量與世界坐標(biāo)系中的z軸對齊。

我們能將變換任務(wù)分為兩個部分:1)平移部分,將攝像機(jī)的位置移動到原點(diǎn);2)旋轉(zhuǎn)部分,將攝像機(jī)的方向向量與世界坐標(biāo)系的軸對齊。

12.2.1.1 第一部分:平移

平移只需要利用 p就可簡單地將 p 移動到原點(diǎn),因?yàn)?pp=0。因此我們能夠用下面的矩陣來描述視圖變換中的平移部分:

12.2.1.2 第二部分:旋轉(zhuǎn)

矯正攝像機(jī)的三個方向向量使其與世界坐標(biāo)系的軸對齊需要更多的工作。我們需要一個3*3的旋轉(zhuǎn)矩陣A,它能將right,uplook分別與x-y-以及z軸對齊。這個矩陣將滿足如下三個等式:

注意:我們在這里使用3*3矩陣來工作是因?yàn)楝F(xiàn)在不需要額外的信息來表現(xiàn)旋轉(zhuǎn)。等一下我們將它增加到常用的4*4矩陣。

因?yàn)檫@三個等式都有一個相同系數(shù)矩陣A ,所以我們能夠把它們合在一起。我們把它們從新寫到一起來:

A有很多方法,但是我們知道AB逆矩陣因?yàn)?strong>BA = BB-1 = I。因?yàn)?span lang="EN-US">B 是一個正交矩陣(它的行向量是正交標(biāo)準(zhǔn)化的),我們知道它的逆矩陣就是它的轉(zhuǎn)置矩陣。因此,將方向向量和世界坐標(biāo)系中的坐標(biāo)軸對齊的變換如下:

12.2.1.3 將兩部分合并

最后,將A增加為4*4矩陣,同時將平移部分合并到旋轉(zhuǎn)部分形成的視圖變換矩陣V

我們在cCamera::get_view_matrix方法中建立這個矩陣:

    void cCamera::get_view_matrix(D3DXMATRIX* v)
    {
        
// keep camera's axis orthogonal to each other
   
        D3DXVec3Normalize(&m_look, &m_look);
   
        D3DXVec3Cross(&m_up, &m_look, &m_right);
        D3DXVec3Normalize(&m_up, &m_up);
   
        D3DXVec3Cross(&m_right, &m_up, &m_look);
        D3DXVec3Normalize(&m_right, &m_right);
   
        
// build the view matrix
   
    float x = -D3DXVec3Dot(&m_right, &m_pos);
        
float y = -D3DXVec3Dot(&m_up,    &m_pos);
        
float z = -D3DXVec3Dot(&m_look,  &m_pos);
   
        (*v)(0, 0) = m_right.x;        (*v)(0, 1) = m_up.x;    (*v)(0, 2) = m_look.x;        (*v)(0, 3) = 0.0f;
        (*v)(1, 0) = m_right.y;        (*v)(1, 1) = m_up.y;    (*v)(1, 2) = m_look.y;        (*v)(1, 3) = 0.0f;
        (*v)(2, 0) = m_right.z;        (*v)(2, 1) = m_up.z;    (*v)(2, 2) = m_look.z;        (*v)(2, 3) = 0.0f;
        (*v)(3, 0) = x;                (*v)(3, 1) = y;            (*v)(3, 2) = z;                (*v)(3, 3) = 1.0f;
    }

你可能想知道方法中前面幾行代碼是干什么的。在幾次旋轉(zhuǎn)后,攝像機(jī)的方向向量可能變的不相互垂直了。因此,每當(dāng)該函數(shù)被調(diào)用時,我們根據(jù)look向量重新計(jì)算upright向量,使它們保持相互垂直。新的up向量是這樣計(jì)算的up = look × right。 接著新的right向量是這樣計(jì)算的right = up × look

posted on 2008-03-30 14:52 lovedday 閱讀(2212) 評論(1)  編輯 收藏 引用

評論

# re: 設(shè)計(jì)一個靈活的Camera類(1) 2011-10-12 16:10 Daywei

前輩 請教 一下如何實(shí)現(xiàn) 相機(jī)的縮放  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 国产日产欧美精品| 麻豆av福利av久久av| 国产精品www.| 欧美激情免费在线| 国产在线高清精品| 亚洲一区在线看| 亚洲午夜精品一区二区| 欧美成人日韩| 欧美国产1区2区| 亚洲成人中文| 久久精品青青大伊人av| 久久精品国产清高在天天线| 欧美色图一区二区三区| 亚洲精品视频在线| 99伊人成综合| 欧美日韩国产不卡在线看| 最近中文字幕mv在线一区二区三区四区| 国产一区二区三区四区hd| 午夜精品久久久久影视 | 国产精品99久久久久久久久| 欧美成人a视频| 亚洲电影免费观看高清完整版在线观看 | 看片网站欧美日韩| 裸体歌舞表演一区二区| 狠狠久久综合婷婷不卡| 欧美在线免费一级片| 久久久天天操| 在线观看亚洲a| 免费观看国产成人| 亚洲国产小视频在线观看| 亚洲美女免费视频| 欧美日韩亚洲一区三区| 亚洲视频网站在线观看| 欧美一区二区视频免费观看| 国产无一区二区| 久久久久免费视频| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲欧洲日产国产综合网| 欧美精品www在线观看| 一区二区三区欧美在线| 欧美在线免费| 在线免费观看成人网| 欧美国产专区| 亚洲图片在线观看| 久久婷婷亚洲| 亚洲另类自拍| 国产精品久久久久久久久久直播| 羞羞色国产精品| 欧美风情在线观看| 亚洲欧美乱综合| 又紧又大又爽精品一区二区| 欧美激情视频一区二区三区免费| 亚洲午夜激情网页| 欧美1区2区视频| 亚洲午夜黄色| 在线看无码的免费网站| 欧美色欧美亚洲高清在线视频| 亚洲免费在线播放| 欧美激情视频一区二区三区不卡| 一区二区三区日韩| 国产一区二区三区网站| 欧美激情在线有限公司| 亚洲欧美日本另类| 亚洲欧洲日产国产网站| 久久久久成人网| 在线亚洲欧美视频| 在线日韩成人| 国产精品一二三视频| 模特精品裸拍一区| 亚洲欧美视频一区| 亚洲国产精品久久久久婷婷老年| 香蕉成人久久| 亚洲免费高清视频| 黄色成人在线网站| 国产精品久久久久久影视| 欧美成人小视频| 欧美在线一区二区三区| 亚洲小视频在线观看| 91久久久一线二线三线品牌| 久久久欧美一区二区| 亚洲影视在线播放| 亚洲毛片av在线| 亚洲高清三级视频| 国产一区二区高清不卡| 国产精品久久久一区二区| 欧美激情视频在线播放| 久久久久青草大香线综合精品| 亚洲天天影视| 9久re热视频在线精品| 亚洲第一中文字幕| 免费欧美日韩| 久久久夜精品| 久久九九精品| 久久精品国内一区二区三区| 亚洲欧美日韩中文播放| 亚洲一区二区免费| 在线一区二区日韩| 一区二区高清| 一区二区三区日韩在线观看| 日韩视频一区二区三区在线播放| 在线精品亚洲| 亚洲国产aⅴ天堂久久| 在线欧美日韩| 亚洲国产成人精品女人久久久| 激情欧美一区二区三区在线观看| 国产喷白浆一区二区三区| 国产精品午夜国产小视频| 国产精品欧美日韩一区二区| 国产精品视频专区| 国产精品伊人日日| 国产亚洲欧美日韩美女| 国产日韩综合| 精久久久久久久久久久| 在线电影国产精品| 亚洲日本电影| 宅男噜噜噜66一区二区66| 亚洲小视频在线| 欧美一区国产一区| 久久夜色精品国产欧美乱| 蜜臀av性久久久久蜜臀aⅴ| 欧美sm视频| 亚洲精品一二区| 亚洲欧美日韩精品久久奇米色影视| 亚洲自拍高清| 久久婷婷综合激情| 欧美精品在线视频观看| 国产精品福利在线观看| 国产无一区二区| 亚洲电影免费观看高清完整版| 亚洲精品国产精品乱码不99按摩 | 久久av在线| 欧美成人午夜激情在线| 欧美日韩一区二区三| 国产欧美综合在线| 亚洲欧洲日韩在线| 亚洲女人天堂av| 免费日韩成人| 亚洲视频中文| 麻豆九一精品爱看视频在线观看免费| 欧美国产1区2区| 国产视频在线一区二区 | 午夜精品久久久久久| 久久久亚洲影院你懂的| 亚洲国产日日夜夜| 亚洲主播在线观看| 欧美二区在线播放| 国产乱肥老妇国产一区二| 亚洲国产一区在线观看| 亚洲一线二线三线久久久| 久久在线免费观看视频| 99国产精品视频免费观看一公开| 欧美在线短视频| 欧美日韩在线第一页| 在线观看久久av| 午夜精品影院在线观看| 亚洲国产视频a| 午夜一区二区三区不卡视频| 欧美日韩123| 亚洲福利av| 久久久久www| 亚洲天堂成人在线观看| 欧美激情欧美激情在线五月| 国产一级精品aaaaa看| 亚洲视频自拍偷拍| 欧美激情精品久久久久久| 欧美中文字幕在线播放| 欧美午夜精品久久久久久浪潮| 亚洲国产成人91精品| 久久精品一区蜜桃臀影院| 在线综合亚洲欧美在线视频| 欧美极品欧美精品欧美视频| 尤物精品国产第一福利三区| 欧美中文字幕精品| 一区二区电影免费在线观看| 欧美成人免费视频| 亚洲二区在线视频| 麻豆成人综合网| 欧美中文在线免费| 国产三区二区一区久久| 性欧美videos另类喷潮| 99视频热这里只有精品免费| 欧美精品一区二| 99国产精品99久久久久久粉嫩| 男男成人高潮片免费网站| 欧美一区二区三区免费观看| 国产精品一区在线播放| 亚洲欧美综合一区| 亚洲系列中文字幕| 国产精品国产精品国产专区不蜜| 在线亚洲欧美视频| 日韩一本二本av| 国产精品xxx在线观看www| 亚洲一区欧美一区| 亚洲永久视频| 国产一级揄自揄精品视频| 久久亚洲综合| 媚黑女一区二区| av成人老司机| 亚洲一区二区三区四区五区黄 |