1, 引言:
当前在许多导航类产品中地图引擎的使用已经很多见了,特别是随着近些年硬件技术的发展,加上许多三维的图形绘图软硬件库的支持,使得三维地图引擎的使用也变得比较常见了。对于一款好的产品,三维地图引擎中的地形跟踪算法是一个不可或缺的环节。
本文的目的是想介绍一种三维地形跟踪算法,以及在程序中的具体实现过程。使得人们对地形跟踪算法有深入了解,从而能够更好的掌握三维地图引擎开发的原理和本质。
2, 地形跟踪算法分析与设计:
2.1、三维地形跟踪简介:
在现实世界中我们每当观察一个物体时都会有视线的概念存在。我们所处不同的位置,向着不同的方向,看出去的物体景色都是不一样的。比如同是一座山,你在山脚下和坐在飞机上看出去的内容是不同的。所以地点的选择决定了眼中看到的事物。
所谓的地点,在三维的数字化世界中我们可以虚拟成一个坐标,一系列连续坐标的组合便形成了一条跟踪的轨迹,而这个过程也称为是三维地形跟踪的过程。
三维地形跟踪的方式有很多,我们通常用跟踪算法模拟出需要的地形跟踪方式。比如飞机、船只、汽车等等。不同的物理模型实现的地形跟踪算法也是不同的。比如同样是车,卡车和自行车所模拟出的感觉是不一样的;同样是船,快艇和油轮的行驶感觉也有区别。一套完善的物理模型在三维地形跟踪算法中很重要。
2.2、三维地形跟踪算法的设计思路:
在本文中我们想模拟出的是最基本的地形跟踪方式:贴着地形进行运动。只要不出现视线穿越物体的情况并且尽量贴近地形即可。我们采用山地地形,地形有一定的起伏,但幅度并不是很大。
我们使用相机来表示玩家的视点,相机前面是预先渲染好的地形。玩家驾驶的汽车必须在地表前进,不能穿越地面,因此需要计算相机所在的地形高度,并将视点相应的往上移。如下图:
通常的做法是取当前位置所在单元格内的四个点的高度平均值作为相机的高度,也就有如下的公式:
高度 = k*(V0+V1+V2+V3)/4
其中V0到V3代表单元格四个顶点的高度,k代表缩放系数。
咋一看这种方式还是比较理想的。但是细一想就会出现问题:我们所在的单元格其实是由两个三角形组成的,而由于地形的关系这两个三角形可能不是在一个平面上,四个点的高度值也可能相差较大。使用四点高度平均之后的高度值时,当我们从高度低的位置向一个高度比较大的位置移动时,会产生平均高度值小于当前位置的实际高度值的情况,也就会看到穿越地形的现象发生。这在现实中最常见的情况就是我们从山脚下向一个很陡的山坡上行进时,由于高度的巨大差距造成了我们看到的景象一下子穿越了地形。
在实际的三维地形使用过程中,如果遇到了穿越地形现象的发生肯定是不能允许的。所以我们可以使用一种改进的方法加以改善。上面的算法是将相机所处单元格四点的高度取平均值,改进之后我们可以把单元格中的两个三角形各看成一个平面,因为组成三维地形图最基本的单元便是三角形,至于三角形如何划分可以遵循给出的数据内容。具体的操作流程可以这样:
1) 判断相机位置处在单元格的哪个三角形中。
2) 将相机所在的三角形组成一个新的矩形平面。
3) 求相机所在该平面的高度。
4) 将该高度设为当前相机的高度。
其中的难点是如何求相机所在矩形平面的高度。
在三维坐标中,矩形四点的高度并不一致。也就是说矩形平面可能不平行于任意两个坐标轴组成的平面。我们可以先将相机坐标投影到矩形的两条直角边上,然后再求投影坐标的高度。求出两个值之后,我们选择其中较大的一个值作为当前相机点的高度值。平面图是这样的: