基于RTT的三维模型标签实时显示技术
2015-10-26田壮聂芸
田壮+聂芸
摘 要: 针对三维模型标签的显示,分析已有处理的不足,提出一种基于RTT(Render To Texture)的三维模型标签实时显示的解决思路:在三维模型上确定显示标签的目标区域,用RTT相机对标签预渲染到帧缓存中,从帧缓存中提取出二维纹理映射到三维模型上的目标区域,采用OSG(Open Scene Graph)实现对三维模型标签的实时显示,具有良好的真实感。
关键词: OSG; RTT; 三维模型标签; 实时显示
中图分类号: TN911.73?34 文献标识码: A 文章编号: 1004?373X(2015)20?0055?04
RTT?based real?time display technology of 3D model label
TIAN Zhuang, NIE Yun
(North China Institute of Computer Technology, Beijing 100083, China)
Abstract: For the display of 3D model label, the insufficient of the existing processing is analyzed, and a new solution of 3D model label real?time display based on render to texture (RTT) is proposed. The target area of display label is determined on the 3D model, and the label is pre?rendered into the frame?buffer by RTT camera. The 2D texture extracted from frame?buffer is mapped to the target area on 3D model. The real?time display of 3D model label was realized by using open scene graph (OSG), and has good reality sense.
Keywords: OSG; RTT; 3D model label; real?time display
0 引 言
三维虚拟环境是利用虚拟现实技术构建的某一区域真实而全面的可视化描述,集成了地形、地貌、河流、海洋、气象等自然环境的虚拟展现,并提供了相关态势的准确表现,是军事、公共安全、市政等各种应用的重要辅助平台。
在复杂的虚拟三维环境中,因为目标繁多,无法对重复的目标建立特有的三维模型[1],所以同一类的虚拟场景的目标使用相同的模型,导致了同一类目标无法具体区分,容易造成混淆,如一个飞行编队中的战机无法从模型上区分,而实际中的各种模型在表面都有明确的不同编号及辅助信息。针对这类问题,一般的解决思路有[2?4]:
(1) 在使用3DMax等建模软件建模时,直接把编号信息建在模型上,固定在一个确定的位置上。其缺点是用户应用中无法改变编号信息的位置和信息内容,可用性差。
(2) 在三维建模时,需要预留位置标志,用户在应用中修改模型的相关信息。其缺点是用户要对三维模型的内部结构预知,灵活性不足。
(3) 在模型上方加一个独立的标签用来显示编号信息,从视觉来看是两部分,真实感有一定的缺失。
本文通过RTT技术实现了标签在三维模型上的实时显示,在视觉上标签与三维模型融为一体,与现实世界真实情况相一致,真实感较强。增强了三维模型的信息承载能力。
1 OSG及RTT
OSG是一个开源的场景图形管理开发库,主要为图形图像应用程序的开发提供场景管理和图形的渲染优化功能[5]。使用已经成为工业标准的OpenGL底层渲染API。因此OSG具备跨平台性,可以在Windows,MAC OS和大多数类型的Unix和Linux操作系统上运行。在OSG中大部分的操作可以独立于本地的GUI。与工业标准和其他图形库相比,OSG的优点显而易见,它的封装并提供了数量众多的提升程序运行时性能的算法,针对包括分页数据库在内的几乎所有的主流数据格式之间的数据接口。
OSG纹理映射技术是把纹理图像映射到物体表面,即在一个平面区域(纹理空间)上预先定义出纹理图案,然后建立物体表面空间和纹理图案坐标之间的映射关系,当物体表面的点确定后,就可以根据纹理空间对应点的值将纹理图案附到物体的表面上,纹理映射的一般步骤如图1所示。
图1 OSG纹理映射技术
OSG中主要有以下几种图形渲染时用到的缓存:Frame Buffer,Frame Buffer object,Pixel Buffer Object,Vertex Buffer object。其中FrameBuffer相当于一个本地的缓存集合,包括颜色缓存、深度缓存、模板缓存、累计缓存,用于存放每帧的渲染数据。Frame Buffer object是OpenGL的一个高级扩展,提供一种渲染到目标的新机制,提供了与Frame Buffer同类型的离屏渲染操作对象,可直接控制管线最终渲染数据的去向,分配的空间在显存中,用Frame Buffer object来对显存进行实际GPU运算的交互操作效率较高,主要用于显存内部数据的转换、交互、操作的场合。基于OSG的RTT(Render To Texture)[6?10]技术就是通过预渲染一个子场景。RTT相机用于预渲染子场景,将子场景渲染结果(存储在Frame Buffer中)通过纹理的方式直接读取,然后可以作为纹理贴图贴在主场景中的目标位置,这样可以在很大程度上提高渲染的性能,避免从FrameBuffer中拷贝纹理对象。基于OSG的RTT一般步骤如图2所示。
图2 基于OSG的RTT技术
2 三维模型标签处理流程
三维模型标签的处理流程设计如图3所示。
图3 基于RTT的三维模型标签实时显示系统设计
从三维模型数据库中读出三维模型,可以进行鼠标交互生成标签或者读取Json文件生成。
实现三维模型标签实时显示的步骤如下:
第1步:加载三维模型,如果通过Json文件加载标签执行步骤第7步,否则执行第2步。
第2步:在三维模型中通过鼠标交互选择标签的目标区域;虚拟了RTT相机,投影到三维模型,方便用户选择标签位置。
第3步:输入标签的信息内容,根据标签内容(即:虚拟三维场景中的目标编号信息及其他辅助信息)生成二维文字。
第4步:二维文字添加到子场景,使用RTT相机预渲染子场景生成二维纹理。
第5步:设置纹理映射。
第6步:显示三维模型及标签,执行第8步。
第7步:读取Json文件生成。如果不是第一次加载这个模型,那么可以选择该模型对应的Json文件,可对Json文件中的标签内容进行更改然后直接进行绘制和显示,避免了对于模型目标区域的重复操作。如果要修改标签的位置则转到第2步。
第8步:保存和标签有关的数据(如:虚拟投影摄像机的位置)到Json文件,方便下次调用时进行直接绘制或输出到其他三维显示系统中。
3 基于RTT的三维模型标签实时显示相关实现
这里重点介绍基于RTT的三维模型标签实时显示的相关实现。
3.1 标签目标区域
标签目标区域用于显示三维模型的编号信息。目标区域的选择:主要为用户提供目标模型的选择,这里提供了虚拟的RTT相机投影,方便用户对模型区域的选择。用户可以通过鼠标交互调整虚拟RTT相机的位置选择用于显示三维模型编号信息的区域。如图4所示。
图4 虚拟的RTT相机投影
目标区域的生成:在用户选择好了目标区域后(即虚拟RTT相机所对应的模型位置),需要生成一个与虚拟RTT相机投影区域大小相同的透明四边形面片用来标明模型的编号信息,并且可以设置面片的细分度;在凹凸不平的模型表面,生成细粒度的四边形面片;在较为平滑的曲面生成粗粒度的面片以减少运算量。生成方法:通过虚拟RTT相机的视点坐标向模型发射线求交,返回交点作为构建四边形面片的点。
3.2 标签文字
在OSG中,OSGText提供了向场景中添加矢量文字的强大渲染功能,由于第三方插件FreeType的支持,它完全支持TureType字体,实现了文字的无极缩放,良好的抗锯齿能力等。OSG专门定义了一个命名空间来管理文字的渲染,控制文字各种渲染属性的设置。
在OSG中文字显示的机制:创建一个Font对象读取字体文件,把Font与对应的文字相关联,创建绘制字符串图形的纹理贴图。
在文字渲染时,文字会根据字符的形状生成纹理坐标,并为每个字符绘制一个已添加纹理的四边形。本文的文字添加步骤如下:
(1) 创建一个Font对象并读取字体文件。
(2) 创建一个osgText::Text对象,设置文字的属性,同时关联字体,程序为用户提供了字体的选择。如果在场景中显示中文,需要将中文转换为宽字符。
(3) 调用addDrawable()方法将步骤(2)的osgText::Text实例对象添加到一个Geode实例,然后添加到场景进行渲染。
3.3 RTT相机的OSG节点组成及设置
本文通过RTT技术实现将子场景中的二维文字实时渲染到主场景的二维平面的功能,实现方式是在一个场景上创建一个覆盖图,这张覆盖图的生成是通过预渲染一个子场景(已生成的二维文字)到这张贴图上,最终将纹理贴图贴到主场景上,而投影的位置是通过三维模型标签的目标区域预先确定的。
渲染场景树的节点组成如图5所示。
图5 场景树
在场景的根节点下有两个子节点:一个是osg::Camera对象用于RTT 相机,在RTT Camera节点下添加已经生成的二维文字作为子场景,然后定义一个二维纹理对象osg::Texture2D用来从子场景中提取二维纹理,最后定义一张二维纹理贴图osg::Image,作为覆盖图用于存储二维纹理;另一个是场景组节点,添加了三维模型和承载三维模型标签信息的四边形面片。
RTT相机设置如下:
//纹理宽度TextWidth、高度TextHight
camera?>setViewport (0,0,TextWidth,TextHight);
// Image为纹理关联的图像
camera?>attach(osg::Camera::COLOR_BUFFER,
Image.get());
//Camera投影设置
camera?>setProjectionMatrixAsOrtho2D(?TextWidth,TextWidth,?TextHight,TextHight);
camera?>setReferenceFrame(osg::Transform::ABSOLUTE_RF);
//bs为三维模型的包围球
Camera?>setViewMatrixAsLookAt(bs.center()?osg::Vec3(0.0f,2.0f,0.0f)
*bs.radius(),bs.center(), osg::Vec3(0.0f,0.0f,1.0f));
camera?>setClearMask(GL_DEPTH_BUFFER_BIT);
camera?>setRenderOrder(osg::Camera::PRE_RENDER);
camera?>setRenderTargetImplementation(osg::Camera::PIXEL_BUFFER_RTT);
4 实验结果
实验模型一使用武装直升机模型,根据真实的装备编号信息生成二维文字,然后映射到直9武装直升机模型上(图6(a)部分来源于互联网)。效果如图6所示。
图6 真实图片和实时绘制的编号
实验模型二使用波音737模型,根据飞机的飞行速度实时在机身上显示时速。效果如图7所示。
图7 飞机模型时速显示
5 结 语
本文采用RTT技术,实现了三维虚拟场景中三维模型的具体编号及相关数据的实时显示,效果较好。需要进一步完善:多个标签(飞机的双侧)、图标与文字的组合显示(民航客机)、字的轮廓显示样式等问题。
参考文献
[1] 李剑功,孙延明,赖朝安.基于Java3D的不规则曲面纹理贴图的研究[J].现代制造工程,2007(1):41?43.
[2] David F Rogers.计算机图形学算法基础[M].北京:机械工业出版社,2002.
[3] 程晓筝,李震霄.一种基于表面积比例的地形纹理贴图算法[J].计算机仿真,2007,24(8):174?177.
[4] CATMULL E. A subdivision algorithm for computer display of curved surfaces [D]. Salt Lake City, University of Utah,1974.
[5] 肖鹏,刘更代,徐明亮.OpenSceneGraph三维渲染引擎编程指南[M].北京:清华大学出版社,2010.
[6] 杨石兴.OpenSceneGraph程序设计教程[EB/OL].[2008?10?26]. http://www.docin.com/p?1055452878.html.
[7] OpenSceneGraph. User guide [EB/OL]. [2011?03?15]. http://www.opemsceneGraph.net.
[8] SHREINER D. Open GL编程指南[M].李军,译.北京:机械工程出版社,2010.
[9] 邱飞岳,赵柏乐,张维泽,等.基于投影纹理映射的球面斜投影校正方法研究及其应用[J].中国生物医学工程学报,2012,31(2):687?702.
[10] GOLDMAN R. An integrated introduction to computer graphics and geometric modeling [M]. London, CRC Press, 2011.