当前位置: 首页 > 范文大全 > 公文范文 >

基于OSG的校区漫游系统设计与实现

时间:2022-03-22 09:18:35  浏览次数:

摘 要:虚拟现实(Virtual Reality)技术是近年来一项十分活跃的研究与应用技术。它的应用领域十分广泛,主要在工程设计CAD、遥控机器人学、数据可视化、飞行模拟、多媒体远程教育、临床外科、远程医疗、艺术创作、游戏、娱乐等方面。虚拟现实技术给现代生活带来了很大的帮助,运用虚拟现实技术构造的虚拟世界可以模拟现实环境,以便帮助用户方便地研究现实中各种问题,从而大大降低研究成本。

关键词:虚拟现实;三维建模;OpenSceneGraph;路径漫游

DOI:10.16640/j.cnki.37-1222/t.2017.18.242

1 引言

本文以某校区实际的校园环境作为原型,设计完成了某校区的漫游系统,并完成了最后的功能测试。首先构造可漫游的虚拟场景是虚拟现实中最基本的一个环节,本文从构造虚拟场景的一般步骤出发,阐述了三维建模的技术与方法并在平台上加以实现;后用基于三维渲染引擎OpenSceneGraph场景图进一步的开发,运用Visual Studio C++和OSG混合编程,实现了系统的漫游功能。

2 三维建模技术

3DS MAX是专业的三维建模软件,是建模,渲染及动画制作的集成软件包。windows操作系统和Pentium处理器的强大功能与灵活性,使它在pc机上实现了工作站的性能和特征[1]。它具有高扩展性、丰富的功能和面向对象的结构,并且它支持多处理器系统和硬件加速等。

3DS MAX最基本的功能是三维模型几何体的建立, 3DSMAX的强大功能还包括它提供的材质编辑器。同时3DSMAX还提供了摄像机,各种灯光,阴影,植被等辅助对象。在本场景中,利用3DSMAX的基础建模工具,建立基本模型框架,然后对模型进行纹理映射,得到一些基本的建筑模型。

虚拟校区的构建先是要获取建筑物的所有数据,获取数据后要初步处理所采集的数据。除去多余的数据,把纹理图片进行PS处理,同时保持原有数据的精度,统一纹理图片格式,把数据进行整理分类等,最后整合按照统一的格式存入数据库,利用这些数据就可以构建某校区虚拟楼群建筑模型以及地形模型。在本文里虚拟校园的三维模型构建流程如图1所示:

本文依据获取的某校区平面规划图,确定好模型的重要程度和位置次序,依次在相应的位置建模。在这个三维场景中所有物体尺寸与模型尺寸比例是1:1,主要步骤有[2]:

(1)通过采集到的建筑图纸,包括剖面图、立面图、建筑效果图及平面图获取建筑物的建模数据。(2)最终确定建筑物模型的结构。对于大多数房屋来说可以建立基本的几何体模型,然后给这些几何体添加材质属性,对于一些较复杂的建筑物采用高级建模方法多边形建模技术。(3)开始建模。按照前两个步骤所确定的方案,根据模型自有的尺寸大小开始建立模型。建模的原则是要快和省。尽量对模型外部能看到的部分建模,那些在里面不需要用到的面可以删掉或者不建模,原则上尽量用少的面表示建筑物模型,对于能合并的面尽量合并。

建筑物的实体部分采用几何体建模,设置多个长方体、柱体等建立楼房的实体部分,然后通过不断调整整合设置,使之符合设计的要求。另外校园里多数的屋顶都是斜坡状,是不规则的形状,对屋顶的建模采用多边形建模,先建立一个长方体,然后转换为可编辑多边形进行挤出调整得到房屋的屋顶。

尽管在建模时尽量不建立多余的多边形,但是建模过程中难免会产生多余的面,最后一步就是要去除多余的多边形,楼房的底座和楼层之间的连接面都要去除,这样可以降低场景复杂度,在以后的渲染中也会节省不少时间。

某校区的整体模型如图2:

在纹理映射部分,需要对已经采集到的数据进行整理分类,并通过软件处理,获取符合要求的纹理图片,对模型对象进行纹理映射,设置好UV,指定贴图通道,为每个建筑物加上纹理图片。

3 基于OpenSceneGraph三维引擎的场景漫游实现

