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

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軸,也就是右向量的旋轉(zhuǎn)
23                                 //實(shí)際效果是飛機(jī)機(jī)頭的升降
24
25   void yaw(float angle);      //偏航,沿y軸,也就是上向量的旋轉(zhuǎn)
26
27   void roll(float angle);     //左右倒,沿周,也就是前向量的旋轉(zhuǎn)
28                              //實(shí)際效果是飛機(jī)的機(jī)翼左右倒
29
30   void getViewMatrix(D3DXMATRIX* V);   //獲取攝像機(jī)矩陣
31   void setCameraType(CameraType cameraType); //設(shè)置攝像機(jī)的類型
32   void getPosition(D3DXVECTOR3* pos);   //得到攝像機(jī)的位置
33   void setPosition(D3DXVECTOR3* pos);         //設(shè)置攝像機(jī)的位置
34
35   void getRight(D3DXVECTOR3* right);          //得到攝像機(jī)的右向量,在世界坐標(biāo)系
36   void getUp(D3DXVECTOR3* up);    //得到攝像機(jī)的上向量,在世界坐標(biāo)系
37   void getLook(D3DXVECTOR3* look);            //得到攝像機(jī)的前向量,在世界坐標(biāo)系
38
39private:
40   CameraType    _cameraType;    //攝像機(jī)類型
41   D3DXVECTOR3    _right;     //右向量
42   D3DXVECTOR3    _up;     //上向量
43   D3DXVECTOR3    _look;      //前向量
44   D3DXVECTOR3         _pos;     //攝像機(jī)在世界坐標(biāo)系中的位置
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 初始化位置為坐標(biāo)原點(diǎn)(世界坐標(biāo)系)
 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 如果是飛機(jī)類型的相機(jī),那么橫移只是
 49      攝像機(jī)右向量方向上的移動(世界坐標(biāo)系)
 50      如果陸地類型的相機(jī),那么橫移方向不包括右方向
 51      y項(xiàng)分量的移動 
 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 如果是飛機(jī)類型的相機(jī),那么攝像機(jī)隨著攝像機(jī)上
 70      向量的方向移動
 71    
 72      如果陸地類型的相機(jī),那么只增加攝像機(jī)的位置的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     如果是飛機(jī)類型的相機(jī),那么前行只是
 92     攝像機(jī)前向量方向上的移動(世界坐標(biāo)系)
 93       如果陸地類型的相機(jī),那么前行方向不包括look方向
 94     y項(xiàng)的移動
 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 計(jì)算繞右向量旋轉(zhuǎn)的矩陣,然后
114      上向量和前向量乘以這個(gè)矩陣得到現(xiàn)在
115      的上向量和前向量,為什么右向量不變?
116      因?yàn)樯舷蛄亢颓跋蛄客瑫r(shí)旋轉(zhuǎn)一個(gè)角度,那么
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 如果是陸地型攝像機(jī),直接繞世界坐標(biāo)y軸旋轉(zhuǎn) 
136    @param 如果是飛機(jī)型攝像機(jī),繞攝像機(jī)的y軸轉(zhuǎn)動
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 只針對飛機(jī)型攝像機(jī)才有繞前向量的旋轉(zhuǎn),也就是左右晃  
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 計(jì)算攝像機(jī)矩陣,這個(gè)可以去看有關(guān)的數(shù)學(xué)知識
187      攝像機(jī)變換
188      就是根據(jù)3個(gè)向量來進(jìn)行攝像機(jī)變換
189 
190      思路:點(diǎn)世界變幻的逆運(yùn)算就是攝像機(jī)變換
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 閱讀(1350) 評論(3)  編輯 收藏 引用

Feedback

# re: 一個(gè)靈活的camera類  回復(fù)  更多評論   

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

# re: 一個(gè)靈活的camera類  回復(fù)  更多評論   

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

不僅比matrix計(jì)算量小,而且也省內(nèi)存,30%左右

# re: 一個(gè)靈活的camera類  回復(fù)  更多評論   

