遊戲引擎中的相機系統

2021-04-23 11:27:59 字數 2397 閱讀 8793

下面應用《微分幾何》中的歐氏空間等距變換,匯出從世界座標系到觀察座標系的變換,並結合directx9.0和c++來實現乙個簡單的相機類。

1。假設世界座標係用i=(i,j,k)和o(0,0,0)來表示,觀察座標係用e=(e1,e2,e3)和p(a,b,c)來表示,其中,e=a*i(這裡e和i表示為列向量)。a為正交矩陣,由a1=(a11,a12,a13),a2=(a21,a22,a23),a3=(a31,a32,a33)組成。

2。設世界座標系中的任意一點q(x,y,z)在觀察座標系中表示為(x0,y0,z0),於是有oq = op + pq (向量,由於不太方便,在此並未給出圖形)

(x,y,z)*i = (a,b,c)*i + (x0,y0,z0)*e,           (i,e為列向量)

(x,y,z)*i = (a,b,c)*i + (x0,y0,z0)*a*i;        (e=a*i)

於是有(x0,y0,z0)* a= (x,y,z) - (a,b,c);

(x0,y0,z0) = ((x,y,z) - (a,b,c))*a-1;           (a-1表示a的逆)

(x0,y0,z0) = ((x,y,z) - (a,b,c))*at;             (at表示a的的轉置,因為a為正交矩陣,逆等於轉置)

用齊次座標表示為

(x0,y0,z0) = (x,y,z)*b;                (b為a的逆矩陣)

b由 b1=(a11,a21,a31,0),b2 =(a12,a22,a32,0),b3 = (a13,a23,a33,0),b4 =(-a*e1,-b*e2,-c*e3,1)組成

因此相機類的**如下,僅給出部分**

class ccamera

;      //析構函式

void getmatrix(d3dxmatrix& matrix) ;  //獲得變換矩陣

void setposition(const d3dxvector3& pos); //設定位置

void getposition(d3dxvector3& pos) const; //獲得位置座標

virtual void walk(float units) = 0;   //前後移動

virtual void strafe(float units) = 0;  //左右移動

virtual void fly(float units) = 0;   //上下移動

virtual void pitch(float angle);   //仰俯

virtual void yaw(float angle);    //偏航

virtual void roll(float angle)=0;   //滾動

protected:

d3dxvector3  m_position;     //位置(p)

d3dxvector3  m_right;     //右向量(e1)

d3dxvector3  m_up;      //上向量(e2)

d3dxvector3  m_look;      //方向向量(e3)

}; //計算觀察矩陣

void ccamera::getmatrix(d3dxmatrix& matrix)

{//規範化向量

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);

//計算a的逆矩陣b

matrix._11 = m_right.x;  matrix._12 = m_up.x; matrix._13 = m_look.x; matrix._14 = 0;                 //b1

matrix._21 = m_right.y;  matrix._22 = m_up.y; matrix._23 = m_look.y; matrix._24 = 0;                //b2

matrix._31 = m_right.z;  matrix._32 = m_up.z; matrix._33 = m_look.z; matrix._34 = 0;                  //b3

//b4

matrix._41 = - d3dxvec3dot(&m_position,&m_right);

matrix._42 = - d3dxvec3dot(&m_position,&m_up);

matrix._43 = - d3dxvec3dot(&m_position,&m_look);

matrix._44= 1.0f;

2D遊戲引擎(十) 增強遊戲引擎中的子畫面

在2d遊戲中,如何對不需要的動畫子畫面進行自動隱藏或刪除?例如,當乙個 子畫面的幀動畫結束後,需要對此子畫面進行刪除操作。另外對此前的遊戲引擎中,除了對邊界動作為ba die的子畫面可以對其刪除外,還沒有提供乙個在一些特定時刻需對子畫面物件進行刪除操作的方法,比如碰撞時需要刪除互相碰撞的兩個子畫面。...

遊戲引擎中的各種剔除演算法

在引擎中最影響渲染效率的是場景管理,剔除演算法又是其中的最主要的內容。這裡簡單總結一下各種流行的遮擋剔除的演算法,只是為了我的遊戲引擎而做的一點功課。1。bsp。binary space partition。優勢在於這種演算法的資料結構十分簡單 二叉樹 而且在效率方面非常好,因為強調了離線計算 即場...

遊戲引擎的聯想

剛開始進入程式時,總是看別人學linux,學opengl,學一些公開 的功能實現,後來學了windows,所有功能,幾乎都是背api背引數,聯想到今天的遊戲引擎u3d。今天有點小後悔 為什麼這麼說呢 因為程式最簡單的就是那些花時間背的部分,那些知識,跟傳統行業的經驗不一樣,做醫生,做美術,很多行業,...