根據DX攝象機D3DXMatrixLookAtRH(LH)攝象機主要有lookat座標、eye座標、up向量3部分組成,按照lookat和eye的關係我我的將攝象機分紅2類:第一種lookat繞eye旋轉我稱他爲「第一人稱」攝象機;第二種eye繞lookat旋轉我稱他爲「第三人稱」攝象機。第二種攝象機比較適合通常的RPG遊戲,也被稱爲跟隨攝象機。第一種攝象機比較適合CS類型的FPS遊戲。函數
兩種攝象機的作法是同樣的,無非一點繞另外一點旋轉。這兩種攝象機我統稱爲「經緯度」攝象機,由於我使用經緯度來計算。被饒點不動饒點作的就是一個球面運動,表示球面的位置很天然就會用到經緯度。遊戲
以eye繞lookat旋轉舉例,計算步驟爲:引用
先定義一些狀態:經緯度如下被稱爲垂直旋轉角和水平旋轉角,座標系使用右手,X軸朝右Z軸朝上Y軸朝屏幕內,eye到lookat的距離稱爲焦距(球半徑),XY平面上的旋轉半徑稱爲水平半徑(圓半徑),垂直旋轉角爲焦距線段和水平面(XY平面)的夾角,水平旋轉角爲水平面上水平半徑線段與Y軸的夾角。生成
一、eye的z座標=垂直旋轉角的正弦值*焦距
二、水平半徑=垂直旋轉角的餘弦值*焦距
三、eye的x座標=水平旋轉角的正弦值*水平半徑
四、eye的y座標=水平旋轉角的餘弦值*水平半徑
以上兩種攝象機都基於D3DXMatrixLookAtRH(LH)他們能適合大部分需求,但還有些類型不適合,好比飛行模擬。這兩種攝象機的UP向量都不變所以不能用於徹底的三維旋轉,例如歐拉旋轉。所以我使用第三種攝像機控制方式:由向量直接生成視圖矩陣。其實D3DXMatrixLookAtRH函數就是把2個座標點變成向量而後變成矩陣。
如下引用一段別人的解釋:
先得到攝像機的世界座標 p,和攝像機座標系軸在世界座標中的矢量D(看向),U(上),R(右)。而後要把世界座標的攝像機位置點換算到攝像機局部座標系中。 (-D * p, - U * p, - R * p) 計算-p 在(D,U,R)矢量上的投影轉換爲p1.
Dx, Ux, Rx, 0
Dy, Uy, Ry, 0
Dz, Uz, Rz, 0
p1x,p1yp1z, 1
對於D,U,R 其實就是攝像機的世界座標旋轉變換的逆矩陣。以下:
Dx,Dy,Dz
Ux,Uy,Uz
Rx,Ry,Rz
如此使用本身計算好的視圖矩陣就不須要D3DXMatrixLookAtRH(LH)函數了。