|
在“使用M3G(JSR184)进行移动3D编程”入门指南系列的前四部分的基础上,Mikael Baros,Redikod的高级程序员,现在将指导你学习heightmap和地形渲染的基础知识。
下面是指南前四部分的链接:
l 第一部分:快速进入移动JAVA 3D编程世界
l 第二部分:光的3D理论与定位
l 第三部分:粒子系统和立即模式渲染
l 第四部分:M3G内建碰撞、光照物理学和照相机视点
介绍
欢迎来到M3G指南系列的第五部份。今天我将向你展示一种简单的技术,它几乎在所有的3D游戏中都用得到(以一种或者另外一种形式),heightmap
通过使用heightmap,设计者/开发者能够容易地创建自然地形(可能相当于使用一个花边噪音生成器,但不是必须的),几乎不花费时间。Heightmap的魅力在于它有一个复杂的概念,例如一个漂亮的现实的3D地形,则把这个问题简化为一个简单的2D图像。
和以前一样,无论什么时候你感到了困惑就参考这里。
首先,或许也是最重要的,就是在索尼爱立信开发者世界上专业的移动Java 3D网络区。其次,如果你碰到困难,就去索尼爱立信移动Java 3D论坛。对于其他的任何情况,使用索尼爱立信开发者世界网络门户,在那里你可以找到你的问题的答案,并且可以了解到更多。
预备知识
在通读指南的这一部分之前你应该已经阅读过前四部分,因为我将在这里使用前面已经写过的代码。
3D地形
我们先来对地形进行定义,好吗?地形是真实世界的一个模型,有平原、山脉、河流、悬崖和丘陵等。地形的要点就是给用户如在“真实”或者“现实”世界中漫步的印象。然而,如果从一个更加抽象的观点看,我们会很快的意识到地形仅仅是在高度上的变化。例如,一个草原就是一个高度为常数的地形(除了可能有一些起伏和山丘外)。一个山区就是一个具有很大高度变化的地形,在空地间创建鸿沟,如此创建山区的幻觉。一个河流就是由一个平原和穿过它的曲线组成,这个曲线比它周围的平原高度稍低。检查这张地形图:

如你所见,上面的地形由三块高一些的区域描述(三个灰色的山丘),剩下的是一个深深的峡谷,里面充满了水。此外,除了高度变化没有什么。
Heightmap
下面就是heightmap了。它们是存储高度变化的和使表面平滑的上好解决方案。在我开始讲解有启发的东西之前,现在我们观察这个图片。

这个一个灰度等比变化的图像。没有任何奇特的。它看起来像一个中间有个白色斑点的圆环。如此看来什么是一个灰色等比变化的图像呢?那么,简单来看,它是一个像素的集合,每个像素都是在灰度上从0到255上等比变化,0是黑色,255是全白。对吗?听起来很熟悉吧?那么如果你使用像素确定高度,如何?如果黑色的像素(值0)是最小的高度,白色的像素(值255)是最大的高度,如此你就有了一个描述高度的地图,heightmap!对此另外一个重要的事情就是,如果你只想模糊图像,因为像素是从0到255,所以你要对地形自动插补。
那么,你所有需要做的就是打开最中意的图像程序,使用画笔画一些白色素材,然后建立一个heightmap。这听起来很容易,当然,但是我们怎么样将它转化为可以渲染的网面呢?
Quad
将一个heightmap转化为可以渲染的网面一点都不难。我们需要读取heightmap的像素,然后创建由高度变化反应出的平面。在这个问题上一个非常易用的平面当然是Quad(四边形)。因为所有图像都是规则的矩形,四方形能够很好地适合他们。那么Quad是什么呢?很简单,一个Quad就是两个三角形放在一起形成一个矩形平面。

上面的图像代表了由两个三角形组成的一个四边形。如你所见,这个四边形有四个脱节的端点,因为我们使用了两个三角形描述它。四个角都被给予不同的高度,如此我们就开始了在3D世界中描述高度。然而一个四边形描述整个地形还是远远不够的,如果想要地形看起来有一点真实的感觉,需要很多四边形。我们稍后再来讲解这些,首先来看如何使用代码创建一个四边形。我们将在xz平面上创建一个有y变量的四边形,因而有变化的高度。我们为前篇指南中创建的MeshFactory类引入一个新的方法,叫做createQuad。这个方法需要知道的就是在这个四边形不同的角上有不同的高度,和选择标志。下面是这个方法的第一个片段:
public static Mesh createQuad(short[] heights, int cullFlags)
上一篇:EJB 3.0简介
下一篇:Spring中的持久性
|