2009-08-23 17:32 by CY
3ds max中除了攝像機(jī)本身外,還有一個(gè)注視目標(biāo)屬性,參考下,建議也封裝進(jìn)去

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


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美高清日韩| 99精品免费视频| 美女视频网站黄色亚洲| 亚洲国产精品美女| 夜夜夜精品看看| 国产精品视频观看| 欧美一区三区二区在线观看| 久久久噜噜噜久久狠狠50岁| 亚洲高清在线视频| 欧美日韩三区| 欧美一区二区三区在线播放| 亚洲第一精品久久忘忧草社区| 日韩午夜在线视频| 国产精品一国产精品k频道56| 欧美中文字幕在线播放| 亚洲欧洲免费视频| 久久久久久久久久久一区 | 欧美视频二区| 欧美在线观看网站| 亚洲电影免费观看高清| 欧美一区二区视频网站| 亚洲国产成人在线视频| 国产精品毛片va一区二区三区| 久久男人av资源网站| 9色精品在线| 欧美成人精品福利| 午夜一级久久| 日韩图片一区| 怡红院av一区二区三区| 国产精品久久网| 免费永久网站黄欧美| 亚洲欧美日韩精品久久| 亚洲国产老妈| 久久女同互慰一区二区三区| 亚洲视频综合| 亚洲国产小视频在线观看| 国产视频综合在线| 欧美精品在线一区二区三区| 久久久久久久久综合| 午夜国产精品影院在线观看 | 亚洲欧洲三级电影| 国产一区导航| 国产精品乱子乱xxxx| 欧美激情第五页| 狂野欧美一区| 久久久99久久精品女同性| 亚洲视频免费看| 99国产精品国产精品久久| 亚洲福利视频三区| 免费成人黄色av| 久久午夜激情| 久久久久久网址| 欧美中文字幕精品| 亚洲欧美日韩久久精品| 亚洲视频网在线直播| 在线一区二区视频| 夜夜精品视频一区二区| 亚洲精品在线视频| 亚洲美女毛片| 日韩亚洲欧美成人一区| 亚洲麻豆av| 99视频在线观看一区三区| 亚洲激情成人网| 亚洲国内精品在线| 亚洲国产精品久久久久| 在线欧美电影| 亚洲国产一二三| 亚洲久久一区二区| 一区二区三欧美| 亚洲图片激情小说| 亚洲男人的天堂在线| 西瓜成人精品人成网站| 欧美一区二区三区四区视频 | 一区二区三区黄色| 亚洲天堂偷拍| 亚洲欧美福利一区二区| 香港久久久电影| 久久久99国产精品免费| 久久综合久久88| 欧美好吊妞视频| 欧美日韩综合视频| 国产精品视频免费观看| 国产一区二区三区高清| 亚洲电影欧美电影有声小说| 亚洲激情视频在线| av成人天堂| 欧美呦呦网站| 奶水喷射视频一区| 亚洲国产专区| 亚洲午夜在线观看| 欧美中文日韩| 欧美激情2020午夜免费观看| 欧美色综合网| 国产综合网站| 在线视频精品| 久久精品一本久久99精品| 欧美激情按摩在线| 99精品欧美一区| 久久精品国产久精国产思思| 欧美电影免费观看高清| 国产精品igao视频网网址不卡日韩| 国产日韩综合| 日韩视频精品在线观看| 欧美影院成人| 91久久中文字幕| 欧美一区二视频| 欧美精品午夜| 国模精品娜娜一二三区| 亚洲美女啪啪| 久久久久久久久岛国免费| 亚洲韩国一区二区三区| 亚洲一区二区视频在线| 美日韩在线观看| 国产乱肥老妇国产一区二| 亚洲国产成人精品女人久久久 | 欧美在线短视频| 亚洲国产日韩欧美在线动漫| 亚洲欧美一区二区三区极速播放| 欧美成人精品高清在线播放| 国产欧美日韩精品一区| 亚洲老司机av| 久热综合在线亚洲精品| 一区二区三区黄色| 欧美国产欧美亚洲国产日韩mv天天看完整 | 蜜桃av一区二区三区| 野花国产精品入口| 免费不卡在线观看av| 国产欧美高清| 一本高清dvd不卡在线观看| 免费观看欧美在线视频的网站| 中文日韩在线视频| 欧美精品在线极品| 亚洲国产成人av好男人在线观看| 亚洲欧美视频在线观看| 亚洲欧美综合国产精品一区| 99re在线精品| 久久国产精品久久国产精品| 午夜精品一区二区在线观看| 欧美岛国在线观看| 久久成人免费电影| 国产欧美一区二区精品婷婷| 亚洲精品在线二区| 欧美国产日韩精品免费观看| 久久精品国产一区二区三区| 国产麻豆精品久久一二三| 亚洲一区视频在线| 日韩视频一区二区| 欧美日韩另类视频| 一区二区欧美日韩| 亚洲免费av电影| 欧美日韩亚洲网| 亚洲一本大道在线| 夜色激情一区二区| 欧美性猛交99久久久久99按摩| 99热在线精品观看| 亚洲精品国产精品乱码不99| 你懂的视频一区二区| 亚洲国产中文字幕在线观看| 美女黄毛**国产精品啪啪| 久久久久久久久久久成人| 樱花yy私人影院亚洲| 欧美18av| 欧美黄免费看| 亚洲视频高清| 亚洲性夜色噜噜噜7777| 国产精品卡一卡二| 久久精品一区二区三区中文字幕 | 在线视频亚洲欧美| 国产精品免费一区二区三区观看| 亚洲综合好骚| 欧美一级黄色录像| 欲色影视综合吧| 欧美激情一区在线| 欧美精品麻豆| 午夜精品三级视频福利| 午夜精品美女久久久久av福利| 国产情人节一区| 久久综合一区二区三区| 免费在线亚洲| 亚洲欧美日韩在线不卡| 欧美在线观看视频一区二区三区| 在线播放亚洲一区| 亚洲精品一区二区在线观看| 国产精品久久二区二区| 久久久久久69| 欧美电影免费观看高清| 亚洲香蕉网站| 欧美中文字幕在线| 日韩视频在线观看免费| 中文亚洲字幕| 亚洲第一二三四五区| av不卡在线观看| 一区二区视频免费在线观看| 亚洲人精品午夜| 国产一区999| 亚洲欧洲在线免费| 国产亚洲欧美另类中文| 亚洲国产精品欧美一二99| 国产精品系列在线播放| 欧美国产日韩一区二区三区|