1 引 言
得益于现代计算机技术的高速发展,3D图形的应用领域日益广阔。无论是科学研究、工程设计还是影视娱乐、模拟仿真,3D技术都凭借其真实、直观、可塑性强等特点展现出强大的优越性。虚拟汽车驾驶是3D技术在汽车领域的一个重要应用。他采用图形仿真手段产生逼真的三维虚拟空间,驾驶员在虚拟环境中驾驶虚拟汽车,感觉就像是在操纵实车一样。
目前该技术最为常见的应用就是各类赛车游戏,配合制作精良的赛道环境,令人感觉身临其境。本文采用OpenGL语言构建了一个虚拟汽车驾驶仿真系统,重点研究了在虚拟汽车行驶过程中如何进行视点切换以及如何实现车身因路面的起伏而产生颠簸的效果。
2 算法流程
OpenGL是一个功能强大的图形系统软件接口,他允许程序员创建交互式程序,生成具有真实感的图像。图1是使用OpenGL实现虚拟汽车驾驶的流程图。
程序采用双缓冲的绘图方式。在显示当前帧的同时,计算机在后台计算汽车在下一帧中的位移、偏转角、视点的位置、视点的朝向以及由颠簸引起的车身偏转。计算好以后将这些参数传递给图形函数进行渲染,最后将渲染好的帧替换当前帧。
3 关键技
术
3.1 速度/方向的控制
本文的汽车采用的是一个由3DSMAX制作的吉普车模型。汽车的行驶方向由LEFT键和RIGHT键控制,前进和后退由UP键和BACK键控制。系统坐标采用右手坐标系。
假设在ti时刻,汽车的速率为vi,在x-z坐标系中,汽车的行驶方向与x轴正向的夹角为φi,汽车的位移为si={sxi,szi},那么在ti+1时刻,vi+1,φi+1和si+1可由式(1)得到:
3.2 视点切换
要实现三维场景中的虚拟驾驶,操作者的视点就必须随着汽车的运动不断地切换,以便实时地掌握汽车的运动状态以及所处的环境。OpenGL的GLU函数库提供了一个允许视点自由移动的函数——gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz),他的功能就如同一台摄像机。
{eyex,eyey,eyez}表示摄像机的位置,{centerx,cen-tery,centerz}表示镜头对准的方向,{upx,upy,upz)表示摄像机顶面的法向量。
由于本文的视点切换是在一个平面内进行的,因此{upx,upy,upz)可设为常量{0.0,1.0,0.0}。为了让汽车始终出现在我们的视野中,摄像机的位置必须不断地随汽车位置的变化而变化。本文的摄像机尾随在汽车背后,并始终保持一定的距离。
除了实时改变视点的位置,还必须实时改变视线的方向{centerx,centery,centerz)。当汽车沿直线行驶时,视线方向正对汽车的背面,如图2(a)所示。当汽车转弯时,如果视线方向还是始终正对着背面,真实感就会降低不少。因此在汽车的转角较大时,让车身在视野中产生一定的偏转,如图2(b)所示。转弯结束后,视线方向与汽车背面的法向量之间的夹角渐渐缩小,直到完全重合至图2(a)所示效果。
3.3 颠簸效果
汽车在高低不平的路面上行驶时会产生颠簸。为了模拟这种现象,首先必须绘制一个起伏的地面,然后再考虑汽车产生颠簸时的状态方程。
3.3.1 场景的绘制
场景的绘制采用天空盒的方法,地面部分略微有些起伏,以便配合汽车产生颠簸的效果。起伏地面的绘制采用网格化的方法。首先绘制一个平面网格,然后对网格上的各个交叉点赋予在一定范围内的随机高度值,就产生了起伏的效果。
3.3.2 车轮高度的确定
汽车在行驶的过程中,每个轮子的高度都会随着地面的起伏而变化,这是汽车产生颠簸的原因。假设某一时刻t,汽车的左前轮行驶至点s(sx,sy,sz)。其中sx,sz可以由式(1)得出,而sy则采用双线性算法来计算。图3为双线性算法的原理图。
P1,P2,P3,P4为S点所在网格的4个顶点,其坐标分别为(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),(x4,y4,z4)。P5,P6分别在P1,P3和P2,P4的连线上,其坐标分别为(x5,y5,z5)和(x6,y6,z6)。由这些点的几何关系,即可得到求sy的方程组:
3.3.3 车身的颠簸
车身的颠簸是由于车轮不在同一高度而产生的。在汽车行驶过程中,经常会出现4个车轮不共面的情况,而导入的3DS汽车模型的轮子始终处于同一平面。考虑到虚拟场景中地面的高度值是通过随机赋值得到的,无法保证车轮时刻共面,因此当4个轮子不共面时,就只能选取其中的3个轮子来确定车轮所在的平面。本文选取左前轮,左后轮和右后轮。假设在t时刻,这3个轮子的高度分别是Y1,Y2,Y3,如图4所示。
图4中,由左后轮指向左前轮的向量记为φ,由左后轮指向右后轮的向量记为ω,向量α为{0.0,1.0,0.0),他们和其余向量之间的关系是:
φ是向量α和β之间的夹角,且始终非负。显然,汽车围绕向量γ旋转φ°就可以实现汽车颠簸时产生的偏转。
4 实 验
我们在MS Visual C++6.0平台下,采用上述算法进行了实验。硬件配置为Pentium 1.73 GHz CPU,512 MB内存,一个带有64 MB显存的ATI X300图形卡。图5为该实验的截图。
5 结 语
实验结果表明,上述方法确实可以较好地在虚拟汽车驾驶中完成视点切换并模拟出汽车颠簸时的效果。当然,本文用于描述汽车行驶的方程过于简单,今后将在这一方面继续完善。另外,对汽车的外部操作将使用方向盘、油门等设备代替键盘,场景亦将复杂化,应力求虚拟效果更加真实可信。
(转载)