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

天行健 君子當自強而不息

設計一個靈活的Camera類(1)

新建網頁 1

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


12.1攝像機設計

我們定義一個相對于世界坐標系的位置和攝像機的方向,這里使用四個攝像機向量:right vector ,  up vector,look vector 以及 position vector,如圖12.1所示。這些向量用來為攝像機定義一個坐標系來描述在世界坐標中的對應關系。因為 right up look 向量定義了攝像機在世界中的方向,我們有時把它們三個向量一起稱為方向向量(orientation vectors)。方向向量必須被標準化。假如彼此互相垂直且都是單位長度,那么我們就稱它們是正交標準化向量。我們做這些限制是因為等一會兒我們要將方向向量插入到一個行矩陣中。因為行向量是正交標準化的,所以該矩陣也就是正交矩陣?;貞浺幌?,正交矩陣有一個特性就是它的逆矩陣等于它的轉置矩陣。

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

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

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

圍繞look向量旋轉(roll滾轉)

沿著right向量平移(strafe

沿著up向量飛行(fly

沿著look向量移動(move

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

   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枚舉類型。目前,我們的攝像機支持兩種攝像機模式,LANDO_BJECT模式和AIR_CRAFT模式。AIR_CRAFT模式允許我們在空間中完全自由的移動。不過,在有些游戲中,比如第一人稱設計游戲,人是不能飛的;因此我們必須限制它在某些軸上的運動。指定為LAND_OBJECT模式的攝像機就限制了這些。

12.2 實現細節

12.2.1計算視圖矩陣

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

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

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

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

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

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

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

我們能將變換任務分為兩個部分:1)平移部分,將攝像機的位置移動到原點;2)旋轉部分,將攝像機的方向向量與世界坐標系的軸對齊。

12.2.1.1 第一部分:平移

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

12.2.1.2 第二部分:旋轉

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

注意:我們在這里使用3*3矩陣來工作是因為現在不需要額外的信息來表現旋轉。等一下我們將它增加到常用的4*4矩陣。

因為這三個等式都有一個相同系數矩陣A ,所以我們能夠把它們合在一起。我們把它們從新寫到一起來:

A有很多方法,但是我們知道AB逆矩陣因為BA = BB-1 = I。因為B 是一個正交矩陣(它的行向量是正交標準化的),我們知道它的逆矩陣就是它的轉置矩陣。因此,將方向向量和世界坐標系中的坐標軸對齊的變換如下:

12.2.1.3 將兩部分合并

最后,將A增加為4*4矩陣,同時將平移部分合并到旋轉部分形成的視圖變換矩陣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;
    }

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

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

評論

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

