阅读指南.txt
上传用户:hkb425
上传日期:2007-06-16
资源大小:34191k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. 作者:3dExplorer
  2. 时间:2002-6-17
  3.                       代码阅读指南
  4. 主要内容:
  5.     1.阅读建议。
  6.     2.引擎结构。
  7.     3.主要算法。
  8.     4.引擎完善。
  9. 1.阅读建议
  10.      这是一个未经正规严格编程训练的人第一次公开他的源代码,请每一个
  11. 阅读程序的人将注意力放在理解引擎的算法上,并坚信自己能组织更佳的结
  12. 构、编出更精细准确的代码。
  13.      尽管我正在努力培养自己良好的编程风格,但遗憾的是,您所看到的代
  14. 码只有少量的注解。当我在编程时,总想尽快将算法实现,而不愿停下来加
  15. 上注释。如果您想通过程序来弄懂实现原理,即使我给每一行加上注释,聪
  16. 明的读者也要花费大量的时间来弄懂它。
  17.      我不希望您弄懂程序的每一个细节,深入的程度与花费的时间成平方关
  18. 系。核心的地形Render算法反反复复修改不下20次,尽管算法并不复杂,但
  19. 与LOD算法、地形贴图算法在程序中融合后,程序便难以理解。而且每次修改
  20. 后,可能会留下一些无用信息,这些东西给程序阅读造成了障碍。请原谅我没
  21. 有充足的时间整理这些代码。
  22. 2.引擎结构
  23.      在不包地表贴图制作工具情况下,引擎共包含128个文件。其中有60个文
  24. 本文件,超过10000行代码。
  25.      一个最简单的、基于OpenGL的、什么都不干的、能够正确运行的程序框架
  26. 由3dExplorer.cpp、cgl.h、cgl.cpp组成。熟悉win32编程的人对于3dExplorer.cpp
  27. 是非常容易理解的,其中InitEngine()初始化引擎,DrawGLScene()完成场景
  28. 的绘制。cgl类负责OpenGL的初始化,对于熟悉OpenGL的人,这个类是很好理解的。
  29. 如果你用D3D,那么只要知道这是用来初始化图形环境就可以。在DrawGLScene()
  30. 中有:
  31.       m_cHeightmapScene.RenderHeightmapScene();
  32. 绘制场景的任务全交给了CHeightmapScene类。
  33. CHeightmapScene类负责管理整个场景,只有两个成员函数:
  34. //初始化场景
  35. bool    InitHeightmapScene(INPUT *pInput);
  36.         //绘制场景
  37. void    RenderHeightmapScene();
  38. 再看看CHeightmapScene中的成员变量:
  39. INPUT         *m_pInput;       //保存键盘按键状态
  40. CTerrain       m_cTerrain;     //负责画地形三角形
  41. CSkyBox        m_cSkyBox;      //负责画天空盒
  42. CLensFlare     m_cLensFlare;   //负责画太阳光晕
  43. CSpriteManager m_cSprites;     //负责画动画模型(精灵、人物)
  44.         CHouse         m_cHouse;       //负责画建筑物(MS3D模型)
  45.         CText          m_cText;        //负责显示文字信息
  46. C3dE           m_3dExplorer;   //负责接受输入与视图变换
  47. //CHeightmap中有很多其他类都需要用到的静态数据成员
  48. CHeightmap     m_cHmap;
  49. 现在你看到的是引擎的大框架,也许用一张图来表示会更好,但我相信你脑中已经有
  50. 一幅清晰的结构图。如果要继续完善引擎,这个结构不需大的改动,因为它简单、清晰、
  51. 容易扩展。
  52. 3.主要算法
  53. CTerrain类(Terrain.h、Terrain.cpp)包含了引擎最重要的几个算法:
  54. 视野剪切、去除山坡后的三角形、LOD、地形无限重复、地表贴图
  55. 这些算法融合在一起使这部分程序变得非常难理解。而且这些算法基本上是我自创的,
  56. 你很难在别处找到类似的实现。
  57. 视野剪切:我并没有使用QuadTree来完成FrustumCull,而是根据视野范围直接排除不
  58.          在视野内的三角形,cFrustumCull成员负责得到视野的多边形描述。
  59. 去除山坡后的三角形:为了描述方便,假设视野剪切得到一个等腰三角形,视点为一
  60.          顶点,从视点出发,连一条到对边的直线,根据地形起伏的斜率判断连线上
  61.          的点是否可见。
  62. LOD:每个单元包含5x5 个顶点,与一般的地形LOD不同的是,它可达到7级(一般为5级)
  63.          但是它不能随便调节精度,这考虑到三角形不是连续画的,因为山坡后的
  64.          三角形没有画,也没有根据距离计算它的LOD精度,固定LOD精度的好处是,保
  65.          证不会出现裂缝,而且速度快。精度信息记录在lodmap.lod文件中。如果需要
  66.          调节精度,多做几个lodmap.lod文件就可以。
  67. 地形无限重复:基本的地形图为ter256.bmp,地形无限重复就是将基本地图像拼地砖
  68.          一样拚接,特别注意基本地图中的坐标与逻辑坐标的关系。
  69. 地表贴图:由一幅沙地图片与一幅草地图片得到地表的贴图,两种地表由4幅过渡图衔接
  70.          起来,4幅图产生16种不同的衔接方式。texindex_64.bmp记录了草地分布状况。
  71.          它根据ter256.bmp计算得到。
  72. 我的打字速度、表达能力、时间、算法的复杂性限制了我对算法的描述。我有点累了。
  73. 4.引擎完善
  74. 我只完成了引擎的70%,剩下的任务有:
  75. 武器破坏系统
  76. 碰撞检测
  77. 花草树木
  78. 人工智能。
  79. 网络互联。
  80. 河流、湖泊
  81. 几个爆炸在一起时可能出现问题,因为没有按从远到近的顺序画爆炸效果。
  82. .....
  83. 目前,我在学习室内引擎制作,希望能将这个引擎做成室内/室外混合型引擎。
  84. 欢迎任何人加入引擎开发,如果你愿意使用我的代码,通知我,让我高兴一下。
  85. 如果有任何建议也告知我。
  86. 联系:
  87. hunter3d@263.net