osg(osg中文社区)-osgEarth-osgViewer-基于OpenGL-开源三维渲染引擎-图形引擎-虚拟仿真工具-osg教程-osg仿真

航迹线实时绘制技术

当前位置:首页 > 学习支持 > 其他帮助 > 写作资料

飞行器在主动段、飞行段和着陆段过程中既有理论飞行轨迹也有实时飞行轨迹,理论飞行轨迹线可以在任务开始时就全部绘制出来,但是实时轨迹线需要在任务执行过程中通过接收飞行器数据来实时更新。绘制线图元是三维渲染中最基本的功能,但是在实时航迹线的绘制过程中,可能存在如下问题:

飞行器从主动段到飞行段再到着陆段,整个过程持续时间长,飞行距离大,如果将飞行器的每一次位置更新都作为一个新的顶点添加航迹线中的话,随着任务的进行,航迹线的顶点数量会变得非常巨大,导致对航迹线的后续操作效率低下,并且内存占用率高。针对这个问题,我们需要设计一种抽稀算法,在保证航迹线显示效果的基础上,尽量减少顶点数目。例如,在任务开始时,我们绘制飞行器的起点,然后在任务过程中,我们必需绘制飞行器最新一点的位置,保证航线的实时性,对于起点和最新点之间的历史航迹点,我们可以设置一个抽稀参数,比如每10个点一绘制或者100个点一绘制,通过调节抽稀参数来控制历史航迹的疏密程度,最后在显示效果、操作效率、内存占用中选择一个平衡点。

osg通过drawable类来管理包括线图元在内的所有可渲染对象,drawable类在创建时需要指定顶点数据,颜色数据等属性数据。drawable类在第一次渲染之前需要将指定的顶点数据构建为Vertex buffer object(VBO),即顶点缓冲区对象,顶点缓冲区对象存储在GPU中,在每一帧渲染时使用。当飞行器航迹线数据更新时,我们就需要修改drawable类的顶点数据,新的顶点数据想要产生效果,必需通知drawable类重新构建顶点缓冲区对象。由于飞行器航迹的更新频率高,并且随着飞行的进行,顶点数量越来越大,会导致航迹线的更新绘制效率越来越低下。因此,采用osg的drawable类来绘制轨迹线不能满足效率的要求,我们可以继承drawable类,重写drawable的绘制方法,通过OpenGL来提高效率。核心方法是利用glBufferSubData接口,该接口用来更新一个已有缓冲区对象中的一部分数据。我们可以在航迹更新时,将新的顶点数据保存为内存流,然后调用glBufferSubData接口,直接用新的数据替换原始数据,达到更新顶点的效果,以提升航迹线的实时更新效率。