前輩 請教 一下如何實現 相機的縮放  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            国产精品久久久久久福利一牛影视| 美日韩精品视频免费看| 午夜一区在线| 亚洲色图综合久久| aa级大片欧美| 亚洲一区二区在线免费观看| 亚洲欧美另类在线| 欧美中文在线字幕| 久久尤物视频| 最近看过的日韩成人| 亚洲黄色影院| 一本色道婷婷久久欧美| 亚洲欧美日韩第一区| 久久综合狠狠综合久久激情| 亚洲视频视频在线| 午夜久久久久久| 久久免费精品视频| 欧美极品欧美精品欧美视频| 欧美日韩一区二区在线视频| 国产欧美日韩视频一区二区三区| 国外成人在线视频| 亚洲精品综合久久中文字幕| 亚洲男人的天堂在线| 快射av在线播放一区| 亚洲国产婷婷综合在线精品| 亚洲午夜一级| 欧美高清视频在线| 国语自产精品视频在线看一大j8| 99国产精品久久久久久久| 久久狠狠亚洲综合| 一区二区日韩| 欧美激情综合色综合啪啪| 国产亚洲va综合人人澡精品| 亚洲美女精品久久| 欧美成人精品激情在线观看| 亚洲永久免费视频| 欧美精品日日鲁夜夜添| 狠狠色综合一区二区| 久久久国产亚洲精品| 欧美午夜视频一区二区| 最新精品在线| 久久久久久一区二区三区| 亚洲另类在线一区| 久久男人av资源网站| 国产欧美日韩一区| 中文在线一区| 亚洲精品婷婷| 免费不卡视频| 亚洲国产精品成人综合色在线婷婷| 欧美亚洲一区二区三区| 一区二区三区|亚洲午夜| 男同欧美伦乱| 在线精品视频免费观看| 久久综合九色综合欧美就去吻| 亚洲一区图片| 国产毛片一区二区| 性视频1819p久久| 99av国产精品欲麻豆| 欧美日韩一区二区在线视频 | 黄色一区三区| 久久精品欧美| 欧美亚洲综合另类| 国产精品一区二区a| 欧美亚洲专区| 亚洲女同同性videoxma| 国产伦精品一区二区三区视频黑人| 99国产精品自拍| 亚洲国产成人精品久久| 欧美视频在线观看| 亚洲久久在线| 亚洲国产精品传媒在线观看| 久久久久一区二区| 亚洲国产精品一区二区www在线| 久久久久国色av免费看影院| 亚欧成人精品| 伊人春色精品| 亚洲高清视频一区二区| 欧美精品一区二区三区久久久竹菊 | 久久精品论坛| 久久久久国产精品厨房| 精品成人久久| 亚洲国产精品福利| 欧美午夜精品一区二区三区| 亚洲欧美一区二区原创| 欧美一级久久久久久久大片| 亚洲欧美视频在线观看| 国产精品最新自拍| 久久婷婷激情| 欧美日韩一区二区三区在线| 午夜在线精品偷拍| 久久久久久尹人网香蕉| 亚洲精品在线视频观看| 99re在线精品| 国产亚洲精品一区二555| 欧美成人午夜激情| 国产精品久久久久aaaa九色| 欧美高清在线播放| 99国产精品久久久久久久成人热 | 在线欧美视频| 99伊人成综合| 欧美在线一区二区| 日韩视频一区二区三区在线播放免费观看 | 亚洲女爱视频在线| 久久电影一区| 99国产成+人+综合+亚洲欧美| 亚洲免费在线视频一区 二区| 在线观看日韩国产| 亚洲一区二区三区精品在线| 黄色精品一二区| 夜夜嗨av一区二区三区中文字幕 | 亚洲香蕉伊综合在人在线视看| 亚洲自拍偷拍福利| 欧美在线精品免播放器视频| 亚洲电影观看| 亚洲国产精品va在线观看黑人| 欧美日韩国产999| 亚洲福利专区| 一区二区高清在线| 欧美亚州韩日在线看免费版国语版| 国产一区二区三区无遮挡| 亚洲国产国产亚洲一二三| 久久久久久9999| 国产伊人精品| 久久亚洲影院| 欧美日韩亚洲一区二区| 久久欧美中文字幕| 欧美日韩亚洲一区在线观看| 久久久久欧美精品| 欧美日韩国产成人在线观看| 久久综合图片| 国产精品国色综合久久| 欧美成人在线网站| 国产精品日韩在线一区| 亚洲人永久免费| 1769国内精品视频在线播放| 亚洲欧美一区二区三区在线| 9人人澡人人爽人人精品| 美女黄色成人网| 嫩模写真一区二区三区三州| 国产亚洲欧洲997久久综合| 亚洲一区二区在线免费观看| 一本大道av伊人久久综合| 欧美精品91| 99re8这里有精品热视频免费 | 狼人社综合社区| 久久综合九色综合欧美就去吻| 国产视频观看一区| 欧美中文字幕在线视频| 久久久夜精品| 伊人久久大香线蕉综合热线| 久久国产精品色婷婷| 欧美一区二区免费视频| 国产精品热久久久久夜色精品三区| 亚洲一级特黄| 久久精品一区二区三区不卡| 国产拍揄自揄精品视频麻豆| 久久精品99国产精品酒店日本| 久久人人看视频| 伊人成人在线| 欧美韩日亚洲| 亚洲精品美女在线观看| 欧美婷婷六月丁香综合色| 亚洲一级电影| 久久综合网色—综合色88| 亚洲激情图片小说视频| 欧美成人激情在线| 亚洲国产欧美一区二区三区久久 | 亚洲精品日产精品乱码不卡| 欧美精品不卡| 国产毛片精品国产一区二区三区| 国产日韩欧美一区在线| 亚洲国产精品一区在线观看不卡 | 欧美午夜a级限制福利片| 亚洲精品视频在线观看网站| 亚洲影院色在线观看免费| 国产视频丨精品|在线观看| 免费久久精品视频| 亚洲午夜在线观看| 久久久久久综合| 亚洲人成网在线播放| 国产精品久久久久久久久久ktv| 亚欧成人在线| 一区二区激情视频| 女生裸体视频一区二区三区| 亚洲免费视频网站| 在线精品国产欧美| 国产精品成人一区二区| 久久综合久久综合九色| 欧美一级片一区| aaa亚洲精品一二三区| 免费在线亚洲欧美| 亚洲欧美中文日韩v在线观看| 亚洲高清资源| 国产亚洲一级| 国产精品视区| 欧美日韩综合视频网址| 欧美激情国产精品| 久久蜜桃香蕉精品一区二区三区| 亚洲欧美在线磁力| 一区二区日韩欧美|