DirectX903D 顶点格式 索引原理 视口矩阵 投影矩阵

顶点格式索引原理 视口矩阵 投影矩阵

 

顶点格式

 

自定义两种顶点格式

struct ColorVertex{

float _x, _y, _z;   //位置

DWORD _color;  //颜色

};

struct NormalTecVertex {

float _x, -y, _z;    //位置

float _nx, _ny, _nz; //顶点法线

float _u, _v;   //纹理坐标

};

顶点结构定义好之后 需要用灵活顶点格式(Flexible Vertex Format,FVF)期望的组合来描述顶点的组织结构。

#define FVF_COLOR  (D3DFVF_XYZ  | D3DFVF_DIFFUSE)

对应在顶点格式的顶点结构 包含了位置属性和漫反射颜色属性

#define FVF_NORMAL_TEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)

定义灵活顶点格式时必须遵循的一个约定是:灵活顶点格式的指定顺序必须与顶点结构中相应类数据定义的顺序保持一致。

 

索引原理

 

引入索引是为了解决 多面共享共顶点的问题。

原理如下:  创建一个顶点列表(vertex list)和一个索引列表(index list)顶点列表包含全部独立顶点,这些索引规定了为构建三角形单元同各顶点应按一定的方式来组织。

  Vetex VertecList[4] = {v0, v1, v2, v3};

借助索引列表来定义顶点列表中的组织方式 以构成两个三角形单元。

WORD indexList[6] = {0, 1, 2,    //triangle0

0, 2 3};    //triangle1

定义视口矩阵

视口矩阵定义视点的位置和视角。视口矩阵是场景的摄像机。

D3DXMATRIX *D3DXMatrixLookAtLH{

D3dxmatrix *pOut,

CONST D3DXMECTOR3* pEeys ,

CONST D3DXMECTOR3* pAt,

CONST D3DXMECTOR3*pUp,

}

参数pEye指定了摄像在世界坐标系的位置, 参数pAt指定了世界坐标系中的观察点参数pUp是世界坐标系中表示“向上”方向的向量

下面的片段创建视口矩阵并设定当前矩阵到Direct3D设备。

D3DXVECTOR3 vEyePt( 0.0f, 3.0f, -5.0f);

D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);

D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f );

D3DXMATRIXA16 matView;

D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec);

g_pd3dDevice -> SetTransform ( D3DTS_VIEW, &matVeiw);

第一步通过调用D3DXMatrixLookAtLH()定义视口矩阵,第一个参数是指向D3DXMATRIX结构体的指针保存操作的结果。第2,3,4个参数依次定义眼睛的位置、朝向和向上方向。这里眼睛延Z轴后移五个单位,向上三个单位,视点朝向定为原点,向上为Y轴正方向。

下一步是调用IDirect3DDevice9::SetTransform()将视口矩阵作用到Direct3D设备。Idirect3DDevice9::SetTransform()接受的第一个参数告诉Direct3D将设定哪一类矩阵,例子中使用D3DTS_VIEW标记指定将设置视口矩阵,第二个参数是指向当前设定的视口矩阵的指针。

更多关于视口矩阵的信息查看View Transform(Direct3D9)

在定义了视口矩阵后可以准备设定投影矩阵了。再次声明各种矩阵的定义顺序对程序没有影响,但Direct3D使用的是以上提过的顺序。

定义投影矩阵

 

D3DXMATRIX * D3DMatrixPerspectiveFovLH{

D3DXMATRIX &pOut,  //返回保存操作结果

FLOAT fovY,           //定义视口范围

FLOAT Aspect,         //纵横比

FLOAT zn,            //

FlLOAT zf,            //

};

投影矩阵定义如何将一个3D视角转换到2D的视口空间。

正同的代码设定了投影矩阵后将当前矩阵作用的Direct3D设备。

D3DXMATRIX matProj;

D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);

g_pd3dDevice -> SetTransform( D3DTS_PROJECTION, &matProj);

第一步调用D3DXMatrixPerspectiveFovLH()来设定投影矩阵。第一个参数是D3DXMATRIX结构体的指针保存操作结果,第二个参数定义视口范围,告知如何将远处物体变小,例子使用典型的90度(1/4PI),第三个参数定义屏幕高宽比(纵横比)。例子使用常用比例为1.第四和五个参数定义近、远剪切面。这将决定一定距离的几何图形将不再显示。Matrices工程中将近剪切面设为1远剪切面设为100.

下一步是调用IDirect3DDevice9::SetTransform()将投影矩阵应用到Direct3D设备,IDirect3DDevice9::SetTransfomr()接受的第一个参数告诉Direct3D将设定哪类矩阵,此例中使用D3DTS_PROJECTION标记指定投影矩阵将被指定,第二个参数是指向当前矩阵的指针。

《DirectX9.0 3D 开发编程基础》 笔记

               江西理工大学   FangSH   2010-4-8

原文地址:https://www.cnblogs.com/fangshenghui/p/1707431.html