1.顶点格式改动:
之前写的几个例子都是2D的例子,使用的顶点格式是已经经过变换的顶点格式。而要写3D程序,我们就必须要用未经过变换的顶点。所以在定义顶点时也要有所改变:
//------------绘制图形步骤1.定义灵活顶点格式
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)//坐标为经过变换的屏幕坐标,顶点的颜色
//------------绘制图形步骤2.根据上面定义的顶点格式,创建一个顶点的结构体
struct stVertex
{
float x, y, z; //位置坐标
DWORD dwColor; //颜色
};
这里我使用了顶点缓冲区绘图,通过三个顶点绘制了一个三角形,顶点坐标如下:
<span style="white-space:pre"> </span>{-1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0)},
{ 1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0)},
{ 0.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255)}
打开的时候吓了我一跳。。。好大。。。
变换总览:
没有经过变换的3D世界,我们只能通过+z方向看。看到的东西也比较单调。要想看到一个比较真实的3D世界,就要通过各种变换了。
常用的变换一共有3种,世界变换,取景变换,投影变换。当然还有一个视口变换,不过个人感觉不需要矩阵操作,只是单纯的显示区域改变,与前面三种变换还是有点差距的。
WorldTransform(世界变换)
世界变换事实上就是将物体顶点从模型空间转换到世界空间中,模型空间其实就是在三维设计软件(如3DSMAX)中为物体设定的坐标系,也称局部坐标系或者本地坐标系。而世界坐标则是所有物体都是用同一个世界坐标原点的坐标系,变换就是指对模型进行平移,旋转,缩放及它们的任意组合变换。
平移:
//平移
D3DXMATRIXA16 matWorld;
//矩阵平移操作
D3DXMatrixTranslation(
&matWorld, //输出矩阵
0.0f, 1.0f, 0.0f //平移的距离,x,y,z
);
//进行平移变换
g_pDevice->SetTransform(D3DTS_WORLD, &matWorld);
旋转:
D3DXMATRIXA16 matWorld;
//生成绕Y轴旋转矩阵,存储于矩阵中
D3DXMatrixRotationY(
&matWorld, //输出矩阵
timeGetTime()/150.0f //角度
);
g_pDevice->SetTransform(D3DTS_WORLD, &matWorld);
//缩放
D3DXMATRIXA16 matScaling;