张 侃
(山西交通职业技术学院,山西 太原 030031)
视景系统仿真是将可视化仿真技术用于各种模拟器的视景系统中,以产生尽可能真实的场景效果,它综合利用了计算机图形学、信息论、计算机视觉、图像处理、模式识别、软件工程等科技[1]。随着计算机技术和仿真技术的发展,结合虚拟现实的视景系统仿真在航空航天、军事、交通等领域的广泛应用,将对汽车驾驶模拟图形的设计与实现做了简单介绍。
单通道是按以下步骤完成:先创建了一个帧缓存、一个通道、一个视点、一个场景、多个实体对象、一个光源、一个雾化模型;再将实体对象、光源、雾化模型等添加到场景中;后将视点和场景同时加入到通道中;最后把通道加入到帧缓存中。完成后的单通道程序如下:
//定义单通道图形的帧缓存、通道、视点和场景等资源
GV_Fbf fbf;
GV_Channel parent;
GV_Camera eye_camera;
GV_Scene scene;
GV_Light sunlight;
GV_Fog fog;
//创建单通道图形的帧缓存、通道、视点和场景等资源
GV_fbf_create(&fbf);
GV_chn_create(&parent);
GV_cam_create(&eye_camera);
GV_scn_create(&scene);
GV_lsr_create(&sunlight);
GV_fog_create(&fog);
//设置单通道图形的帧缓存、通道、视点和场景等资源的名字GV_fbf_set_name(fbf,“FBF”);
GV_chn_set_name(parent,“汽车驾驶训练模拟器”);
GV_cam_set_name(eye_camera,“CAMERA”);
GV_scn_set_name(scene ,“SCENE”);
GV_lsr_set_name(sunlight,“SUN”);
GV_fog_set_fog(fog,“FOG”);
//设置单通道图形的视口大小和远近裁剪面
static GV_Viewport parent_vp={-1.0,1.0,-1.0,1.0};
static float far_clip=5000.0;
static float near_clip=1.0;
GV_chn_set_clip_near(parent,near_clip);
GV_chn_set_clip_far(parent,far_clip);
GV_chn_set_viewport(parent,&parent_vp);
//把视点和场景放入通道中
GV_chn_set_camera(parent,eye_camera);
GV_chn_set_scene(paent,scene);
//向帧缓存中添加通道
GV_fbf_add_channel(fbf,parent);
多通道图形显示中的各种资源间的层次关系(比单通道时)要复杂一些。整个视景系统软件采用帧缓存和一个驾驶员通道(driver)相连,驾驶员视点就设置在该通道中,并把整个视景系统的场景模型也放入这个通道,然后通过驾驶员通道与各个子通道进行连接[2]。每一个通道的视点和场景都与驾驶员通道的相同。整个视景系统经对帧缓存fbf树型结构的维护处理,完成整个系统的同步更新、访问控制、恢复系统功能等。
整个视景系统软件创建了一个帧缓存、一个驾驶员通道(驾驶员视野或者是挡风玻璃外场景通道)、两个子通道(后视镜和反光镜通道)、一个驾驶员通道视点、视景系统的场景模型,以及其中的对象实体、一个光照、一个雾化模型;先将各个对象实体、光照模型、雾化模型加入场景模型;后将视点和场景放入相应的通道,并把各个子通道添加到驾驶员通道中,最后把驾驶员通道连接到帧缓存中。多通道图形显示的程序如下:
//定义多通道图形的帧缓存、通道、视点、场景资源
GV_Fbf fbf;
GV_Channel driver_chn,rearview_mirror_chn;
GV_Channel viewfinder_chn;
GV_Camera driver_cam;
GV_Scene scene;
GV_Obi scene_model,skydome;
GV_Light sunlight;
GV_Fog fog_model;
//创建多通道图形的帧缓存、驾驶员通道、后视镜和反光镜通道、//驾驶员视点和场景模型等资源
GV_fbf_create(&fbf);
GV_chn_create(&driver_chn);
GV_chn_create(&rearview_mirror_chn);
GV_chn_create(&viewfinder_chn);
GV_cam_create(&driver_cam);
GV_scn_create(&scene);
GV_lsr_create(&sunlight);
GV_fog_create(&fog_model);
//设置多通道图形的视口大小和远近裁剪面
static GV_Viewport driver_vp={-1.0,1.0,-1.0,1.0};
static GV_Viewport rearview_mirror_vp={-1.0,-0.5,0.5,1.0};
static GV_Viewport viewfinder_vp={0.5,1.0,0.5,1.0};
static float far_clip=5000.0;
static float near_clip=1.0;
GV_chn_set_viewport(driver_chn&driver_vp);
GV_chn_set_viewport(rearview_mirror_chn
&rearview_mirror_vp);
GV_chn_set_viewport(viewfinder_chn&viewfinder_vp);
GV_chn_set_clip_near(driver_chn,near_clip);
GV_chn_set_clip_far(driver_chn,far_clip);
/
/把视点和场景放入各个通道中
GV_chn_set_camer(driver_chn,driver_cam);
GV_chn_set_camer(rearview_mirror_chn,rearview_mirror_cam);
GV_chn_set_camer(viewfinder_chn,viewfinder_cam);
GV_chn_set_scene(driver_chn,scene);
GV_chn_set_scene(rearview_mirror_chn,scene);
GV_chn_set_scene(viewfinder_chn,scene);
//将后视镜通道和反光镜通道与驾驶员通道连接起来
GV_chn_add_channel(driver_chn,rearview_mirror_chn);
GV_chn_add_channel(driver_chn,viewfinder_chn);
//设置后视镜和反光镜通道的状态
GV_chn_set_mirror_state(rearview_mirror_chn,G_ON);
GV_chn_set_mirror_state(viewfinder_chn,G_ON);
//把驾驶员通道放入帧缓存中
GV_fbf_add_channel(fbf,driver_chn);
现在,随着计算机技术的发展,硬件成本大幅下降,为汽车驾驶训练模拟器提供高性能价格比的硬件平台条件逐渐成熟。对于汽车驾驶训练模拟器而言,当前正处于一个技术转折点。采用新的技术途径,将汽车驾驶训练模拟器的性能提高一个档次,并在价格方面能被用户接受时,必能促进我国车辆培训水平的提高和交通状况的改善。
[1] 白燕斌,史惠康.OpenGL三维图形库编程指南[M].北京:机械工业出版社,1998.
[2] 吴斌,毕丽蕴.OpenGL编程实例与技巧[M].北京:人民邮电出版社,1999.