Posted on 2008-08-26 20:16
千張 閱讀(1253)
評論(0) 編輯 收藏 引用 所屬分類:
圖形學(xué)
本文的任務(wù)是在屏幕中間繪制出一個(gè)三角形。根據(jù)前面文章的介紹,現(xiàn)在我們主要改寫Setup,Cleanup和Display三個(gè)函數(shù)。
第一步:
定義頂點(diǎn)結(jié)構(gòu)體及格式(不能隨心所欲地定義,具體規(guī)則查閱Directx SDK),頂點(diǎn)和索引緩沖區(qū)等,這些變量為全局變量。
第二步:
改寫Setup,Cleanup和Display三個(gè)函數(shù)
Setup函數(shù):
1. 創(chuàng)建頂點(diǎn)緩沖區(qū)和索引緩沖區(qū)(若程序中沒有用到索引,則不用創(chuàng)建索引緩沖區(qū)),具體函數(shù)如下:
Device->CreateVertexBuffer(
3 * sizeof(Vertex), // size in bytes
D3DUSAGE_WRITEONLY, // flags
Vertex::FVF, // vertex format
D3DPOOL_MANAGED, // managed memory pool
&Triangle, // return create vertex buffer
0); // not used - set to 0
該函數(shù)中Triangle為返回的頂點(diǎn)緩沖區(qū)首地址。
在訪問緩沖區(qū)內(nèi)容時(shí)必須使用Lock方法(Triangle->Lock(...).......Triangle->Unlock())。
2.視圖空間變換
視圖變換的定義:我們將攝像機(jī)平移變換到世界坐標(biāo)系的原點(diǎn)并把它的方向旋轉(zhuǎn)至朝向Z軸的正方向,世界坐標(biāo)系中的所有物體都將 隨著攝像機(jī)的變換而做相同的變換,這個(gè)變換就叫做視圖空間變換。
我對D3DXMatrixLookAtLH函數(shù)的理解(若有錯(cuò)請幫忙指出):
D3DXMATRIX * D3DXMatrixLookAtLH(
D3DXMATRIX *pOut,
CONST D3DXVECTOR3 *pEye,
CONST D3DXVECTOR3 *pAt,
CONST D3DXVECTOR3 *pUp
);
參數(shù)pOut是一個(gè)矩陣,用于存儲(chǔ)返回的視圖變換矩陣,pEye是一個(gè)位置,即一個(gè)點(diǎn),它表示攝像機(jī)的位置,相當(dāng)于人的眼睛的位置,pAt也是一個(gè)位置,它與點(diǎn)pEye構(gòu)成一條射線,這條射線的方向就是攝像機(jī)的透視體的中心軸的方向,相當(dāng)于眼睛的視線方向,pUp是一個(gè)向量,這個(gè)向量和攝像機(jī)的+z軸求叉積,得到X軸的方向,然后,+z軸和X軸求叉積再計(jì)算出Y軸的方向,這就求出一個(gè)三角坐標(biāo)系。
3.投影變換
D3DXMATRIX * D3DXMatrixPerspectiveFovLH(
D3DXMATRIX *pOut,
FLOAT fovy,
FLOAT Aspect,
FLOAT zn,
FLOAT zf
);
例如:
D3DXMatrixPerspectiveFovLH(
&proj, // result
D3DX_PI * 0.5f, // 90 - degrees
(float)Width / (float)Height, // aspect ratio
1.0f, // near plane
1000.0f); // far plane
4.設(shè)置渲染模式
Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
Cleanup函數(shù):
d3d::Release<IDirect3DVertexBuffer9*>(Triangle);//釋放緩沖區(qū)
Display函數(shù):
1.設(shè)置資源流;
2.設(shè)置頂點(diǎn)格式;
3.設(shè)置索引緩沖區(qū)。
具體代碼見翁云兵書《3D游戲程序設(shè)計(jì)入門(Directx9)》代碼中的Triangle。
PS:今天看《交互式計(jì)算機(jī)圖形學(xué)--基于opengl的自頂向下方法》這本書時(shí),看到關(guān)于照相機(jī)定位的章節(jié),我對D3DXMatrixLookAtLH函數(shù)的理解有一點(diǎn)錯(cuò)誤。
現(xiàn)在改正如下:
參數(shù)pOut是一個(gè)矩陣,用于存儲(chǔ)返回的視圖變換矩陣,pEye是一個(gè)位置,即一個(gè)點(diǎn),它表示攝像機(jī)的位置,相當(dāng)于人的眼睛的位置,pAt也是一個(gè)位置,它與點(diǎn)pEye構(gòu)成一條射線,這條射線的方向就是攝像機(jī)的透視體的中心軸的方向,相當(dāng)于眼睛的視線方向,pUp是一個(gè)向量,把pUp向量投影到視圖平面上,得到視線的向上方向v,v和pAt垂直,這兩個(gè)向量求叉積可以得到第三個(gè)向量u,這三個(gè)向量加上pEye點(diǎn)就構(gòu)成所需要的照相機(jī)坐標(biāo)系。