会员: 密码:  免费注册 | 忘记密码 | 会员登录 网页功能: 加入收藏 设为首页 网站搜索  
游戏开发 > 程序设计 > 3D图形
自己动手编voxel 3D引擎
发表日期:2007-01-16 12:45:50作者: 出处:  

  “三角洲特种部队”系列相信大家都玩过,与大多数3D引擎不同的是它使用的voxel 3D引擎在真实感地形描绘上给玩家带来了全新的感受。其实voxel 3D引擎的原理并不复杂,我们完全可以根据其原理自己去实现。本文不涉及voxel 3D引擎的几何原理,仅对引擎的数据结构和框架做以介绍。关于引擎的几何原理可以参考我的主页,其中有我编写的引擎原代码下载和一个对引擎原理进行详细说明的英文站点链接,我的主页http://cproom.yeah.net

  
voxel 3D引擎的地形信息存储在一个数组中,此数组可以看作是一幅存储灰度数据的位图,位图的大小可以根据具体情况选择,我使用的是512*512的位图。位图中每一点处的灰度值代表该坐标处的地形海拔高度,越接近黑色则海拔越低,反之越接近白色则海拔越高。要使地形具有真实感,地形位图必须符合一些要求,主要是灰度数值的连续变化,距离越近的点灰度值越接近。其实地形位图非常容易得到,我们可以利用photoshop Render”特效的“Clouds”项,将前景设为白色,背景设为黑色,这样得到的图象可以表现出非常真实的地形效果。有了地形数据,我们接下来要为地表覆上色彩,颜色数据同样存储在颜色位图中,大小与地形位图相同,两张位图中的点一一对应,颜色位图中每一点处的颜色代表该坐标处的地表色彩。我们同样使用“Clouds”特效来生成颜色位图。由于山脉的颜色通常是绿色或金黄色,所以这一回将前景设为绿色而背景设为金黄色。颜色位图在载入内存时要做一下光照处理,有光照效果的山脉会更加真实。具体的做法是根据地形位图中对应点处地表与水平方向的斜率计算出一个亮度值,用此亮度值对该点处的颜色进行明暗处理,将处理后的颜色值存入内存中的颜色数组。最后的效果相当不错,我们已经有了voxel 3D引擎的基本资源文件,可以想象一下最终的效果了。地形数据和颜色数据的存储你可以选择熟悉的文件格式,我使用的是gif 文件格式。

地形位图

未做光照处理的颜色位图

512*512的位图到底能表现多大的地形范围呢?其实我们在处理的时候要将地形位图中的坐标乘以256,这样地形位图中每一点处的高度值代表我们所描绘的实际世界中256*256的正方形区域的高度,也就是说我们所描绘的真实面积是地形位图的65536倍,颜色位图也做同样的处理。这里不免使人迷惑,如此渲染出来的地形岂不是由大块大块的阶梯状平面所构成。的确是这样,只不过我们在处理时使用一些技巧,尽量避免表现出平面特征。我们所描绘的世界中的任何一点总是处于由地形位图中相临的四个点所构成的256*256的正方形区域中,这四个点的高度值代表着正方形区域四个顶点的高度,我们根据所描绘点在此正方形中的位置对四个顶点的高度进行线性插值,将插值得到的高度作为这个点的高度。进行插值处理后的地形会变得比较平滑。同样也要对颜色进行插值处理。由于颜色位图是经过光照处理的,再经过插值,得到的效果类似ground光照效果,将使地表显得更加平滑。

整个引擎的关键之处其实都在三个函数中,getAltitude()函数取得指定坐标处的地形高度值,getColor()函数取得指定坐标处的颜色值,在这两个函数中分别完成对高度和颜色的线性插值。render()函数调用前两个函数进行渲染,整个引擎的几何学部分都集中于此。对数学感到为难的朋友也不要害怕,render()函数只不过三四十行代码,所用的数学知识仅限于简单的三角函数和立体几何,最差也可以对着原码照猫画虎。最后将所有这些封装进一个C++类里,再加上对地形高度和颜色的抖动干扰处理,以表现出草地效果,以及使图象增色不少的天空效果,我们的引擎终于可以出笼了。

未采用线性插值的效果

加入所有效果的最终结果

后话:在中国,程序员大多在做数据库编程,对其它领域的关注较少,希望大家能关注游戏3D引擎的发展,早日把我们心中的幻想变成屏幕上绚丽神奇的虚拟世界。热切渴望与你交流,来信请寄email:cproom@163.net

返回顶部】 【打印本页】 【关闭窗口

关于我们 / 给我留言 / 版权举报 / 意见建议 / 网站编程QQ群   
Copyright ©2003- 2024 Lihuasoft.net webmaster(at)lihuasoft.net 加载时间 0.00259