




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于图像的风景旅游模拟漫游系统设计摘要虚拟现实信息技术即VR技术,它能帮助企业逼真再现现实发展环境。VR技术的一种非常典型,且广受欢迎的应用就是全景漫游。这篇文章的目的为设计和开发一种VR的景观全景漫游系统,这套系统可以三维的再现真是旅游场景,还可以支持使用者的交互。这篇文章首先进行详细数据分析,了解了各种主流的建模理论和技术,确定了系统的框架和最终用来实现的算法。在开发系统的过程中,使用到了OpenGL和vc++最终,该设计出的系统不仅能够画出视觉效果好的旅游环境,而且画面逼真,支持用户平滑的交互式漫游操作。此外,就该系统在景点再现,商品房展示等应用研究领域发展进行了尝试并取得一个良好视觉设计效果。关键词:虚拟现实图像拼接OpenGL风景旅游纹理映射目录第一章绪论 第一章绪论1.1引言时光飞逝,新的信息时代随着科学技术的发展已经悄然走进了我们的生活。妇孺皆知的一个事实是,信息时代计算机成为人与信息交换的主渠道,并且已经成为信息处理的最为主要的工具。不过在发展当中,企业众多的障碍出现了,其中就包括人机交互设计界面。如何克服这一障碍,如何拓宽人的感知渠道,提高人对事物和复杂动态事件的感知能力,保证人与信息空间的自然互动。这一切正逐渐转化为人类面临的新问题,VR是解决这些问题的最有效途径。虚拟现实(virtualreality,简称VR)是最近几十年流行起来的最新高科技技术。透过这项技术,电脑服务提供了一个非常真实的生活环境互动环境,让用户在虚拟经济环境中自然地与设施互动,从而获得与真实社会环境相媲美的感觉REF_Ref24235\r\h[1]。1.2选题背景及意义1.2.1选题背景随着社会经济和科学管理能力的发展,基于图像的虚拟信息技术问题引起重视。一些电子设备开始被美国宇航局用来设计一种成本低廉的VR系统,业者进一步促进了技术手段的使用。VR正在积极发展,在国家一级,研究始于20世纪80年代末,目前处于初级阶段REF_Ref24303\r\h[2]。我国的VR领域由于起步较晚,但在近几十年中,进行了一系列研究,包括VR应用系统的设计与开发平台,并进行了VR和存在感的研究,如球形屏幕和存在感[3]。1.2.2选题意义VR涉及计算机图形学、传感器网络技术、交互设计、人工智能等领域,是一种综合性的信息综合控制技术。现在,为了展示自己的风格,学校越来越注重宣传,需要一种更直接的方式来宣传自己。VR技术在学校的应用是一道虚拟风景线,可以充分展现学校环境的方方面面。本课题在研究全景漫游技术的基础上,可用于制作每一个场景的全景图像,预计此系统为中等难度水平,具有一定的交互能力和全景漫游景的能力。本课题在基于VR技术的前提下设计出一套景区漫游全景系统,让游客更真实地了解景区旅游。1.3本文结构及主要内容在撰写本文前,我阅读了海量的标准文献,已经对学界的VR技术和交互技术有了深刻的了解。我主要想去解决VR技术在虚拟景观应用的问题,所以提出了对应的功能设计架构和实现方法,又基于这个问题,进一步给出了基于OpenGL的虚拟景观漫游系统。更多的是,虚拟景观文化旅游漫游管理系统能真实再现景观旅游的3D空间景观,能在3DVR景观中自由漫游,并能有效实现逼真的交互技术操作。本课题的介绍将分为六部分来进行。第一部分为与课题有关的常规性导论。主要讲解了选题背景、引言、选题所带来的意义以及本文的基本行文结构在下一个部分大概介绍了与本VR课题领域一些相关的技术理论知识,主要介绍了产品设计过程中涉及的,包括OpenGL图形编程基础知识、全景图生成、MFC编译教育技术、虚拟场景建模技术在内的计算机技术和知识。第三部分设计全景漫游系统,这也是本课题的核心部分在这一部分主要分析和讨论了如何去设计全景漫游系统的详细和总体设计,并给出了一些思路用于代码的设计和实现。第四部分,系统的可实现性和可测试性。这部分公司主要研究管理系统的具体实现和相关分析测试,并编写其基本代码。第五部分是应用前景,主要通过具体应用实例说明本课题的意义,并总结相关技术应用的特点。第六部分是项目的总结与综合。
第二章相关知识2.1OpenGL编程基础OpenGL被广泛定义为“图形硬件软件界面”。总的来说OpenGL严格遵循计算机图形学原理,还具有一定的可移植性,符合视觉和光学原理。OpenGL通过三维图形和模型库实现的,可以创建极其逼真的3D图像。绝大多数的3D效果展示都倾向于使用OpenGL来为它们生成和控制3D图形的接口。2.1.1OpenGL简介最近一些年逐渐发展起来的一款软件叫做OpenGL,它是一种性能优异的3D图形标准。它是由德国劳埃德船级社在SGI的支持下基于SGI开发的一种世界知名的3D图形标准。在一些基于它开发到软件中中,最受广大使用者欢迎的开发产品有很多,他们包括软图像动画软件和3DStudioMAX、openinventor仿真软件、VR工具包软件、CAMProengineer软件、GISARC/info软件等。OpenGL是一个非常受业界欢迎的2D/3D图形API,从OpenGL出现以来,它通过世界各地的开发者口口相传,变得越来越知名。OpenGL的前身irisGL可移植性,但基于irisGL开发的OpenGL可移植性很好。OpenGL在顶尖的职业图形领域发挥着不可忽视的作用。OpenGL4.1和OpenGL4.10于2010年7月26日发布,他们能让程序开发者根据市场的需求变化使用简化的API或者保持与现有OpenGL代码的向后兼容性。2.1.2OpenGL的主要功能OpenGL主要有以下功能:(1)设置颜色。颜色索引模式和RGBA颜色模式,这两种物体着色模式由OpenGL提供给用户以供选择。(2)建模的功能。简单的点、线或多边形都可以通过计算机来组成所有现实世界中的物体。OpenGL不仅提供点、线和多边形的基础绘图功能,除此之外,更可以提供复杂3D对象(如圆锥体、球、水杯、多面体等)的绘图功能。以及更为复杂的曲线和曲面,因此可以轻松搭建3D的VR场景。(3)变换函数。无论设计的结构有多复杂,一个基本的事实是不会改变的,那就是平面都是由基本的结构元素组成,然后这些最基本的元素再通过一系列复杂转换来变成平面或曲面。旋转、平移、其他转换和调整大小都可以在库之中实现。(4)照明模型。要获得逼真的照明效果,必须在三维中渲染对象。为了达到产生各种不同的视觉效果的目的,可以使用OpenGL来控制对象和照明之间的相对关系。(5)走样。位图的使用会导致在OpenGL中制作形状的程序中,最终图片的边缘会呈现出锯齿状不规则走样。OpenGL为点、线和多边形提供了抗走样技术以对抗这个缺点。(6)整合。整合技术通常被用来处理半透明或透明对象的图片,以达到使3D图形更逼真的目的。(7)雾化。一项由OpenGL提供的“雾”的基本操作,可以模拟自然界中的烟雾,以实现场景的雾化。(8)动画双缓存。OpenGL为渲染动画提供了双缓冲技术,从而可以快速达到理想而又优秀的动画效果。在这个过程中前台和后台缓存两种一起组合起来组成的组合起来被称为双缓存。前台缓存则主要显示从背景缓存绘制的图像。(9)结构映射。alpha值、颜色、其他数据和亮度的矩形矩阵在计算机图形学中被统一称为纹理。在绘制的3D模型的研究面上粘贴纹理,以使3D图形设计更加真实,这一操作被称之为纹理映射。2.2MFC编程技术微软提供了一个囊括了100多个使用者在程序开发过程中频率最高的对象的MFC类库。在使用者编程时,如果所需的功能可以被存储库中的对象完美执行,我们只需要给已经拥有该对象的人打电话。我们教师也可以使用以客户为中心的技术企业,一种非常重要的“继承”方法,这种方法是我们通过自己的设施从自己的设施中获得的,而除了这种基地存在的一些特性和功能需求之外,我们学生自己可以根据实际需要进行影响,结合必要的特点和方法,产生更具体的影响,功能设计更有力的对象。当然,您也可以在程序中创建一个全新的对象,并根据需要改进其已有功能。下文图2.21和2.22显示了海事委员会程序的主要类别之间的关系,这是该进程的共同基础。ApplicationApplicationObjectDocumentObjectViewObjectFrameWndObject图2.1ApplicationObject是全局对象,其他对象动态生成这两张图说明了使用MFC的四个关键类之间的关系。cmyapp类的主要目的是造词。在MFC程序中,程序的数据被放置在一个文件中,并使用输出文件进行查看。用户生成的命令在类似产品中执行。在MFC模式的Windows程序中,使用系统创建的MFCCWinAppCMYAPP类[6]来检索和执行语言。2.2.1OpenGL体系结构及工作流程OpenGL下的NT窗口对网络是透明的。OpenGL图形库被嵌入到OpenGL32.DLL中,这与将图形功能库嵌入到动态链接存储中一样[4]。OpenGL命令被处理,并传输到DDI,允许向视频显示驱动程序发送经过处理的图形命令。下图显示了一个过程:图2.4过程OpenGL以流水线模式工作并且被设计成独立于硬件。通过这种方式,OpenGL可以被视为一个生成管道。对象顶点、场景、其他信息和曲面细节组成了原材料,产品是一个平面位图,但是看起来是三维的。这些三维图形在平面越小的情况下看起来就越逼真。工作流程大致如下:图2.2工作流程几何信息图形和图像和都可以作为工作流的输入侧,他们可以同时显示,他们最终的图像形式是光栅化后的。它们将被光栅处理,用于分析和处理半导体板。因此,OpenGL使用顶点和像素等多个基本元素来工作,这些元素很容易工作,但很难建模。此外,OpenGL还提供了其他功能,如观点设置、照片、照片、材料属性照片等,为了达到提高真实性的目的,从而增强了使用者的搭建模型能力,方便且扩大了三维地形设计的可视化应用[5]。2.3虚拟场景建模技术VR场景中的模型基于真实或虚拟的物体或图像进行设计,设计模板是创建VR场景的基础,设计的好坏直接影响虚拟现实场景的真实感和理解力。因此,有必要选择不同的型号。根据产品的性质,目前VR模型技术可以通过三种方式获得:一是基于计算机图形学的几何建模(GBM)技术;二是视觉建模(IBM)技术,三是基于几何的设计和图形设计[7]。2.3.1三维几何建模技术三维几何建模技术还为其他类型的计算提供了工具。当我们进行研究时,我们发现可以研究环境在现实世界中是如何被修改、修改甚至改变的。实时模型只是一个三维虚拟环境,必须首先由几何稳定获取,以计算实时模型。这意味着对实时模型的估计。实时模型由两个独立的方程导出,这两个方程决定实时模型。我们假设几何模型是r从3D场景中的所有对象,请注意,所有对象都是彼此独立创建的,这是在3D世界中生成实时模型所必需的[8]。2.3.2基于图像建模技术基于图像的建模技术(成像方法)不依赖于三维几何模型,它是一种具有空间操作能力的虚拟环境。本项目主要利用该技术进行场景建模,实现虚拟景观的全景漫游[9]。这项研究的目的是根据中国的一些初步地图(或环境地图)创建不同视角的场景。除了建模和渲染过程之外,它最重要的好处是:(1)平面设计的计算成本不取决于网站的复杂程度,而通常取决于要创建的图形的分辨率。(2)预存图像(或环境图)可由电脑拼装或公司制作。按照以下步骤创建视觉VR场景:1、从模型中获取数据,其实就是一个过程。“物理虚拟化”通过网络摄像头或扫描在虚拟业务环境中创建事件和设备来工作。原始数据通常由计算机图形记录。全景相机和数码相机这些相机由重叠的图像组成。2、图像的插值和积分。插值是使用一个角度的已知图像通过计算效果来获得另一个角度的图像。整合的问题是同一角度、不同文化的图像整合,需要将两幅图像数据以某种中国时间的尺度整合。缝纫的关键是找到相邻形状的重叠。重叠的位置通常通过按住中心(通过拉动鼠标)和自动拼接(根据光区差异变化的原理。章为零)来实现。3、编程和重编程。存储的图像和当前视图对应的全景图通过计算机上存储的各种图像全景图进行搜索,当当前视图曝光时,全景图部分可见。最后,调用重投影模块使其到中平面进行检查。2.3.3基于几何和图像的混合虚拟场景建模技术几何建模技术容易建立三维空间,它可以从任何角度进行管理和观察,但计算量大,硬件设计要求高,复杂模型建模的教育过程困难。使用图像建模技术创建虚拟场景使实时建模更容易、开发成本更低、计算量更少且更有效,但需要大量数据。几何建模和基于图像的建模技术的结合可以充分利用这两种技术并获得非常理想的结果。使用混合建模和分析技术构建3D虚拟空间。对于需要使用用户信息实时操作数据的虚拟对象,使用几何建模技术对经济实体进行建模。换句话说,在虚拟社交环境中,在用户想要交互的对象之间建立研究实体,不仅可以克服弱化图像交互的问题,还可以提高场景的真实性,还可以保证它的安全。对于增强时间性、交互性和学生用户沉浸感的非操作实体,虚拟环境建立在图像建模技术之上,使用高质量的图像来反映现实世界的场景,并且是复杂的,无需建模过程即可实现最逼真的感官效果。虽然混合建模有许多优点,但实施过程中也存在许多技术问题。尤其是以下三点:虚拟世界坐标系的坐标位置和装饰方向必须在虚拟实体对象和纯虚拟对象之间完全匹配。虚拟经济实体的研究课题是实现信息几何模型,实体在虚拟光源照射下的亮度、阴影强度、方向为纯虚拟物体的亮度和发展阴影。强度和方向应该更准确有效地结合起来。此外,虚拟与现实之间的完整连接必须满足实时交互。这意味着一旦用户的视角和位置发生变化,我们需要生成新的视角图像,并立即反馈实体操作。
第三章全景漫游系统的设计3.1系统整体设计虚拟景观漫游系统是一个具有真实听觉、视觉和触觉的虚拟环境。它是一个实时模拟的虚拟空间或真实空间。用户使用该设备在虚拟空间中畅游,用户可以从各个角度看到虚拟物体,产生积极的印象。3.1.1系统功能概述虚拟景观漫游系统可以概括为以下两个教育功能:建立3D场景模型、从用户角度进行选择和控制。该项目的思想是用OpenGL建模所选取的各种具有代表性的场景,并使用二维纹理贴图进一步绘制场景,最后在MFC程序中进行交互和控制,实现虚拟景观的全景VR漫游系统。该设计的各种功能如下图3.11所示:虚拟风景全景漫游系统虚拟风景全景漫游系统场景模型建立立全景图像获取用户视点控制纹理贴图三维场景组织图3.1系统基本功能模块3.1.2系统基本设计方案本文主要关注方向为建立VR漫游系统、建立三维场景的建模和系统与用户交互功能的实现三个方面对虚拟景观全景漫游系统进行了研究。首先一是根据环境景观来着重选择几个最为典型的景观应用场景用来建立对应的3D模型。其次二是建立VR的漫游系统,也就是说要去完成设计虚拟三维场景漫游最终有关控制的任务。最后,我还为这套系统增加了一些额外的智慧人机交互功能,毫无疑问的这些功能可以增强了虚拟系统给人带来的真实感。具体实施过程如下:(1)确定VR漫游系统,进行基本的项目需求分析,最后展示用于影响和发展的平台。(2)创建基于全景的视觉设计,然后对数据进行文本映射、预处理和校正,以获得逼真的效果。(3)创建漫游模式,发展人机互动,VR风景漫游的最终实现。3.1.3系统基本框架根据前面的系统管理功能,分析设计研究方案,总结系统总体开发结构,如图3.13所示:建模建模纹理贴图模型模型转换场景模型全景图初始化场景场景渲染视点控制输出设备外部输入三维场景组织真实感绘制图3.2系统总体设计框架3.2系统详细设计3.2.1全景图的生成基于图像的VR渲染技术可以将一组重叠的照片完美而又平滑地组合成一幅图像。基于全景虚拟图像绘制(IBR)的技术通常是能够非常快速的绘完成绘画工作,这项技术需要更小的复杂计算,更小的数据量,但是却会带来更强的真实性,该技术非常适合在网络传输和可视化方面的应用。全景图是VR和计算机视觉中非常重要的学习方法和视觉表示。Panorama可以在固定视角的基础上完成垂直展开方向的180度图像视图,同时完成不同水平方向的360度图像视图。因为它在漫游的时候可以做没有死角的优秀情况,所以全景图逐渐成为了重建生活场景的首选,它也得到了广泛的应用。图像渲染技术是渲染技术中最成熟、最实用的技术之一。获得全景图像基本上有两种方法:缝纫法和直接法。用于探索全景数据的全景投影平面根据投影格式的不同,一般分为三种:三次全景。球形全景和圆柱形全景。其中,在此次设计中,为了生成网络VR场景,选择效果最为理想的360度圆柱全景[11]。生成全景图的阶段大致分为以下几个部分:图像采集拍摄各种场景以创建圆柱形全景。最常见的方法是使用传统相机预先使用数码相机拍摄就地收集的图像样本。拍摄前保持相机水平很重要。这将防止相机镜头在上下方向上过度变形。我们可以采取垂直轴围绕着旋转一整圈的方法来进行连续拍摄,需要注意的是,两个相邻图像要保证重叠程度较低。图像拼接判断和分析不同程度图像重叠区域的相似性在全景图像的拼接过程使用的方法是非常基础的。现阶段用来做全景图像拼接的方法有很多,其中鱼眼图像拼接法和柱面投影拼接法是相对成熟的两种。接下来,我将会重点的介绍由下柱投影方法生成的全景图。首先,我们假设相机运动在X~z平面,光轴与图像数据平面的交点就是图像中心的位置。如图2所示,O定义为透视图,I定义为原始图像,I'为投影圆柱图像,h为图像高度,w为图像宽度。源定义为图像投影角的左上角(如图3所示),其中r为圆柱体的半径,其中w和h可以通过图像编译后得到。I图像的任何原始像素点为P(x,y),即圆柱上的投影点P。即投影图像I'中点P对应的像素点Q(x',y'),其算法如式(1)所示:图3.3公式图3.4图像式中,f是相机的焦距,f是圆柱表面的半径r,则r可从图3中获得:r=w/2tan(θ/2)。如果投影后的宽度为w',则w'=2Rsin(θ/2),圆柱投影可转换为公式(2)[12]。图3.5公式图像拼接是基于收集到的图像数据中两个相邻图像的重叠区域的相似性。左侧图像中的“对比资源”部分用作模板,如图4所示。在右侧的图像中找到最佳匹配。特征部分将搜索间隔限制为两个图像的阴影部分。并使用特定的评分功能查找资源行和资源列。图3.6图像因为两条直线的交点可以定义一个平面。左图表示模型a在图中的位置,右结点表示分析线段和图像积分的位置。左右图像的相对重要性可以通过定义两幅图像对应的技术平移参数来确定。在左边的图片中从上到下比较上一行和下一行。然后将F0与较小的f行进行比较以找到最大的行。对于每一行或每一列对应的P和Q定义为:其中:(3)该值表示所选像素的绿色、红色和蓝色元素。点P和点q的像素分量值分别用P(x)、q(x)表示,R、G和B分别表示红色、绿色和蓝色。其中,dr代表绝对值。对应像素的红色差表示dg相对像素的绿色分量差的绝对值,蓝色分量db表示对应像素的差的绝对值。在特征线分割算法中范围清晰,接缝清晰可见。去除这些不需要的效果并实现平滑的图像边界。保存两个图像后,图像的重叠部分必须平滑并相互融合。图像在空间上通过叠加以增加信息量的过程就是图像融合。在本文中,采用了加权平均逐渐进入和逐渐退出,以实现图像的平滑过渡。假设两个图像I1(I,J)和I2(I,J)已经合并,合并图像I的像素可以表示为:其中,a取(0,1)。从上面的公式我们可以看出,如果从1逐渐转换到0,图像可以从I1(I,J)平滑变化到I2(I,J)。它可以去除大多数缝线完成几个研究步骤后,我们可以得到VR风景场景的圆柱全景图。图3.7合成前的一组图像图3.8合成后的全景图3.2.2纹理贴图纹理映射技术的使用非常广泛,场景表层的一些非常微妙细节往往会很难被以往大家常用的一些几何图案来准确的描述出来,但是如果我们能够使用纹理图像上每个点的反射特征来描述场景表层的话,能够极大地模拟场景表面情节、丰富模型细节,增强利用计算机程序所生成的图形的给人带来的真实感。另一方面,使用不同的纹理映射方法,我们可以海量的简化搭建模型的过程。定义纹理一般来说,最常用的格式定义方法之一就是隔离方法,隔离方法执行函数GL_Texlmage2D()。GL_Texlmage2D()的模型如下:voidgltelmage2d(目标glenum、闪烁级别、glenum组件、glsizei宽度、glsizei高度、闪烁边缘、glenumformat、glenum类型、常量glvoid4像素)。其中:目标指定纹理映射。纹理图像的分辨率由Jevel指定,如果只有一种分辨率,degree=0,则选择要混合调整的组件。高度和宽度分别指定纹理图像的高度和宽度。需要注意的是必须为2n,其中N为正数,边框宽度必须为0和1。格式和纹理映射数据类型分别由pattern和type指定。pixels指定指向位置的指针。which是纹理数据在内存中的位置。控制纹理许多问题会产生在这个过程中,比如如何利用纹理映射调整纹理大小和减少重复的纹理。这部分用于实现目的的函数是gltexparameter()。函数的原型(以gltexparameterf的形式为例)是voidgltexparameterf(glehumpname、glenumtarget、gialoatparam),其中目标参数是目标纹理,pname参数的值如下:GL_EXTURE_MIN_FILTER、GL_TEXT_MAG_FILTER、GL_TEXT_WRAP_S、GL_TEXT_WRAP_T。参数值取决于pname。纹理贴图模式gltexenv()是取自OpenGL用于纹理映射函数。这个函数的原型是voidgltexenvf(glenumpname、glenumtarget、gltoatparam),其中目标参数应为GL_TEXTURE_Env,pname参数应为GL_TEXTURE_Env_Mode,param为GL_Module、gldemic或GL_Blend。定义纹理坐标纹理图像中的像素映射到对象这一环节是由纹理坐标系控制的。纹理坐标可以是好几种不同维度的,例如1、2、3和4维,在系统中这一部分我们通常会使用(s、t、R、q)来表示对应的维度,即各自的次坐标。纹理坐标函数被OpenGL设置为gltexcoord(),它拥有32种不同的形状。例如:GL_uTexCoord4f(0.0f,0.0f,0.0f,0.0f)[14]。代码如下:namespaceOGL{classCCylinder {floatm_Radia;//圆柱半径 floatm_Height; intm_Slice;//圆柱由m_Slice个划分 CGLTexture*m_pTexture;//圆柱使用的一个全景纹理图 public:CCylinder():m_pTexture(NULL) { m_Radia=1280-128; m_Height=1024+1024; m_Slice=12; charCylinderTex[255]="Scene1.JPG"; LoadCylinderTexture(CylinderTex); } voidLoadCylinderTexture(char*CylinderTex) { if(m_pTexture!=NULL)deletem_pTexture; m_pTexture=newCGLTexture(CylinderTex); } ~CCylinder() {deletem_pTexture; } voidOnRender() { glPushMatrix(); glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); glColor4f(1.0f,1.0f,1.0f,0.8f); if(m_pTexture!=NULL) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,m_pTexture->GetTextureID()); } floatDeltAngle=360/m_Slice; glBegin(GL_QUADS); for(inti=0;i<360;i+=DeltAngle) { floatsine=sin(ClwMath::Deg2Rad(i)); floatcosine=cos(ClwMath::Deg2Rad(i)); floatsinenext=sin(ClwMath::Deg2Rad(i+DeltAngle));floatcosinenext=cos(ClwMath::Deg2Rad(i+DeltAngle)); CVectorVector1=CVector(m_Radia*cosine,0,m_Radia*sine); CVectorVector2=CVector(m_Radia*cosinenext,0,m_Radia*sinenext); CVectorVector3=CVector(m_Radia*cosinenext,m_Height,m_Radia*sinenext); CVectorVector4=CVector(m_Radia*cosine,m_Height,m_Radia*sine); glTexCoord2d(i/360.0f,1); glVertex3fv(Vector1.V); glTexCoord2d((DeltAngle+i)/360.0f,1); glVertex3fv(Vector2.V); glTexCoord2d((DeltAngle+i)/360.0f,0); glVertex3fv(Vector3.V); glTexCoord2d(i/360.0f,0); glVertex3fv(Vector4.V); } glEnd(); glDisable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); glPopMatrix(); } };}#endif
第四章系统实现与测试4.1主界面的实现计算机系统研究中一直有的一个重要问题,就是人机交互。在全世界的范围内,“以用户为中心的设计(UCD)”的方法都得到了大量的认可和应用。实时用户参与和实时互动是UCD渠道的主要特点,也是VR技术的关键特征之一,也是实时营销的重要组成部分。综上所述,一个好的home界面很重要,这同时也是进行人机交互的主要一环,设计出的系统主界面如图4.1所示:图4.1主界面4.2交互漫游的控制交互式漫游意味着用户可以通过设备管理和各种输入信息自由控制漫游的视角、方向和漫游速度。鼠标和键盘可以作为控制输入信息的主要设备。通过键盘的不同按钮来控制前后方向和速度,通过鼠标来控制步进、左右方向和旋转操作。具体步骤如下:(1)键盘和鼠标捕捉需要相应的硬件输入设备捕获用户操作。微型计算机中最重要也最常见的交互设备是键盘和鼠标。由于OpenGL函数库中有成熟的捕获函数。例如:鼠标捕捉功能是:glutmusefunc(鼠标_proc);捕捉键盘的功能是:键盘Func(键);或臀肌功能(特殊);其中,mouse_Proc、key和special是相应应用程序的调用函数名[15]。(2)漫游控制在本漫游系统的实现中,我设置键盘的W键来代表前进,S键来代表后退,a键来代表左移,D键来代表右移,通过鼠标的点击来代表前进,后退,左移。不过如果用户视角分析发生变化时,我们必须要重新设计,也就是把事情推到现场,并做出相应的改变。可以通过自动更改事件中的3D对象坐标或更改视图来更改事件配置文件。直接协调更改将涉及重新排列场景中所有项目的坐标。许多坐标变化会累积误差,最终导致位置失真,这是我们不希望看到的。因此,在实时信息交互中,如果从企业用户的角度来看,也要利用不断的变化来完成的场景的重新渲染。漫游AR风景场景时,由于用户站立面对的方向不同效果不同,这可以通过敲击键盘或者移动鼠标来改变(可以通过敲击键盘来改变调整移动速度与变量设置)(使用学习到的3D几何的相关知识),最后可以通过glulookat()自动生成相应的AR3D场景[16]。与用户进行交互是整个系统的最关键部分,主要代码如下:namespaceOGL{classCCamera { public: _TFRAMEm_TFrame;//角色帧 CVectorm_vVelocity; CVectorm_vAcceleration; CVectorm_vAnglesVelocity; CVectorm_vAnglesAcceleration; intm_CameraType; public: CCamera() {Init(); m_CameraType=1; }; ~CCamera() { };//利用具有角色帧的物体进行照相机设定时使用 voidSetCameraFrame(_TFRAME&Frame){m_TFrame=Frame;}; voidInit() { m_TFrame.m_vPosition=CVector(0.0f,20.0f,0.0f); m_TFrame.m_vUp=CVector(0.0f,1.0f,0.0f); m_TFrame.m_vForward=CVector(0.0f,0.0f,1.0f); m_TFrame.m_Yaw=-135; m_TFrame.m_Pitch=15; m_TFrame.m_vLookAt=CVector(0.0f,0.0f,1.0f); m_vVelocity=CVector(0.0,0.0,0.0); m_vAcceleration=CVector(0.0,0.0,0.0); m_vAnglesVelocity=CVector(0.0,0.0,0.0); m_vAnglesAcceleration=CVector(0.0,0.0,0.0); } voidAnimate(scalar_tdeltaTime) { if(m_CameraType==0) {} elseif(m_CameraType==1) {Animate1(deltaTime);} } voidAnimate1(scalar_tdeltaTime)//二维漫游 { if((m_TFrame.m_Yaw>=360.0f)||(m_TFrame.m_Yaw<=-360.0f)) m_TFrame.m_Yaw=0.0f; if(m_TFrame.m_Pitch>15.0f) m_TFrame.m_Pitch=15.0f; if(m_TFrame.m_Pitch<-5.0f) m_TFrame.m_Pitch=-5.0f; //delta时间运动矢量 CVectorvDeltDistance=CVector(-m_vVelocity._x*deltaTime,m_vVelocity._y*deltaTime,m_vVelocity._z*deltaTime); CVectorvDeltAngles=CVector(m_vAnglesVelocity._x*deltaTime,m_vAnglesVelocity._y*deltaTime,m_vAnglesVelocity._z*deltaTime); //控制deltTime时间内移动的距离最大最小值 if(vDeltDistance._x>25.0)vDeltDistance._x=25.0; if(vDeltDistance._x<-25.0)vDeltDistance._x=-25.0; if(vDeltDistance._y>25.0)vDeltDistance._y=25.0; if(vDeltDistance._y<-25.0)vDeltDistance._y=-25.0; if(vDeltDistance._z>25.0)vDeltDistance._z=25.0; if(vDeltDistance._z<-25.0)vDeltDistance._z=-25.0; floatcosm_Yaw=(scalar_t)cos(ClwMath::Deg2Rad(m_TFrame.m_Yaw)); floatsinm_Yaw=(scalar_t)sin(ClwMath::Deg2Rad(m_TFrame.m_Yaw)); floatsinm_Pitch=(scalar_t)sin(ClwMath::Deg2Rad(m_TFrame.m_Pitch)); floatcosm_Pitch=(scalar_t)cos(ClwMath::Deg2Rad(m_TFrame.m_Pitch)); m_TFrame.m_vPosition._x+=float(cos(ClwMath::Deg2Rad(m_TFrame.m_Yaw+90.0)))*vDeltDistance._x; m_TFrame.m_vPosition._z+=float(sin(ClwMath::Deg2Rad(m_TFrame.m_Yaw+90.0)))*vDeltDistance._x; m_TFrame.m_vPosition._x+=float(cosm_Yaw)*vDeltDistance._z; m_TFrame.m_vPosition._z+=float(sinm_Yaw)*vDeltDistance._z;m_TFrame.m_vLookAt._x=float(m_TFrame.m_vPosition._x+(cosm_Yaw*cosm_Pitch)); m_TFrame.m_vLookAt._y=float(m_TFrame.m_vPosition._y+sinm_Pitch);m_TFrame.m_vLookAt._z=float(m_TFrame.m_vPosition._z+(sinm_Yaw*cosm_Pitch)); m_TFrame.m_Yaw+=-vDeltAngles._y; m_TFrame.m_Pitch+=vDeltAngles._x; if(m_vVelocity.Length()>0.0)//阻力影响角速度和位移速度变化 { m_vAcceleration=-m_vVelocity*1.0f;//相当于摩擦力 } m_vVelocity+=m_vAcceleration*deltaTime; if(m_vAnglesVelocity.Length()>0.0) { m_vAnglesAcceleration=-m_vAnglesVelocity*1.0f; } m_vAnglesVelocity+=m_vAnglesAcceleration*deltaTime; };}#endif4.3系统相关测试本项目主要利用VR技术实现场景的全景漫游系统,使我们能够更真实地了解我们的场景。通过对虚拟景观的分析,实现了景观的基本漫游系统。设计的这款系统采用VC++6.0MFC和OpenGL,设计完成的系统具有简单大方的界面和良好的交互性,同时用户可以用键盘和鼠标来进行控制。具体的测试步骤示例如下:编译、链接和运行,出现主界面图4.2全景图移动鼠标或按W键,向前移动;移动鼠标或按A键,向左移动图4.3分布图图4.4分布图移动鼠标或按S键,向后移动;移动鼠标或按D键,向右移动图4.5分布图图4.6
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 推进省能减排措施的总结计划
- 组织目标达成情况报告计划
- Unit 2 More than fun -Developing ideas 教学设计 2024-2025学年外研版英语七年级上册
- 家长参与教育的有效提升计划
- 学校美术教育的多元评价体系计划
- 突破瓶颈的创新解决方案计划
- 环评验收合同(2025年版)
- 四年级下册数学教案-8.2 条形统计图 1-西师大版
- 小学普法教育
- 物业客服接待流程及礼仪培训
- 部编版三年级语文下册教学计划(含进度表)
- DB11∕T1082-2024工业γ射线移动探伤治安防范要求
- 2025年常州机电职业技术学院单招职业适应性考试题库及答案1套
- 肺动脉栓塞溶栓治疗个体化方案探讨-深度研究
- 2025年中考英语热点话题预测-哪吒(含答案)
- 【2025新教材】教科版一年级科学下册全册教案【含反思】
- 2025年河南农业职业学院单招职业技能测试题库及参考答案
- 律师执业风险防范研究-深度研究
- 2024年全国职业院校技能大赛中职组(母婴照护赛项)考试题库(含答案)
- 2025年春新人教版语文一年级下册教学课件 语文园地二
- 2025年1月浙江高考英语听力试题真题完整版(含答案+文本+MP3)
评论
0/150
提交评论