第六回:攝象機
一直以來,我都夢想著擁有一台數字攝象機(DV),但是口袋裡的銀子不允許。不過今天終於可以實現這個夢想了,因為這一回我們就要說怎麼在D3D中實現攝象機的功能(望梅止渴也好^_^)。
首先來看攝象機的原理,還是先看圖吧:(一張圖勝過千言萬語)
一台攝象機有以上畫面中的一些屬性:
1、 觀察點:攝象機擺放的位置
2、 目標點:攝象機對著一個地方
3、 觀察範圍:圓錐形狀投影範圍的夾角大小,單位是弧度。
4、 可見的最近距離和最遠距離:這兩個距離中間的觀察範圍就是可見地區。
5、 縱橫比:顯示時候的寬和高比例,一般為1。
明白了攝象機的原理後,我們來看D3D中是怎麼設定它的,有兩個矩陣是用來設定攝象機的,一個是觀察矩陣,一個是射影矩陣,程式說明一切。
首先是設定攝象機的觀察矩陣:
m_vEyePt = D3DXVECTOR3( 0.0f, 3.0f,-5.0f ); // 視點座標
m_vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f ); // 目標點座標
m_vUpVec = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); // 當前世界的向上方向,通常是(0,1,0)
// 根據上面給出的3個值建立一個基於左手座標系的觀察矩陣
D3DXMatrixLookAtLH( &m_matView, &m_vEyePt, &m_vLookatPt, &m_vUpVec );
// 設定該矩陣為D3D的當前觀察矩陣
pd3dDevice->SetTransform( D3DTS_VIEW, &m_matView );
然後設定攝象機的射影矩陣:
m_fFOV = D3DX_PI/4; // 觀察範圍夾角,這裡是90度
m_fAspect = 1.0f; // 縱橫比為1
m_fNearPlane = 1.0f; // 可見的最近距離
m_fFarPlane = 10000.0f; // 可見的最遠距離
// 建立一個基於左手座標系的射影矩陣
D3DXMatrixPerspectiveFovLH( &m_matProj, fFOV, fAspect, fNearPlane, fFarPlane );
// 設定該矩陣為D3D的當前射影矩陣
pd3dDevice->SetTransform( D3DTS_PROJECTION, &m_matProj );
非常容易不是嗎?不過真正的要搞懂這些還是必須先把矩陣搞懂,做3D遊戲用的最多的數學知識恐怕就是矩陣了,所以建議大家不要著急寫程式,先把《線形代數》的教科書找出來好好複習一下吧。
如果你不相信,請看這回例子程式中附帶的攝象機的旋轉和移動部分,只要你能全部看懂,那我就不多說什麼了,因為那完全都是在跟矩陣運算打交道的。
順便說明一下這回的例子程式,裡面攝象機的部分我用一個類cCamera封裝起來了,用起來肯定會比自己設定矩陣方便的多,試試在啟動並執行時候按方向鍵吧,如果是第一次你會很有成就感的哦^_^
不明白的地方歡迎大家來"金點時空"的留言板探討。
今天晚上一直停電,到快12點電才來,現在已經是淩晨1點了,明天還要上班呢,下回見。
運行結果:
[下載本回完整來源程式]
首頁:http://www.gpgame.com
郵件:softboy@sina.com
soft於2002-8-5淩晨1點
返回
金點時空 2000/8/5