OSG场景图结构封装并提供了数量众多的提升程序运行时性能的算法、及几乎所有主流数据格式的直接数据接口,使用众多编程语言进行图形系统的开发。在此基础上,结合微软提供的MFC类库,利用VC++ 2005编程实现了系统的漫游功能,碰撞检测,自然天气模拟和当前对象的查询功能。

将做好的模型导入OSG中,取.ive格式,给路径场景模型命名lujing.ive。在OSG中,可以通过对摄像机运动的控制,实现漫游,摄像机通过变换它的矩阵来实现运动[3]。MatrixManipulator类是OSG中操作视点的接口方法,它包含向量_homeEye、_homeCenter和_homeUp三个向量成员,分别定义了视点即观察者的位置、摄像机瞄准的参考点及摄像机的朝向和摄像机的向上向量。用户只需要改变这三个变量就可以实现对视点的控制来实现漫游功能。对于用户来说,在实现漫游时,先定义一台摄像机,每次渲染場景前重新设置相机的状态,只需要不断变换外部设备的状态如位置改变即可[4]。

在OSG中进行场景漫游时可以通过五个虚函数来实现自己的摄像机,它们主要存在于osgGA::MatrixManipulator类中[5]。

osgGA::MatrixManipulator中的一些操作漫游器漫游会经常用到,比如下面辨别方向的设置:

virtual void setCoordinateFrameCallback(CoordinateFrameCallback*cb);这个语句常用来判断坐标系的更新。

Osg:: CoodinateFrame getCoordinateFrame(const osg::Ve3d&position)const;这个语句取得坐标系。

还有设置向量矩阵或者逆矩阵:

Virtual void setByMatrix(const osg:: Matrixd&matrix)=0;

Virtual osg::Matrixd getMatrix()const=0;

测试结果如下图3:

Virtual void setByInverseMatrix(const osg:: Matrixd&matrix)=0;

Virtual osg::Matrixd getInverseMatrix()const=0;

根据某校区虚拟场景操作器需求,编写了My TravelManipulator场景漫游操作器。通过设置矩阵控制Viewer场景管理器,用addCameraManipulator()方法把场景相机加入漫游场景中,使用外部设备控制行走的方向,按下W摄像机往上走,按下S摄像机往下走,按下A摄像机往左走,按下D摄像机往右走。

4 碰撞检测

本文的漫游系统中,大多数是静态的物体:建筑楼群和树木花草类,因此在这个系统中采用“射线/体”相交的碰撞检测算法[6][7]。OSG中由osgUtil提供进行碰撞检测的核心函数接口。其中,osgUtil::Hits主要用来进行相交测试,返回交点坐标。osg::LineSegments定义一条用于相交测试的线段或射线,起点和终点都包括任何与线段的交叉都在这里。osgUtil::InterseetVisitor类给相交测试提供初始化设置,访问场景的每个节点,创建一个列表HitList类的实例。osgUtil::IntersectVisitor::HitList用于返回物体碰撞之后的列表信息,在进行相交测试时,先是创建一条代表视线的线段,再创建一个交叉访问的实例IntersectVisitor,最后让创建好的线段在场景中遍历场景层次,与场景对象进行相交测试。

经过碰撞检测发现碰撞结果符合本系统的需求。

5 结束语

由此完成了整个校区漫游系统的设计,经过以上测试充分说明这个校区漫游系统实现了所需要的功能如漫游浏览场景的实现,在系统中添加了碰撞检测功能,使系统运行更加逼真,操作更加完善。

参考文献:

[1]张凯,徐桂生,龙怀冰等.3DSMAx6三维与动画设计[M].北京:清华大学出版社,2004:2-6.

[2]方丽.虚拟校园的研究与实现[D].硕士学位论文.西安科技大学,2007(19).

[3]肖鹏,刘更代,徐明亮.OpenSceneGraph三维渲染引擎编程指南[M].北京:清华大学出版社,2010:265.

[4]温转萍,申闫春.基于OSG的虚拟校园漫游系统的设计与实现[J] .计算机技术与发展,2009,19(01):218-219.

[5]刘少华,张茂军,张恒.大规模三维地形场景实施漫游系统的构建[J].计算机仿真,2005,22(06):178-182.

[6]范昭煒.实时碰撞检测技术研究[D].博士学位论文.浙江大学,2003(20).

[7]高丽娜,马尧海.虚拟漫游中的碰撞检测问题的解决方法[J].计算机仿真,2006,23(02):189-191.

作者简介:张慧(1980-),女,河南登封人,工程硕士。

推荐访问: 校区 漫游 设计 系统 OSG