设计DirectX游戏开头动画效果 作者:蒋轶民
这个周末我刻苦钻研了两天加上一个晚上,终于把我的DirectX游戏开头动画效果做出来了。自己还是感到很高兴的。高兴之余,我发现我自己对纹理贴图的知识还是太匮乏了,必须要好好钻研才行。
首先请大家看看。这是我程序的最终效果。
要是我自己评价的话,只能算是差强人意。因为最终我的方案改变了。因为自己对纹理贴图的知识很匮乏。不过在以后我有的是时间来进行这方面的研究。
首先我研究怎样做这个程序的时候,遇到的问题是:怎样才能创建一个三维的物体,并且让它进行运动?这个问题也让我参考了很多的文献。包括了《DirectX游戏开发终极指南》、MSDN、GameRes.com和诸多强人的笔记。最终我在这些知识中总结了我的经验。下面以伪代码的形式展示给大家。
- 创建球体CreateSphere的步骤:
- 1、创建投影矩阵
- D3DXMatrixPerspectiveFovLH(D3DXMatrix 投影矩阵的指针, FLOAT y轴可见的弧度,FLOAT 宽高比,FLOAT 近裁面,FLOAT 远裁面);
- 2、转换投影矩阵
- g_D3DDevice->SetTransform(D3DTS_PROJECTION(设置投影矩阵的参数),D3DXMatrix 投影矩阵的指针);
- 3、创建图形或纹理;
- 4、定义三个视角
- D3DXVECTOR3 观察者(摄影机)视角(0.0f, 0.0f, -8.0f);
- D3DXVECTOR3 观看的点(0.0f, varB, varA);
- D3DXVECTOR3 默认向上的位置(0.0f, 1.0f, 0.0f);(如果是默认向下,可是设置(0.0f, -1.0f, 0.0f);
- 5、建立视角矩阵
- D3DXMatrixLookAtLH(视角矩阵的指针, 观察者(摄影机)视角的指针,
- 观看的点的指针, 默认向上的位置的指针);
- 6、开始渲染
- g_D3DDevice->BeginScene();
- 7、应用视角
- g_D3DDevice->SetTransform( D3DTS_VIEW, &g_ViewMatrix );
- 8、改变世界矩阵(物体矩阵)模型
- D3DXMatrixTranslation(物体矩阵指针, 横坐标, 纵坐标, 竖坐标);
- 9、设置世界矩阵(物体矩阵)模型
- g_D3DDevice->SetTransform(D3DTS_WORLD, 物体矩阵指针);
- 10、绘制模型
- g_model->DrawSubset( 0 );
- 或者是创建纹理(图形):
- g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0, sizeof(stD3DVertex));
- g_D3DDevice->SetFVF(D3DFVF_VERTEX);
- g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
- 11、结束渲染
- g_D3DDevice->EndScene();
- 12、显示场景
- g_D3DDevice->Present(NULL, NULL, NULL, NULL);
- 记住:一定要在使用后释放所有空间,不然会出现内存泄漏。
- D3DX_PI是一个宏,它约等于我们所说的π。
这里有几个我的示例,都是我在开发程序的时候对D3DXMatrixPerspectiveFovLH()这个函数的实时调整从而得到的效果。
这是我用伪代码写的函数说明:D3DXMatrixPerspectiveFovLH(D3DXMatrix 投影矩阵的指针, FLOAT y轴可见的弧度,FLOAT 宽高比,FLOAT 近裁面,FLOAT 远裁面);
远裁面、近裁面不好用程序演示,因为那时我没有研究光照,所以我就画了一个示例图,希望大家能够理解。
然后的问题是怎样才能应用光照的效果?我这次主要查了《DirectX游戏开发终极指南》,使用了最简单的顶点光,应用了一下,还不错。下面就是我自己写的关于怎样创建光照的笔记,也算是伪代码吧。
- 创建Direct3D光照的方法:
- 1、创建灯源和材质对象:
- D3DMATERIAL9 g_material;// 材质
- D3DLIGHT9 g_light;// 灯源
- 2、打开光照
- g_D3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);// 开灯
- 3、建立灯源(例如)
- g_light.Type = D3DLIGHT_DIRECTIONAL;
- g_light.Direction = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
- g_light.Diffuse.r = g_light.Diffuse.g = 1;
- g_light.Diffuse.b = g_light.Diffuse.a = 1;
- g_light.Specular.r = g_light.Specular.g = 1;
- g_light.Specular.b = g_light.Specular.a = 1;
- 4、注册灯源
- g_D3DDevice->SetLight(0, &g_light);
- g_D3DDevice->LightEnable(0, TRUE);
- 5、为材质设定参数
- ZeroMemory(&g_material, sizeof(D3DMATERIAL9));// 养成好习惯,要为数据清零
- g_material.Diffuse.r = g_material.Ambient.r = 0.6f;
- g_material.Diffuse.g = g_material.Ambient.g = 0.6f;
- g_material.Diffuse.b = g_material.Ambient.b = 0.7f;
- g_material.Specular.r = 0.4f;
- g_material.Specular.g = 0.4f;
- g_material.Specular.b = 0.4f;
- g_material.Power = 8.0f;
- 6、开始渲染
- g_D3DDevice->BeginScene();
- 7、设置对象材质
- g_D3DDevice->SetMaterial(&g_material);
- 8、显示对象
- g_teapot->DrawSubset(0);
- 或其它
- 9、停止渲染
- g_D3DDevice->EndScene();