Posted on 2008-08-26 20:16
千张 阅读(1237)
评论(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点就构成所需要的照相机坐标系。