Posted on 2008-08-26 20:16
千張 閱讀(1253)
評論(0) 編輯 收藏 引用 所屬分類:
圖形學
本文的任務是在屏幕中間繪制出一個三角形。根據前面文章的介紹,現在我們主要改寫Setup,Cleanup和Display三個函數。
第一步:
定義頂點結構體及格式(不能隨心所欲地定義,具體規則查閱Directx SDK),頂點和索引緩沖區等,這些變量為全局變量。
第二步:
改寫Setup,Cleanup和Display三個函數
Setup函數:
1. 創建頂點緩沖區和索引緩沖區(若程序中沒有用到索引,則不用創建索引緩沖區),具體函數如下:
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
該函數中Triangle為返回的頂點緩沖區首地址。
在訪問緩沖區內容時必須使用Lock方法(Triangle->Lock(...).......Triangle->Unlock())。
2.視圖空間變換
視圖變換的定義:我們將攝像機平移變換到世界坐標系的原點并把它的方向旋轉至朝向Z軸的正方向,世界坐標系中的所有物體都將 隨著攝像機的變換而做相同的變換,這個變換就叫做視圖空間變換。
我對D3DXMatrixLookAtLH函數的理解(若有錯請幫忙指出):
D3DXMATRIX * D3DXMatrixLookAtLH(
D3DXMATRIX *pOut,
CONST D3DXVECTOR3 *pEye,
CONST D3DXVECTOR3 *pAt,
CONST D3DXVECTOR3 *pUp
);
參數pOut是一個矩陣,用于存儲返回的視圖變換矩陣,pEye是一個位置,即一個點,它表示攝像機的位置,相當于人的眼睛的位置,pAt也是一個位置,它與點pEye構成一條射線,這條射線的方向就是攝像機的透視體的中心軸的方向,相當于眼睛的視線方向,pUp是一個向量,這個向量和攝像機的+z軸求叉積,得到X軸的方向,然后,+z軸和X軸求叉積再計算出Y軸的方向,這就求出一個三角坐標系。
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.設置渲染模式
Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
Cleanup函數:
d3d::Release<IDirect3DVertexBuffer9*>(Triangle);//釋放緩沖區
Display函數:
1.設置資源流;
2.設置頂點格式;
3.設置索引緩沖區。
具體代碼見翁云兵書《3D游戲程序設計入門(Directx9)》代碼中的Triangle。
PS:今天看《交互式計算機圖形學--基于opengl的自頂向下方法》這本書時,看到關于照相機定位的章節,我對D3DXMatrixLookAtLH函數的理解有一點錯誤。
現在改正如下:
參數pOut是一個矩陣,用于存儲返回的視圖變換矩陣,pEye是一個位置,即一個點,它表示攝像機的位置,相當于人的眼睛的位置,pAt也是一個位置,它與點pEye構成一條射線,這條射線的方向就是攝像機的透視體的中心軸的方向,相當于眼睛的視線方向,pUp是一個向量,把pUp向量投影到視圖平面上,得到視線的向上方向v,v和pAt垂直,這兩個向量求叉積可以得到第三個向量u,這三個向量加上pEye點就構成所需要的照相機坐標系。