• <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>
            http://hi.baidu.com/zyb_debug/blog/item/a5cd0251412e196b84352488.html
            龍書上的camera,可重用,直接看代碼和注釋吧。

            zybCamera.h

             1#ifndef ZYB_CAMERAL_H
             2#define ZYB_CAMERAL_H
             3
             4namespace zyb
             5{
             6
             7
             8class zybCamera
             9{
            10public:
            11   enum CameraType {LANDOBJECT,AIRCRAFT};
            12
            13   zybCamera();
            14   zybCamera(CameraType cameraType);
            15   ~zybCamera();
            16
            17   void strafe(float units); //橫移 左右
            18   void fly(float units);     //上下
            19   void walk(float units);    //前后
            20
            21  
            22   void pitch(float angle);    //俯仰,沿x軸,也就是右向量的旋轉
            23                                 //實際效果是飛機機頭的升降
            24
            25   void yaw(float angle);      //偏航,沿y軸,也就是上向量的旋轉
            26
            27   void roll(float angle);     //左右倒,沿周,也就是前向量的旋轉
            28                              //實際效果是飛機的機翼左右倒
            29
            30   void getViewMatrix(D3DXMATRIX* V);   //獲取攝像機矩陣
            31   void setCameraType(CameraType cameraType); //設置攝像機的類型
            32   void getPosition(D3DXVECTOR3* pos);   //得到攝像機的位置
            33   void setPosition(D3DXVECTOR3* pos);         //設置攝像機的位置
            34
            35   void getRight(D3DXVECTOR3* right);          //得到攝像機的右向量,在世界坐標系
            36   void getUp(D3DXVECTOR3* up);    //得到攝像機的上向量,在世界坐標系
            37   void getLook(D3DXVECTOR3* look);            //得到攝像機的前向量,在世界坐標系
            38
            39private:
            40   CameraType    _cameraType;    //攝像機類型
            41   D3DXVECTOR3    _right;     //右向量
            42   D3DXVECTOR3    _up;     //上向量
            43   D3DXVECTOR3    _look;      //前向量
            44   D3DXVECTOR3         _pos;     //攝像機在世界坐標系中的位置
            45
            46}
            ;
            47
            48}

            49
            50
            51#endif
            52
            53

            zybCamera.cpp
              1 #include "DXUT.h"
              2 #include "zybCamera.h"
              3 
              4 namespace zyb
              5 {
              6 
              7 //=========================================
              8    /**
              9    @brief 初始化位置為坐標原點(世界坐標系)
             10      右向量為x軸正向單位向量
             11      上向量為y軸正向單位向量
             12      前向量為z軸正向單位向量
             13    @param 
             14    @return
             15    */
             16 //=========================================
             17 zybCamera::zybCamera()
             18 {
             19 
             20    _cameraType = AIRCRAFT;
             21 
             22    _pos   = D3DXVECTOR3(0.0f,0.0f,0.0f);
             23    _right = D3DXVECTOR3(1.0f,0.0f,0.0f);
             24    _up    = D3DXVECTOR3(0.0f,1.0f,0.0f);
             25    _look = D3DXVECTOR3(0.0f,0.0f,1.0f);
             26 
             27 }
             28 
             29 zybCamera::zybCamera(zyb::zybCamera::CameraType cameraType)
             30 {
             31    _cameraType = cameraType;
             32 
             33    _pos   = D3DXVECTOR3(0.0f,0.0f,0.0f);
             34    _right = D3DXVECTOR3(1.0f,0.0f,0.0f);
             35    _up    = D3DXVECTOR3(0.0f,1.0f,0.0f);
             36    _look = D3DXVECTOR3(0.0f,0.0f,1.0f);
             37 
             38 
             39 }
             40 
             41 zybCamera::~zybCamera()
             42 {
             43 
             44 }
             45 
             46 //=========================================
             47    /**
             48    @brief 如果是飛機類型的相機,那么橫移只是
             49      攝像機右向量方向上的移動(世界坐標系)
             50      如果陸地類型的相機,那么橫移方向不包括右方向
             51      y項分量的移動 
             52    @param 
             53    @return
             54    */
             55 //=========================================
             56 void zybCamera::strafe(float units)
             57 {
             58    if( _cameraType == LANDOBJECT )
             59     _pos += D3DXVECTOR3(_right.x, 0.0f, _right.z) * units;
             60 
             61    if( _cameraType == AIRCRAFT )
             62     _pos += _right * units;
             63 
             64 }
             65 
             66 
             67 //=========================================
             68    /**
             69    @brief 如果是飛機類型的相機,那么攝像機隨著攝像機上
             70      向量的方向移動
             71    
             72      如果陸地類型的相機,那么只增加攝像機的位置的y分量
             73 
             74    @param 
             75    @return
             76    */
             77 //=========================================
             78 
             79 void zybCamera::fly(float units)
             80 {
             81    if( _cameraType == LANDOBJECT )
             82     _pos.y += units;
             83 
             84    if( _cameraType == AIRCRAFT )
             85     _pos += _up * units;
             86 
             87 }
             88 
             89 //=========================================
             90    /**
             91     如果是飛機類型的相機,那么前行只是
             92     攝像機前向量方向上的移動(世界坐標系)
             93       如果陸地類型的相機,那么前行方向不包括look方向
             94     y項的移動
             95    */
             96 //=========================================
             97 void zybCamera::walk(float units)
             98 {
             99    if (_cameraType == LANDOBJECT)
            100    {
            101     _pos += D3DXVECTOR3(_look.x, 0.0f , _look.z) * units;
            102    }
            103    else
            104    {
            105     _pos += _look * units;
            106    }
            107 
            108 }
            109 
            110 
            111 //=========================================
            112    /**
            113    @brief 計算繞右向量旋轉的矩陣,然后
            114      上向量和前向量乘以這個矩陣得到現在
            115      的上向量和前向量,為什么右向量不變?
            116      因為上向量和前向量同時旋轉一個角度,那么
            117      它們形成的平面還是和右向量是垂直的
            118    @param 
            119    @return
            120    */
            121 //=========================================
            122 void zybCamera::pitch(float angle)
            123 {
            124    D3DXMATRIX T;
            125    D3DXMatrixRotationAxis(&T, &_right, angle);
            126 
            127   
            128    D3DXVec3TransformCoord(&_up,&_up, &T);
            129    D3DXVec3TransformCoord(&_look,&_look, &T);
            130 
            131 }
            132 
            133 //=========================================
            134    /**
            135    @brief 如果是陸地型攝像機,直接繞世界坐標y軸旋轉 
            136    @param 如果是飛機型攝像機,繞攝像機的y軸轉動
            137    @return
            138    */
            139 //=========================================
            140 void zybCamera::yaw(float angle)
            141 {
            142 
            143 
            144    D3DXMATRIX T;
            145 
            146   // rotate around world y (0, 1, 0) always for land object
            147    if( _cameraType == LANDOBJECT )
            148     D3DXMatrixRotationY(&T, angle);
            149 
            150   // rotate around own up vector for aircraft
            151    if( _cameraType == AIRCRAFT )
            152     D3DXMatrixRotationAxis(&T, &_up, angle);
            153 
            154   // rotate _right and _look around _up or y-axis
            155    D3DXVec3TransformCoord(&_right,&_right, &T);
            156    D3DXVec3TransformCoord(&_look,&_look, &T);
            157 
            158 }
            159 
            160 //=========================================
            161    /**
            162    @brief 只針對飛機型攝像機才有繞前向量的旋轉,也就是左右晃  
            163    @param
            164    @return
            165    */
            166 //=========================================
            167 void zybCamera::roll(float angle)
            168 {
            169    // only roll for aircraft type
            170    if( _cameraType == AIRCRAFT )
            171    {
            172     D3DXMATRIX T;
            173     D3DXMatrixRotationAxis(&T, &_look, angle);
            174 
            175     // rotate _up and _right around _look vector
            176     D3DXVec3TransformCoord(&_right,&_right, &T);
            177     D3DXVec3TransformCoord(&_up,&_up, &T);
            178    }
            179 
            180 
            181 }
            182 
            183 
            184 //=========================================
            185    /**
            186    @brief 計算攝像機矩陣,這個可以去看有關的數學知識
            187      攝像機變換
            188      就是根據3個向量來進行攝像機變換
            189 
            190      思路:點世界變幻的逆運算就是攝像機變換
            191    @param 
            192    @return
            193    */
            194 //=========================================
            195 
            196 void zybCamera::getViewMatrix(D3DXMATRIX* V)
            197 {
            198    // Keep camera's axes orthogonal to eachother
            199    D3DXVec3Normalize(&_look, &_look);
            200 
            201    D3DXVec3Cross(&_up, &_look, &_right);
            202    D3DXVec3Normalize(&_up, &_up);
            203 
            204    D3DXVec3Cross(&_right, &_up, &_look);
            205    D3DXVec3Normalize(&_right, &_right);
            206 
            207    // Build the view matrix:
            208    float x = -D3DXVec3Dot(&_right, &_pos);
            209    float y = -D3DXVec3Dot(&_up, &_pos);
            210    float z = -D3DXVec3Dot(&_look, &_pos);
            211 
            212    (*V)(0,0= _right.x; (*V)(01= _up.x; (*V)(02= _look.x; (*V)(03= 0.0f;
            213    (*V)(1,0= _right.y; (*V)(11= _up.y; (*V)(12= _look.y; (*V)(13= 0.0f;
            214    (*V)(2,0= _right.z; (*V)(21= _up.z; (*V)(22= _look.z; (*V)(23= 0.0f;
            215    (*V)(3,0= x;        (*V)(31= y;     (*V)(32= z;       (*V)(33= 1.0f;
            216 
            217 }
            218 
            219 void zybCamera::setCameraType(CameraType cameraType)
            220 {
            221    _cameraType = cameraType;
            222 
            223 
            224 }
            225 //=========================================
            226 /**
            227 @brief 簡單的getSet 
            228 @param 
            229 @return
            230 */
            231 //=========================================
            232 
            233 void zybCamera::getPosition(D3DXVECTOR3* pos)
            234 {
            235    *pos = _pos;
            236 
            237 }
            238 
            239 void zybCamera::setPosition(D3DXVECTOR3* pos)
            240 {
            241    _pos = *pos;
            242 
            243 }
            244 
            245 void zybCamera::getRight(D3DXVECTOR3* right)
            246 {
            247    *right = _right;
            248 }
            249 
            250 void zybCamera::getUp(D3DXVECTOR3* up)
            251 {
            252    *up = _up;
            253 }
            254 
            255 void zybCamera::getLook(D3DXVECTOR3 *look)
            256 {
            257    *look = _look;
            258 }
            259 
            260 
            261 
            262 
            263 
            264 }
            265 
            Posted on 2009-08-23 08:54 zyb_debug 閱讀(1338) 評論(3)  編輯 收藏 引用

            Feedback

            # re: 一個靈活的camera類  回復  更多評論   

            2009-08-23 09:41 by 烏龜LNE
            我的建議是使用四元數作為旋轉的方式,比Matrix計算量小,而且精確方便

            # re: 一個靈活的camera類  回復  更多評論   

            2009-08-23 10:16 by zyb_debug
            @烏龜LNE
            恩,昨天才看了四元數。理論上是理解了怎么做。
            以后弄頂點動畫的時候說吧。

            不僅比matrix計算量小,而且也省內存,30%左右

            # re: 一個靈活的camera類  回復  更多評論   

            2009-08-23 17:32 by CY
            3ds max中除了攝像機本身外,還有一個注視目標屬性,參考下,建議也封裝進去
            久久成人国产精品| 亚洲国产欧洲综合997久久| 久久精品99无色码中文字幕| 精品久久综合1区2区3区激情| 久久人人爽人人精品视频| 久久久久青草线蕉综合超碰| 亚洲国产精品高清久久久| 久久亚洲精品中文字幕三区| 青青久久精品国产免费看| 亚洲精品无码久久久久去q| 97久久久久人妻精品专区 | 久久综合亚洲色一区二区三区| 狠狠色婷婷久久综合频道日韩| 激情伊人五月天久久综合| 久久久久亚洲av毛片大| 久久久国产精品亚洲一区| 激情综合色综合久久综合| 97久久婷婷五月综合色d啪蜜芽| 72种姿势欧美久久久久大黄蕉| 久久久艹| 久久精品一区二区国产| 精品久久久久久久久免费影院| 成人妇女免费播放久久久| 久久精品视频一| 成人国内精品久久久久影院VR | 日本精品久久久中文字幕| 久久人妻AV中文字幕| 久久九九有精品国产23百花影院| 久久久午夜精品| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 日韩人妻无码一区二区三区久久 | 久久人爽人人爽人人片AV| 亚洲精品NV久久久久久久久久| 国产精品久久久久天天影视| 新狼窝色AV性久久久久久| 久久久久久毛片免费看| 久久久久中文字幕| 久久w5ww成w人免费| A级毛片无码久久精品免费| 亚洲综合久久夜AV | 国产午夜精品久久久久九九电影|