基于Unity3D的三维虚拟电脑组装实验系统开发毕业论文.docx
- 文档编号:24488507
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:34
- 大小:421.76KB
基于Unity3D的三维虚拟电脑组装实验系统开发毕业论文.docx
《基于Unity3D的三维虚拟电脑组装实验系统开发毕业论文.docx》由会员分享,可在线阅读,更多相关《基于Unity3D的三维虚拟电脑组装实验系统开发毕业论文.docx(34页珍藏版)》请在冰豆网上搜索。
基于Unity3D的三维虚拟电脑组装实验系统开发毕业论文
基于Unity3D的三维虚拟电脑组装实验系统开发毕业论文
基于Unity3D的三维虚拟电脑组装实验系统
基于Unity3D三维电脑组装实验系统的实现
【摘要】实验教学不仅能够培养学生的动手能力~而且还能起到巩固课本上理论知识的作用。
但是由于我们国家人口基数庞大~教育资源有限~实验器材紧缺~不能满足广大在校学生或者社会成人求学需求~因而成为教学和学习中最难以付诸实践的薄弱环节。
随着虚拟现实技术的出现~实验教学有了新的思路。
Unity3D引擎对开发仿真性非常高、交互性非常好的虚拟实验环境具有很大的帮助。
本文在对虚拟实验室的研究现状进行充分调研的基础上~借助Unity3D引擎和3DSMax三维建模软件~搭建了一个逼真且操作方便、具有交互功能的组装计算机硬件的虚拟实验操作平台~对组装计算机实验进行了模拟~实现了实验过程以及部分实验现象的模拟。
系统的主要功能是让用户采用虚拟仪器完成组装过程~从而达到学会组装计算机的目的。
【关键词】虚拟实验,Unity3D,计算机组装,
1.引言
1.1研究背景及意义
早在十六世纪,实验就被运用于教育教学。
实验是指根据科学研究的目的,尽可能排除外界因素的影响的同时突出主要实验因素,并且利用一些专门的仪器设备而人为地改变、控制或者模拟研究对象,使某一些事物(或过程)发生或再现。
实验的目的在于通过学习者亲自动手参与实验,从而培养学习者的观察能力、分析能力和实践能力。
研究表明,人的动作记忆效率远远高于语言文字的记忆效率,所以通过动手参与的学习比单纯看书要更有效率,实验教学通过让学习者了解事物的本质,培养学习者的研究能力、创新能力,加强学习者对知识的运用和实践,因此成为教育教学中一个不可分割的部分。
最开始的实验教学都是真实实验,学习者在真实的实验环境下操作实验设备来完成实验目的。
但是随着人口数量的增加,知识研究领域的扩展,真实实验暴露出了许多缺陷,比如许多实验器材价格昂贵,实验资源无法满足广大学习者的需求,实验存在安全隐患,真实场景带来的实验误差等等。
虚拟实验的概念也就应运而生了。
虚拟实验的概念最早由美国弗吉尼亚大学的威廉?
沃尔夫(WilliamWalf)于1989年提出,它是在虚拟现实技术的基础上产生和发展起来的,是对真实实验尽心模拟或再现的一种实验模式。
它的主要组成部分都是通过计算机虚拟而成的,包括实验室环境,实验室仪器以及实验资源。
在虚拟实验中,学习者不受时空的限制,可以随时随地的进入虚拟实验系统,通过键盘或者鼠标、数据手套等交互设备与虚拟实验系统中的虚拟仪器进行交互,完成与真实实验一样的各种实验操作过程。
第0页
基于Unity3D的三维虚拟电脑组装实验系统
Unity3D作为一款专业的商业游戏引擎,早在2010年就进入了我国,由于其友好的操作界面和强大的性能,在国内积攒了众多的开发者。
其官网上得AssetStore也给广大开发者提供了数量众多,类目琳琅的插件,可以大大的缩短开发者的开发周期。
近年来,Unity3D为虚拟现实提供了完整的解决方案,其强大的物理引擎,基于DirectX和OpenGL的高度优化渲染管道,还有可编辑的Shader着色器,让模拟真实多变的生活环境变成现实。
因此我选择Unity3D来开发这样一个虚拟电脑组装实验的系统,为学习者提供一个自由、真实的实验平台,利用本系统进行实验教学,让学习者认识计算机硬件,掌握组装电脑的一些基本技能。
1.2研究内容
本文主要在于借助Unity3D引擎将虚拟现实技术引入虚拟实验中,探索新的虚拟实验的教学模式。
具体研究内容包括以真实实验在教育教学中的重要作用和协作学习对学习者能力的培养作为立足点,将虚拟现实与虚拟实验结合起来;利用Unity3D实现虚拟计算机硬件与实验者交互,突破实时交互的一些难点;完成整个系统架构设计,并且编写代码实现整个系统功能。
2.虚拟实验器材的制作
2.13DSMax模型创建
2.1.1多边形建模技术
多边形建模技术是三维建模技术中比较常见的一种建模方式。
现实世界中的很多物体都可以看成是由基本的几何体进行变形和细分得来的。
多边形建模就是基于简单的长方体、圆柱体、球和其它一些几何体,运用添加线,点来进行细分,面挤出,边挤出等三维建模手法来完成模型的创建。
多边形建模技术的优点在于它能很快的把目标模型的大体轮廓勾勒出来,对于精度要求比较低的模型来讲,甚至可可以经过简单的几次变形就可以达到想要的效果。
因此对于较为规则的家具或者家用电器来讲,使用多边形建模可以极大地提高工作效率。
计算机组装实验所用到的计算机的主板、内存条、显卡、电源以及机箱显示器等主要零部件都是比较规则的几何体,主板上看似比较复杂的各种电阻和插针,仔细看其实都是一些简单的圆柱体。
下面图1、图2、图3是用3DSMax多边形建模方法制作的计算机部件模型。
第1页
基于Unity3D的三维虚拟电脑组装实验系统
图1CPU制冷风扇
图2主板
第2页
基于Unity3D的三维虚拟电脑组装实验系统
图3液晶显示器
2.2模型UV拆分和材质贴图
UV的是贴图坐标的简称,它定义了一张二维图片将以何种方式贴到三维对象的表面之上。
在3DSMax中通过加UVWMap修改器可以为一些常用模型选择贴图方式,比如平面映射、柱面映射、球面映射、立方体映射等。
但是当遇到比较复杂的模型时,就不能依赖这种方式了,需要手动来为模型拆解UV。
UV拆分有几个原则:
拆分出来的UV碎块要尽量少,这要贴图贴上的接缝就会更少,便于处理;需要将拉伸降低到最小,UV反映的是图片上的每一个像素点到模型表面上每一个点的对应关系,如果UV出现拉伸,就会出现模型的表面一些区域承载过多的图像信息,另一些区域承载的图像信息却太少,贴图就得不到正确的显示;还要避免贴图坐标的重叠。
贴图坐标重叠将直接导致重叠的贴图部分分配不到正确的图像信息;最后还要尽可能有效使用纹理空间。
由于在建模的过程中,经常需要将一个模型拆分成很多部分来创建,最终将各个部分整合成一个完整的模型。
而模型在最终的材质表现上,各个不同的部分可能需要不同的贴图或者材质。
这在计算机的硬件上体现的尤为明显,比如一块显示器的显示屏幕和底座的材质是明显不一样的,而在显示器的边框上可能还有生产厂商的Logo和按钮。
因此,很多时候需要用到多维子对象(Multi/Sub-Object)材质。
只要在建模的时候,给每个子对象分配好材质ID,就可以将子材质赋予给指定的模型子部件。
下面以内存条为例:
首先在面级别下选中内存条上所有的芯片,在右侧的修改器栏里找到多边形材质ID组,设置材质ID号为2,如图4:
第3页
基于Unity3D的三维虚拟电脑组装实验系统
图4为内存芯片指定材质ID
然后用同样的方法选中内存条的侧边,为它指定材质ID号为1,如图5:
图5为内存条侧面指定材质ID
用这种方法给内存的其它部分也指定ID后,就可以进入材质编辑器,创建一个多维子对象材质,因为总共为内存条指定了5个材质ID,所以需要创建一个包含5个子对象的多维子对象材质,每个子对象材质材质可以单独编辑,漫反射颜色可以纯色也可以贴图,环境光和高光反射根据具体情况进行设置,如图6所示。
由于Unity3D引擎也是支持多维子对象材质的,所以在3DSMax中做的这些工作都不会是徒劳的。
第4页
基于Unity3D的三维虚拟电脑组装实验系统
图6多维子对象材质设置
将用到的贴图保存在一个文件夹里,在导入U3D引擎的时候需要重新进行指定。
准备工作做完之后就可以导入U3D引擎了。
2.3资源导入Unity3D引擎
将三维软件制作的模型导入Unity3D引擎时需要注意一些问题。
首先是X轴向偏转。
3DSMax模型导入引擎后将自动有一个绕X轴270度的偏转,在Unity中旋转模型的时候,Y轴的参照方向永远朝上,而X和Z轴则以模型的自身局部坐标为准,所以当模型旋转270度后,Z轴正好与Y轴重合。
解决这个问题需要将模型文件导出成为.3ds类型的文件再导入Unity。
其次是材质问题。
模型文件导入Unity后,Unity只会自动生成材质球,但是材质的贴图需要手动导入Unity工程然后进行指定。
如果模型具有法线贴图或者光照贴图,还需要选择正确的着色器(Shader)才能达到想要的效果。
最后是缩放因子。
三维模型的单位需要在前期建模的时候就设置并统一,否则模型出来的大小会不匹配。
Unity中的1单位是fbx文件中1单位的100倍,因此如果Unity中1单位定义为1米的话,那么在3DSMax中制作模型的时候,单位就应该设置为1厘米。
缩放因子在导入模型时也可以手动设置,如果是以fbx格式的文件导入的模型,可以将模型的缩放因子设置为0.01。
将外部资源导入Unity有三种方式。
第一种方式是存入工程文件夹。
创建工程以后,在磁盘上会有一个工程文件夹,找到工程名下的Asset文件夹,将需要的模型资源、贴图资源复制粘贴到这里即可。
为了工程结构的简洁明了以及方便查找资源,可以分别为模型和贴图创建自己的文件夹。
第二中方式是在直接拖入到Unity中。
在外部文件夹中选中需要导入的资源,直接拖拽
第5页
基于Unity3D的三维虚拟电脑组装实验系统
进Unity的Project窗口中即可。
第三种方式主要是用来导入.unitypackage类型资源。
Unitypackage是Unity打包文件生成的一种格式。
在Unity的顶部菜单栏找到Asset?
ImportPackage?
CustomPackage,在本地磁盘找到需要导入的unitypackage文件点击确定就行了,如图7所示。
图7导入unitypackage文件图8模型导入设置
模型导入U3D后需要设置一些参数,正确设置这些参数,模型才能更好的被程序使用。
选中导入的模型,在监视器窗口会出现如图8的菜单。
其中有几个主要参数需要进行设置:
ScaleFactor——前面提到的缩放因子,这里我根据实际模型的匹配需要将它设置为0.004。
MeshCompression——面片压缩。
优化模型的面数从而优化最终程序的性能。
Read/WriteEnabled——勾选将使得导入的资源可以在引擎内被读写。
GenerateColliders——生成碰撞器。
勾选将会生成匹配模型的碰撞器。
其他的参数因为在这个系统中无需用到,所以按照默认的参数设置就可以了。
3.Unity3D引擎研究
3.1引擎介绍
Unity3D是一个用于创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的综合型的创作工具,开发者是UnityTechnologies,目前最新的稳定版本是2013年12月发布的4.3.1。
2005年6月Unity第一个版本1.0.1发布,标志着Unity的诞生。
Unity是一个跨多平台的游戏引擎,利用交互的图形化开发环境作为编辑器提供给开发者,可运行在Windows和MacOSX下,可发布应用到Windows、MacOSX、Android、iOS、Web等平台。
第6页
基于Unity3D的三维虚拟电脑组装实验系统
Unity拥有以下主要特性:
层级式的综合开发环境、视觉化编辑,详细的属性编辑器和动态游戏预览。
跨平台支持。
可以开发Windows、MacOSX、iOS、Android、Blakberry、Xbox、WindowsPhone等平台的应用程序。
自动资源导入。
项目中的资源会被自动导入,并根据资源的改动自动更新。
基于Direc3D(Windows)、OpenGL(Mac、Windows)的图形引擎,并且有自己的API(Wii)。
支持Bumpmapping、Reflectionmapping、Parallaxmapping、ScreenSpaceAmbient
Occlusion,动态阴影使用的是ShaderMap技术,并支持Render-to-Texture和全屏PostProcessing效果。
Shader编写使用ShaderLab语言,同时支持自有工作流中的编程方式或CG、GLSL语言。
内置对Nvdia的PhysXphysicsengine支持。
游戏脚本是基于Mono的Mono脚本,开发者可以使用JavaScript、C#或Boo语言编写脚本。
音效系统基于OpenAL程序库,可以播放OggVorbis压缩音效,视频采用Theora编码。
3.2事件函数、脚本执行顺序和生命周期
Unity中的脚本不像常规程序在一个循环中的执行直到任务完成,而是通过调用一些事先声明好的函数,断断续续的将控制权传给一个脚本。
当一个函数执行完毕后,控制权便又交回给Unity。
这些函数就是事件函数。
下面按照脚本的执行顺序介绍一些常用的Unity事件函数。
Awake()。
当前控制脚本实例被装载的时候调用。
一般用于初始化整个实例时使用。
Start()。
当前控制脚本第一次执行Update之前调用。
Update()。
最常用的事件函数,每帧都执行一次。
FixedUpdate()。
每固定帧绘制时执行一次,与Update不同的是FixedUpdate是渲染帧执行,当渲染效率地下时,FixedUpdate的调用次数也会跟着下降。
OnEnable()。
当脚本被启用时调用。
OnDisable()。
当脚本被禁用时调用。
OnDestroy()。
当脚本的宿主物体被销毁的时候调用。
Unity中编写的脚本一般都会绑定到一个GameObject上,这个GameObject就是程序中的一个基础元素。
一个脚本的生命周期就是和它绑定的GameObjec息息相关的,当程序开始运行的时候,Unity会为每一个场景中活跃的GameObject上的脚本生成一个对象,而当脚本的宿主物体(即脚本所绑定的物体)被销毁的时候,脚本的对象也就不存在了。
Unity的脚本默认都会继承与MonoBehavior基类。
不继承于MonoBehavior的类通常用来存放一些全局的数据,它在整个程序运行的过程中都是存在的。
第7页
基于Unity3D的三维虚拟电脑组装实验系统
3.3常用API
Transform类。
继承于Component类,用于描述和控制一个三维或者二维物体的位置、旋转和缩放属性,。
在Unity的场景中,每一个物体都有一个Transform组件,被用来存储和操控位移、旋转和缩放。
Transform允许拥有父对象,子对象的属性基于父对象发生偏移。
其类图如图9所示。
Transform的常用属性有:
childCount:
当前Transform所拥有的子对象的数量。
eulerAngles:
旋转的欧拉角度数。
localEulerAngles:
当前Transrom相对于父对象的旋转欧拉角。
localPostion:
相对于父对象的位置
localRotation:
相对于父对象的旋转。
Parent:
此Transform的父对象。
Transfrom的常用方法:
DetachChildren:
分离所有子对象。
Rotate:
指定一定的旋转角度给当前的对象。
RotateAround:
让当前的对象绕着某一个指定的点旋转一定的角度。
Translate:
让当前对象的位置沿着指定的方向和距离移动。
Vector3类。
三维向量类,使用它来记录一个物体在三维空间里X、Y、Z轴上的位置、旋转和缩放信息。
Vector3类定义了一些静态变量来代表一些常用的三维向量,如Vector3.back表示的的是Vector3(0,0,-1),Vector3.forward表示的是Vector3(0,0,1)等等。
在编程过程中可以直接快捷的使用这些变量。
Vector3的常用属性有:
Magnitude:
返回当前三维向量的长度(只读)。
Normalized:
返回当前向量的标准向量。
X:
当前向量的X值。
Y:
当前向量的Y值。
Z:
当前向量的Z值。
Vector3的常用方法有:
Angle:
返回两个Vector3向量之间的夹角。
Cross:
返回两个Vector3向量的叉乘。
Lerp:
在两个Vector3向量之间线性差值。
第8页
基于Unity3D的三维虚拟电脑组装实验系统
MoveTowards:
直线移动一个点到目标点。
图9Transfrom的类图
3.4Unity3D的第三方UI插件NGUI
NGUI是严格遵循KISS原则并用C#编写的Unity插件,提供了强大的UI系统和事件通知框架,代码简洁并且易于扩展。
作为目前最受欢迎的Unity的UI插件,甚至完全取代了Unity自身所提供的UI系统,那么它的特色在哪里呢,
NGUI完全集成到Inspector面板中,并且不需要点击Play按钮就能直观的看到效果。
它基于组件、模块化的特性,使用户只需要为界面空间附加相应的行为就可以达到目的,而不需要编写码。
除此之外,NGUI还具有十分灵活的事件系统,可以让发杂的UI占用一个drawcall,还支持光照贴图、法线贴图、折射等特性。
NGUI的使用方式与Unity的使用方式一样。
使用WidgetTool可快速创建模版化的控件,也可以从基本组件创建自己的控件。
可以按照开发者的意愿拷贝或者粘贴,还可以把制作好的窗口保存为Prefab(预制,可复用的物体)。
所有一切都只需要简单的点击操作就可以完成,当需要编写代码让控件产生一些效果时,NGUI提供了丰富的接口供开发者使用,开发者也可以选择参考简单的例子胆码,把控件转变为按钮、输入框或者基于时间来改变控件颜色、播放声音和触发动画等等。
要在Unity中使用NGUI,必须先导入NGUI的unitypackage包。
成功导入到项目中后,在顶端的菜单栏里可以看到如图10所示的NGUI的菜单栏:
第9页
基于Unity3D的三维虚拟电脑组装实验系统
图10NGUI的菜单
开发者可以利用这些功能快捷的创建出自己的UI系统。
同时NGUI也提供了一些实例场景共初级开发者学习借鉴,如图11所示。
图11NGUI的示例UI
3.5材质、灯光和着色器
材质,简单的说就是物体看起来是什么质地。
材质可以看成是材料和质感的结合,在渲染过程中,它代表的是物体表面各种可视属性的结合,比如表面的色彩、纹理、光滑度、透明度、反射率、折射率、发光度等。
着色器的作用就是把物体表面的各种属性结合起来。
Unity内置了有80多个着色器,能够满足大多数基本场景的渲染。
这些着色器分为标准着色器、透明着色器、透明镂空着色器、自发光着色器、反射着色器五大部分。
开发者可以使用ShaderLab语言开发更多自定义的着色器,来满足实际项目的需要。
没有灯光,什么都是不可见的。
因此,给场景物体赋予了材质以后,还需要配合灯光将它展示出来。
Unity内置有四种类型的灯光,它们分别是平行灯光(DirectionalLight)、点灯光(PointLight)、聚光灯(SpotLight)、区域灯光(AreaLight)。
平行灯光多用来模拟太阳光,点灯光和聚光灯多用来模拟室内照明装置,区域灯光可以用来制作区域发光体。
在Unity的工程里创建好一种类型灯光后,可以在监视器(Inspector)窗口里调节它的具体属性,如图12所示:
第10页
基于Unity3D的三维虚拟电脑组装实验系统
图12灯光的属性调节
Type可以切换灯光的类型,Range改变灯光的照射范围,Color代表灯光的颜色,Intensity是灯光的强度,ShadowType是指灯光的阴影类型。
4.虚拟电脑组装实验系统实现方案
4.1系统简介
本系统是基于Unity3D引擎实现的一个帮助实验者完成电脑组装实验的系统。
用户可以通过此系统了解台式机的各种硬件以及这些硬件之间的联系,通过何种方式联合工作的,最后在一个虚拟的场景里,用户可以亲自操纵电脑的各个部件来组装一台电脑。
整个系统分为四个模块。
主界面模块、基础知识模块、硬件展示模块、教程演示模块和实战装机模块。
它们之间的关系如图13所示:
图13模块关系图
系统程序的运行流程图如图14所示:
第11页
基于Unity3D的三维虚拟电脑组装实验系统
图14程序运行流程图
4.2实现方案介绍
虚拟装机系统的核心部分是三维场景摄影机的控制和控制物体在XYZ三个坐标轴上的移动旋转。
。
输入与摄影机相应的对应表格设计如表1所示:
表1摄像机控制
输入响应
ALT+鼠标左键摄像机以当前目标点为中心旋转ALT+鼠标滚轮拉近或者拉远摄像机视角ALT+鼠标中键移动摄像机位置
加入Alt键的目的是为了区分选中电脑部件和操控摄像机,控制电脑部件的输入与响应对应的表格设计表2所示:
表2物体的控制
输入响应
鼠标左键+移动移动物体
(Gizmo未显示情况下)鼠标右键单击显示物体在三个轴向上得Gizmo鼠标左键单击Gizmo在三个轴向上旋转物体(Gizmo显示情况下)鼠标右键单击隐藏Gizmo
第12页
基于Unity3D的三维虚拟电脑组装实验系统
用户界面方面,我用NGUI的摄像机来渲染所有的UI界面元素,因为NGUI的控件事件响应需要NGUI的Camera支持。
同时为了渲染3D的场景,需要另外架设一个3D摄像机。
4.3系统主界面实现
系统主界面主要是提供进入其他场景的入口,是一个二维的场景,直接用NGUI来搭建就行了,完成的效果如图15所示:
图15系统主界面
首先界面所有的图片都需要打包成NGUI的Atlas,这是NGUI为减少DrawCall的一种方案。
将所有的UI元素打包成一个图集,所以在绘制不同的UI的时候,系统只需要调用一次DrawCall就行了。
其次,为了显示中文字体,需要制作字体。
NGUI提供两种字体方案,第一种是动态字体(DynamicFont),另一种是静态字体(NormalFont)。
动态字体的原理是每一次使用字体的时候系统都去字体库读取字体,将读取到的信息渲染成一张纹理显示出来,这样做会消耗系统的性能,但能带来的好处是不会受限制的使用你想要任何文字,而且制作也较为方便。
静态字体是提前将需要的文字制作成一张纹理。
这种方式需要提前预估需要用到的文字,然后使用BMFont软件制作纹理,导入NGUI生成字体预制才能使用。
它的缺点是步骤繁琐,而且可能遇到制作的字体纹理无法满足后续的需求,导致需要重新制作的问题。
但它也有运行比较稳定,且比较节省资源的优点。
有了字体和图片就可以在工程里把UI层级搭建起来了,场景元素的层级结构如图16:
第13页
基于Unity3D的三维虚拟电脑组装实验系统
图16主界面场景元素层级图
场景物体之间的通讯关系如图17所示:
图17主场景物体间通讯方式
所有的按钮都只和LoadScene这个脚本通讯。
当用户发生点击事件时,就通知LoadScene脚本执行相应的操作。
LoadScene脚本定义了LoadFoundation()、LoadHardWare()、LoadExperience()、LoadInstructions()、Exit()方法,分别响应不同的按钮事件。
4.4基础知识介绍场景的实现
基础知识场景的作用是向用户展
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Unity3D 三维 虚拟 电脑 组装 实验 系统 开发 毕业论文
![提示](https://static.bdocx.com/images/bang_tan.gif)