3.3 回调机制
GVS初始化后,在应用程序的运行时部分程序代码必须每一帧调用一次GV_sys_proc(),目的是为了更新和生成图形用户决定什么时候进行初始化、运行和关闭活动。这些都以回调用户函数的形式机械运作。许多OpenGVS工具,包括系统工具,能在OpenGVS执行它们时回调用户函数。除系统工具回调外,大部分其它回调是完全随意的。通常,此函数从主程序调用(或由从主函数调用子函数,如果你使用默认的GVS设置)。它负责协调运行时OpenGVS内部软件通道执行流。函数GV_sys_proc()可在应用软件中的任何有意义的地方调用,但其只能在OpenGVS初始化之后。应每一帧调用它一次,并要在你已经完成所有耗时的初始化活动之后。每一帧,GV_sys_proc()安排所有需要的工具运行,包括用户回调。为了帮助用户同步化数据流,理解GVS执行用户函数的顺序很重要。下面是每一帧GV_sys_proc()调用所有激活的用户函数(等于调用各个内部函数):
•除非用户重新安排,典型地,为操作系统窗口管理器相关事件调用将GV_user_events().
•除非用户重安排,典型地,从GV_sys_proc()回调主要用户运行时控制函数。
•回调任何用户对象仿真函数(由GV_obi_set_sim_callback()安排)
•回调任何激活的用户相机仿真函数(由GV_cam_set_sim_callback()安排)
•回调任何用户通道仿真函数(由GV_chn_set_sim_callback()安排)
•图形处理起点回调(若有,由GV_chn_set_startframe_callback()安排)
•所有从GVS对OpenGL图形相关回调和用户图形相关回调。
•图形处理末尾回调(若有,由GV_chn_set_endframe_callback()安排)
如上所述,对OpenGL的图形回调只能在通道处理的开始和末尾去做。另一方面,可在任何地方做OpenGVS回调,但对于复杂的应用软件,用户应小心保持其数据(如用户对象或相机的运动或定向)每一帧的同步性。
4 与MFC窗口集成
OpenGVS自带的例子都是基于控制台的,相对于MFC来说,开发效率比较低,因此把OpenGVS 与MFC结合起来可以大大提高开发效率,与MFC集成的方式主要有两种,第一种是分别制作MFC多媒体程序和OpenGVS程序,利用Windows消息机制在两者之间传递信息,第二种方法是在一个程序中将OpenGVS的显示窗口放到MFC窗体中。第一种方法的优点是程序实现简单并且结构清晰,但其缺点是两个程序间不容易同步。更重要的是,过多的窗口不利于管理并且视觉效果差。第二种方法能够提供更优秀的窗口布局和集成度,并且非常便于用户使用。因此,我们选择第二种方法实现实现两者的集成。整体程序设计使用MFC进程和OpenGVS进程共同实现。MFC进程负责窗口显示和Windows消息处理,OpenGVS线程则负责场景数据的管理和图形的显示。拥护执行MFC程序会启动整个系统,MFC程序在其显示区(DC)绘图程序(void CView::OnDraw)中通过AfxBeginThread()方法创建OpenGVS进程。OpenGVS进程成功创建后,开始进行系统初始化和模型读取。并且负责将显示窗口集成到MFC的图形窗口中。MFC程序响应鼠标键盘等事件,并设置相应的变量,OpenGVS线程会通过定义外部变量的方式读取这些变量并且做出响应[2]。当窗口关闭时,程序也会通知OpenGVS线程退出。这样我们就可以在VC环境下通过MFC开发OpenGVS软件系统大大提高开开发效率。
5 开发中的关键技术
5.1场景导入
OpenGVS不支持底层的图形生成,但可以在OpenGVS中嵌入OpenGL ,OpenGVS自身不定义低层渲染函数,它直接支持许多不同数据格式的模型,包括Terrex TerraPage.MultiGen Open Flight (*.flt).Wavefrontobi(*.obj)、3D Studio binary file (*.3ds) 和Internal encrypted OpenGVS database file (*.gvm)。为了在程序中应用这些模型, OpenGVS 提供的import命令就可以直接识别和导入模型。例如对地形模型的导入命令如下:Import file=terrain.flt name=TERRAINstruct=on此处表示将导入文件名为terrain.flt(当前路径下)的地形模型,并且为该模型命名为TERRAIN,struct=on表示需要控制模型的层次结构。其中关键字name和struct为可选项。此外OpenGVS 还提供了如关键字为geometry(模型的几何信息)等等的可选项。import导入命令行一般放在自己创建的名为gvsinit.gvs 的只读文本文件中。在默认情况下,任何OpenGVS应用程序运行时,OpenGVS自动在当前工作目录下查找文本文件gvsinit.gvs,然后直接运行文件中的import 命令行。另外,也可以于程序代码中在GVS提供的函数GV_cmd_service中运行import导入命令行,例如导入飞机模型:
int status;
status=GV_cmd_service(import file=t1.flt name=city);
其中函数运行成功返回0,,否则返回-1。
输入工具(Import Facility)负责将在GVS外定义的数据库模型输入对象定义(Object Definitions),随后用于视觉应用中。数据库模型一旦输入仅需两行代码就能将输入工具创建的每一个对象定义实例化,然后加入到场景[3]。
5.2 场景漫游
在三维场景中,如果能象电影导演那样,开关任意数量的相机,就可以更好地控制显示应用程序的动态视景。借助于OpenGVS 的一种重要软件资源——相机,来实现动态视景的控制显示[4]。有时也把相机简单称作“视点”。创建相机之后,OpenGVS设置的相机缺省位置为世界坐标系的x-y-z位置{0.0,0.0 ,0.0}。论文格式。简单相机,包含单一相机平台。但对于某些复杂的视景需要,例如俯视,仰视,或相对于一个特定点偏移与定位相机,就需要为相机创建额外的分层控制平台。每个相机可以分层为一个或多个平台,每个平台都有自己的x,y ,z位置与转角,一个平台相对于另一个平台定义。例如,要保证飞机上飞行员在飞机飞行过程中(特别是特殊姿态时,如俯冲、降落等) 所观察到的视景与实际相符,正确设置飞行员视点很关键。所以,创建分层相机平台,base(0)设置在飞机重心处,平台(1)相对于(0)定义,设置在飞行员处。用OpenGVS实现为:
#define BASE PLATFORM 0
#define DESIGN EYE PLATFORM 1
static GPosition offset ={-1.0,11.0 ,-35.0};
GV_Camera camera_pilot;
GV_cam_create(&camera_pilot);
GV_cam_set_name(camera_pilot,”PILOT”);
GV_cam_add_platforms(camera_pilot,1);
2/3 首页 上一页 1 2 3 下一页 尾页 |