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