设计DirectX游戏开头动画效果

设计DirectX游戏开头动画效果 作者:蒋轶民
 这个周末我刻苦钻研了两天加上一个晚上,终于把我的DirectX游戏开头动画效果做出来了。自己还是感到很高兴的。高兴之余,我发现我自己对纹理贴图的知识还是太匮乏了,必须要好好钻研才行。
 首先请大家看看。这是我程序的最终效果。

要是我自己评价的话,只能算是差强人意。因为最终我的方案改变了。因为自己对纹理贴图的知识很匮乏。不过在以后我有的是时间来进行这方面的研究。
 首先我研究怎样做这个程序的时候,遇到的问题是:怎样才能创建一个三维的物体,并且让它进行运动?这个问题也让我参考了很多的文献。包括了《DirectX游戏开发终极指南》、MSDN、GameRes.com和诸多强人的笔记。最终我在这些知识中总结了我的经验。下面以伪代码的形式展示给大家。

Code:
  1. 创建球体CreateSphere的步骤:   
  2. 1、创建投影矩阵   
  3.  D3DXMatrixPerspectiveFovLH(D3DXMatrix 投影矩阵的指针, FLOAT y轴可见的弧度,FLOAT 宽高比,FLOAT 近裁面,FLOAT 远裁面);   
  4. 2、转换投影矩阵   
  5.  g_D3DDevice->SetTransform(D3DTS_PROJECTION(设置投影矩阵的参数),D3DXMatrix 投影矩阵的指针);   
  6. 3、创建图形或纹理;   
  7. 4、定义三个视角   
  8.  D3DXVECTOR3 观察者(摄影机)视角(0.0f, 0.0f, -8.0f);   
  9.  D3DXVECTOR3 观看的点(0.0f, varB, varA);   
  10.  D3DXVECTOR3 默认向上的位置(0.0f, 1.0f, 0.0f);(如果是默认向下,可是设置(0.0f, -1.0f, 0.0f);   
  11. 5、建立视角矩阵   
  12.  D3DXMatrixLookAtLH(视角矩阵的指针, 观察者(摄影机)视角的指针,   
  13.   观看的点的指针, 默认向上的位置的指针);   
  14. 6、开始渲染   
  15.  g_D3DDevice->BeginScene();   
  16. 7、应用视角   
  17.  g_D3DDevice->SetTransform( D3DTS_VIEW, &g_ViewMatrix );   
  18. 8、改变世界矩阵(物体矩阵)模型   
  19.  D3DXMatrixTranslation(物体矩阵指针, 横坐标, 纵坐标, 竖坐标);   
  20. 9、设置世界矩阵(物体矩阵)模型   
  21.  g_D3DDevice->SetTransform(D3DTS_WORLD, 物体矩阵指针);   
  22. 10、绘制模型   
  23.  g_model->DrawSubset( 0 );   
  24. 或者是创建纹理(图形):   
  25.  g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0, sizeof(stD3DVertex));   
  26.  g_D3DDevice->SetFVF(D3DFVF_VERTEX);   
  27.  g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);   
  28. 11、结束渲染   
  29.  g_D3DDevice->EndScene();   
  30. 12、显示场景   
  31.  g_D3DDevice->Present(NULL, NULL, NULL, NULL);   
  32.   
  33. 记住:一定要在使用后释放所有空间,不然会出现内存泄漏。   
  34.   
  35. D3DX_PI是一个宏,它约等于我们所说的π。   
  36.   

 


 这里有几个我的示例,都是我在开发程序的时候对D3DXMatrixPerspectiveFovLH()这个函数的实时调整从而得到的效果。

这是我用伪代码写的函数说明:D3DXMatrixPerspectiveFovLH(D3DXMatrix 投影矩阵的指针, FLOAT y轴可见的弧度,FLOAT 宽高比,FLOAT 近裁面,FLOAT 远裁面);

 

远裁面、近裁面不好用程序演示,因为那时我没有研究光照,所以我就画了一个示例图,希望大家能够理解。


 然后的问题是怎样才能应用光照的效果?我这次主要查了《DirectX游戏开发终极指南》,使用了最简单的顶点光,应用了一下,还不错。下面就是我自己写的关于怎样创建光照的笔记,也算是伪代码吧。
 

Code:
  1. 创建Direct3D光照的方法:   
  2. 1、创建灯源和材质对象:   
  3.  D3DMATERIAL9 g_material;// 材质   
  4.  D3DLIGHT9 g_light;// 灯源   
  5. 2、打开光照   
  6.  g_D3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);// 开灯   
  7. 3、建立灯源(例如)   
  8.  g_light.Type = D3DLIGHT_DIRECTIONAL;   
  9.  g_light.Direction = D3DXVECTOR3(0.0f, 0.0f, 1.0f);   
  10.  g_light.Diffuse.r = g_light.Diffuse.g = 1;   
  11.  g_light.Diffuse.b = g_light.Diffuse.a = 1;   
  12.  g_light.Specular.r = g_light.Specular.g = 1;   
  13.  g_light.Specular.b = g_light.Specular.a = 1;   
  14. 4、注册灯源   
  15.  g_D3DDevice->SetLight(0, &g_light);   
  16.  g_D3DDevice->LightEnable(0, TRUE);   
  17. 5、为材质设定参数   
  18.  ZeroMemory(&g_material, sizeof(D3DMATERIAL9));// 养成好习惯,要为数据清零   
  19.  g_material.Diffuse.r = g_material.Ambient.r = 0.6f;   
  20.  g_material.Diffuse.g = g_material.Ambient.g = 0.6f;   
  21.  g_material.Diffuse.b = g_material.Ambient.b = 0.7f;   
  22.  g_material.Specular.r = 0.4f;   
  23.  g_material.Specular.g = 0.4f;   
  24.  g_material.Specular.b = 0.4f;   
  25.  g_material.Power = 8.0f;   
  26. 6、开始渲染   
  27.  g_D3DDevice->BeginScene();   
  28. 7、设置对象材质   
  29.  g_D3DDevice->SetMaterial(&g_material);   
  30. 8、显示对象   
  31.  g_teapot->DrawSubset(0);   
  32.  或其它   
  33. 9、停止渲染   
  34.  g_D3DDevice->EndScene();   
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值