3D场景(通用7篇)
3D场景 篇1
1 引言
X3D三维立体X3D室外景观场景设计是利用软件工程思想开发设计,采用先进的渐进式软件开发模式对虚拟现实X3D室外景观场景进行开发、设计、编码、调试和运行。虚拟现实X3D室内景观场景设计按照软件工程思想,从需求分析、总体设计、详细设计、编码和测试过程中,循序渐进不断完善软件的项目开发。
X3D室外景观场景设计,利用虚拟现实语言X3D中的几何节点、复杂节点、效果节点、纹理图像绘制技术以及动态智能感知节点等,创建一个X3D室内三维立体场景和造型。使用复杂节点和造型外观材料节点创建一个山脉造型,利用动态智能感知节点实现动画效果。
2 X3D室外立体场景
虚拟现实X3D室外场景设计是利用虚拟现实程序设计语言开发室外场景设计、布局和装饰等三维立体场景。采用软件工程设计思想,融合传统软件开发模式和先进的渐进式软件开发模式。创建逼真的虚拟现实X3D室外设计场景,使现实空间与虚拟空间相融合,感受虚拟现实技术的无穷魅力。
虚拟现实X3D室外景观场景开发与设计,主要对自然景观、人造景观场景进行虚拟现实仿真。运用软件项目开发技术和计算机前沿软件开发工具X3D语言,对虚拟现实室外场景进行开发与设计。X3D室外设计包括自然景观和人造景观,如广场设计、绿化设计以及装饰灯场景设计等。利用虚拟现实程序设计语言中各种基本节点、复杂节点以及智能动态感知节点实现三维立体场景的设计和动画制作,感受虚拟世界独特魅力的动态交互和身临其境的沉浸感。
虚拟现实X3D室外场景设计是采用先进的渐进式软件开发模式,对虚拟现实场景和造型进行开发、设计、编程及调试。利用虚拟现实程序设计语言X3D开发工具对三维立体场景进行编码、测试和运行。利用结构化、模块化、组件化以及面向对象的开发设计思想,采用循序渐进的策略,开发虚拟现实软件工程项目。
3 X3D室外场景造型设计
虚拟现实X3D室外场景造型设计是利用软件工程思想开发设计,采用渐进式的软件开发模式对虚拟现实X3D室外场景造型进行开发、设计、编码、调试和运行。虚拟现实X3D室外场景造型设计按照需求分析、设计和编码的过程,循序渐进不断完善软件的项目开发。
虚拟现实X3D室外场景造型设计由广场设计、装饰灯、台阶和绿化带设计等组成,创建室外造型场景设计。采用模块化、组件化设计思想,层次清晰、结构合理的虚拟现实X3D室外场景造型设计。虚拟现实X3D室外场景造型设计层次结构,如图1所示。
X3D室外三维立体场景设计:利用几何节点的纹理贴图技术和造型外观材料节点进行颜色绘制设计,运用动态智能感知节点,实现X3D室外三维立体场景设计的绚丽景观设计。X3D室外三维立体场景设计由X3D头节点与场景(Scene)根节点构成。任何X3D场景或造型都由X3D节点、场景(Scene)根节点、基本几何节点、纹理节点以及动态感知节点构成,将几何节点进行纹理绘制、造型外观颜色设计,构造出生动、逼真、鲜活的X3D室外三维立体场景和造型。
4 程序实例
虚拟现实X3D室外场景造型设计利用虚拟现实程序设计语言X3D对虚拟现实室外三维立体场景进行设计、编码和调试。利用现代软件开发的极端编程思想,采用绝对编程、自动测试、简单设计以及先测试后设计开发理念,融合结构化、组件化和模块化的设计思想,使软件开发设计层次清晰、结构合理。利用虚拟现实语言的各种节点创建生动、逼真的X3D室外三维立体场景和造型。
使用背景节点、视点节点、组节点、坐标变换节点、内联节点、重定义节点、重用节点以及复杂节点等进行设计和开发,利用内联节点实现子程序调用,实现模块化和组件化设计。使X3D室外三维立体场景和造型在虚拟现实场景中更加逼真、鲜活和生动。
利用X3D-Edit专用编辑器或记事本编辑器直接编写*.x3d源程序,在正确安装X3D-Edit专用编辑器前提下,启动X3D-Edit专用编辑器进行编程。利用X3D基本几何节点、背景节点、内联节点和复杂节点等编写X3D源程序。
虚拟现实X3D室外三维立体场景和造型设计px3d8-2.x3d源程序,利用X3D几何节点、内联节点以及复杂节点进行开发与设计编写源程序,使用X3D背景节点、几何节点、内联节点、纹理节点以及动态感知节点等设计编写,源程序展示如下:
虚拟现实X3D室外三维立体场景设计运行程序,首先,启动BS Contact VRML-X3D浏览器,然后打开“X3D源程序实例/px3dmain.x3d”,即可运行虚拟现实X3D室外三维立体场景造型程序,如图2所示。
5 展望
虚拟现实X3D大有一统网络三维立体设计趋势。X3D在三维节点的基础上,又增加了新的二维节点,并且可以很方便地加入新的参数化图元,在X3D标准中还可以很方便地引入NURBS等新的对复杂几何体的描述方式。在交互和程序整合方面,X3D也对此做了重大改进。为了适应软件项目的开发,还建立了相应的工作组。如CAD工作组就在进行X3D/CAD标准交换格式的研究。MPEG4工作组也在进行MPEG4中应用二维和三维交互的研究。此外各个X3D公司还开发了工具包以提供给X3D的应用程序使用。
虚拟现实X3D有着巨大的市场开发空间和应用前景,X3D交互式三维图形技术解决了网络上大规模应用程序的开发问题。X3D成为国际三维图形标准和规范,采用构件化、组件化的设计思想,具有很强的可扩充性,在电子商务、可视化仿真、数据库可视化、科研、教育以及娱乐等领域都有很好应用前景。由于X3D本身的平台无关性、易扩展性、实用性和灵活性,尤其是与XML的集成,非常适合于分布式虚拟环境系统的开发,对虚拟城市的网络化起到极大的推动作用。X3D的出现为分布式虚拟城市系统的开发和实现提供了一个良好的契机。X3D的组件化、可扩展、可定制的特点将大大扩展X3D技术的应用。X3D将不局限于桌面电脑平台上的应用。X3D可以应用到包括手机、PDA、机顶盒、CAVE设备、头盔显示器、数据手套、三维打印机、三维扫描仪等不同的高端与低端设备上。
参考文献
[1]张金钊, 张金镝, 张金锐.虚拟现实三维立体网络程序设计语言.清华大学和北京交通大学出版社, 2004.
[2]张金钊, 张金锐, 张金镝.VRML编程实训教程.清华大学和北京交通大学出版社, 2005.
[3]张金钊, 张金锐, 张金镝.X3D虚拟现实设计.电子工业出版社, 2007.
[4]张金钊, 张金锐, 张金镝.虚拟现实与游戏设计.冶金工业出版社, 2007.
[5]张金钊, 张金锐, 张金镝.X3D三维立体动画与与游戏设计.电子工业出版社, 2007.
[6]张金钊, 张金锐, 张金镝.X3D三维立体网页设计 (立体动画游戏设计) .中国水利水电出版社, 2009.
[7]张金钊, 张金锐, 张金镝.X3D动画游戏项目开发与设计.中国水利水电出版社, 2010.
X3D行驶汽车动画场景设计 篇2
X3D虚拟现实技术是计算机前沿科技,是目前计算机虚拟现实领域最前沿的一种新型语言。它是宽带网络、多媒体、三维立体动画和游戏设计、人性化动画设计、信息地理及人工智能相融合的高科技产品,是把握未来网络、多媒体、游戏设计及人工智能的关键技术。它将引领计算机发展的新潮流,有一统Web3D(计算机网络3D)的趋势,成为21世纪主流软件工程项目开发工具和手段,具有划时代重要意义。虚拟现实系统有别于其他计算机系统的最本质区别是“模拟真实的环境”。虚拟现实系统模拟的是“真实环境、场景和造型”,把“虚拟空间”和“现实空间”有机结合形成一个虚拟的时空隧道,即虚拟现实系统。
X3D三维立体行驶汽车动画动态场景设计采用虚拟现实技术模式开发与设计,利用X3D虚拟现实程序的背景节点、模型节点、复杂节点、空间变换节点、内联节点以及动态感知节点等进行开发与设计,在公路上有飞驰汽车,路边有绿化树木和人行道等,给浏览者以身临其境的动态交互感受。
虚拟现实技术是指利用计算机系统、多种虚拟现实专用设备和软件构造一种虚拟环境,实现用户与虚拟环境直接进行自然交互和沟通技术。人类是世界的主宰,人通过虚拟现实硬件设备,如:三维头盔显示器、数据手套、三维语音识别系统等与虚拟现实计算机系统进行交流和沟通。使人亲身感受到虚拟现实空间真实的身临其境的快感。
2 场景开发
X3D行驶汽车动画场景设计是利用虚拟现实语言X3D开发与设计。虚拟公路场景与现实公路场景相融合,创建出逼真三维立体公路汽车场景。虚拟现实公路场景包括公路设计、人行道设计、绿化带设计以及行驶汽车设计等,在虚拟现实公路场景设计中,体验虚拟世界给人们带来的现实生活无法比拟的身临其境的沉浸感受。
X3D虚拟现实行驶汽车动画场景设计是利用软件工程思想开发设计,采用渐进式软件开发模式对虚拟现实公路行驶汽车场景进行开发、设计、编码、调试和运行。虚拟现实公路行驶汽车场景设计按照需求分析、设计和编码过程,循序渐进不断完善软件的项目开发。虚拟现实公路行驶汽车场景设计由公路设计、布局和汽车设计等组成,创建逼真的虚拟现实三维立体公路行驶汽车场景。其中包括公路设计、人行道设计、绿化带以及行驶汽车场景设计等。采用模块化、组件化设计思想,层次清晰、结构合理的虚拟现实公路场景设计。X3D虚拟现实行驶汽车动画场景设计层次结构如图1所示。
3 源程序
X3D虚拟现实行驶汽车动画场景设计利用虚拟现实程序设计语言X3D对公路交通设施三维立体场景进行设计、编码和调试。利用现代软件开发的极端编程思想,采用绝对编程、自动测试、简单设计以及先测试后设计开发理念,融合结构化、组件化和模块化的设计思想,使软件开发设计层次清晰、结构合理。利用虚拟现实语言的各种基本节点、复杂节点和动态感知节点,创建生动、逼真、鲜活的三维立体公路场景和造型。
使用背景节点创建公路空间背景场景,利用视角节点、坐标变换节点、内联节点、组节点、重定义节点、重用节点以及面节点等创建汽车、绿化带以及人行道等。使用内联节点实现子程序调用,实现模块化和组件化设计。使用时间传感器节点、动态插补器节点、事件和路由等设计公路行驶汽车场景。动态插补器节点使三维立体公路场景更加逼真、生动和鲜活。
利用X3D-Edit专用编辑器或记事本编辑器直接编写*.x3d源程序,在正确安装X3D-Edit专用编辑器前提下,启动X3D-Edit专用编辑器进行编程。利用X3D基本几何节点、背景节点、复杂节点以及动态感知节点等编写X3D源程序。
X3D行驶汽车三维立体动画场景造型设计px3dmain.x3d源程序,利用X3D几何节点、复杂节点以及动态感知节点进行开发与设计编写源程序,使用X3D背景节点、面节点、纹理节点以及动态感知节点等设计编写,源程序展示如下:
X3D行驶汽车三维立体动画场景造型设计,在主程序中利用内联节点实现子程序调用,在子程序中使用模型节点、几何节点、面节点以及纹理节点创建公路场景和造型,虚拟现实X3D公路场景造型源程序:gonglu.x3d子程序。
X3D行驶汽车三维立体动画场景造型设计运行程序,首先,启动BS Contact VRML-X3D 7.0/7.2浏览器,然后打开“X3D源程序实例/px3dmain.x3d”,即可运行虚拟现实X3D行驶汽车三维立体动画场景造型,如图2所示。
4 展望
X3D联盟一直致力于统一各种Web3D格式,容纳各种新技术的三维格式标准,低开发成本、标准化和扩展功能将成为X3D的一个巨大优势。相信X3D将会在交互三维领域取得巨大成功,并且继续发展下去。X3D大有一统网络三维立体设计的趋势,具有划时代意义。虚拟现实X3D有着巨大的市场开发空间和应用前景,X3D交互式三维立体程序设计解决了网络上大规模应用程序的开发问题。X3D成为国际三维立体图形标准和规范,采用构件化的设计思想,具有很强的可扩充性,在电子商务、可视化仿真、数据库可视化、科研、教育以及娱乐等领域都有很好应用前景。由于X3D本身的平台无关性、易扩展性、实用性和灵活性,尤其是与XML的集成,非常适合于分布式虚拟环境系统的开发,对虚拟城市的网络化起到极大的推动作用。X3D的出现为分布式虚拟城市系统的开发和实现提供了一个良好的契机。X3D的组件化、可扩展、可定制的特点将大大扩展X3D技术的应用。X3D将不局限于桌面电脑平台上的应用。X3D可以应用到包括手机、PDA、机顶盒、CAVE设备、头盔显示器、数据手套、三维打印机、三维扫描仪等不同的高端与低端设备上。
摘要:X3D行驶的汽车动画场景开发与设计是利用X3D虚拟现实语言的复杂节点、背景节点、模型节点、空间变换节点、内联节点以及动态感知节点等, 开发设计出生动、鲜活、逼真的三维立体行驶的汽车动画场景造型 (在公路上有行驶的汽车, 路边有树木和人行道等) 。
关键词:X3D,VR技术,行驶汽车动画设计
参考文献
[1]张金钊, 张金镝, 张金锐.虚拟现实三维立体网络程序设计语言.清华大学和北京交通大学出版社, 2004.
[2]张金钊, 张金锐, 张金镝.VRML编程实训教程.清华大学和北京交通大学出版社, 2005.
[3]张金钊, 张金锐, 张金镝.X3D虚拟现实设计.电子工业出版社, 2007.
[4]张金钊, 张金锐, 张金镝.虚拟现实与游戏设计.冶金工业出版社, 2007.
[5]张金钊, 张金锐, 张金镝.X3D三维立体动画与与游戏设计.电子工业出版社, 2007.
[6]张金钊, 张金锐, 张金镝.X3D三维立体网页设计 (立体动画游戏设计) .中国水利水电出版社, 2009.
3D场景 篇3
计算机图形学在真实感应用方面经常采用粒子系统完成特殊的场景特效, 比如三维游戏场景、影视特效等。该粒子系统是由运动的微小个体构成, 特点是不规则、随机、非静止、体积极小。所以在设计时往往被简单定义为四边形面片, 且具有产生、发展和消灭的历程。
本文以游戏场景为基础, 首先构建游戏中的一个改进型的粒子系统, 并在其基础之上进行火焰的效果模拟。
2. 构建游戏场景中的粒子系统
在三维游戏场景中, 粒子系统的主要功能是模拟一系列的场景特效。比如, 飘落的雪花、焰火的火星以及未来武器所发射的“子弹”等都包含了大量行为相似的微小粒子, 粒子系统就常常被用来模拟此类现象。粒子系统根据粒子的产生、变化和消灭来描述场景。
2.1 粒子系统中的基本概念
粒子系统:粒子系统是由总体具有相同的表现规律, 个体却随机表现出不同特征的大量显示元素构成的集合。对于粒子系统有三个性质要素:群体性;统一性;随机性。
粒子和点精灵:粒子是一种微小的物体, 在数学上常用点来表示其模型。所以显示粒子时, 使用点图元是一个很好的选择。点精灵 (Point Sprite) 是一种特别的点图元, 可进行纹理映射及变化尺寸。点精灵是具有中心点位置和大小的粒子, 在渲染时根据其中心位置和大小自动算出四边形的4个顶点且自动旋转面朝观众。
粒子的属性:用质点来构建物体模型, 该质点称为粒子, 每个粒子都有其自身属性, 包括纹理、位置、颜色、尺寸和行为等, 根据应用场景的不同粒子属性也有所不同。一个粒子除了位置和颜色属性外还有速度等其他属性。
粒子发射器:发射器好比一把枪, 粒子往往是由这把枪产生并发射的, 发射器将每个粒子的参数初始化, 并且提供所有粒子共同的属性参数 (将粒子的共同属性保存在发射器而不是每个粒子里面会大大节省内存空间) [1]。
2.2 粒子系统的实现
粒子系统是众多粒子的集合, 并负责对这些粒子进行维护和显示。粒子系统跟踪系统中影响所有粒子状态的全局属性, 例如粒子的尺寸、粒子的粒子源、将要映射到粒子的纹理等。粒子系统主要负责更新、显示、杀死、以及创建粒子。在它生命周期的每一时刻, 它都需要完成下面的工作:
(1) 粒子源产生新的粒子:该步骤是粒子的初始化步骤, 在初始化的过程中, 我们对新生成的粒子进行内存空间的分配和粒子的各个属性的初始化。
(2) 更新粒子属性:更新所有粒子的属性, 在这个步骤当中, 将粒子的生命周期递减一个时间步。
(3) 删除死粒子:检查每个粒子的生命期是否为0, 或者粒子的坐标超过指定的空间边界, 如果是, 则删除粒子, 粒子删除之后可以根据具体的需要决定是否重新初始化或者做其它的处理。
(4) 绘制粒子:显示粒子系统中所有现存的粒子。
对于粒子数量较多的时候, 如果每帧都刷新绘制所有粒子, 无疑是非常浪费资源的, 所以我们采用一个容量合理的顶点缓存。然后可以将顶点缓存划分为若干片段。例如粒子总数为2000个, 我们将每个片段的尺寸指定为可容纳500个粒子, 然后创建全局变量i=0, 用该变量来跟踪当前片段。绘制过程如下:
(1) 更新所有粒子。
(2) 将全部活动粒子绘制。若顶点缓存未满, 则用D3DLOCK_NOOVERWRITE (追加方式) 锁定片断i。将500个粒子复制到i中。若顶点缓存已满, 则:i设为0, 用D3DLOCK_DISCARD (将当前内容丢掉, 重获缓存指针) 锁定片断i。将500个粒子复制到i中。
(3) 绘制片断i中的粒子。
(4) 下一片断i++。
对以上两种方法进行简单的比较, 可容易看出:方法一:操作直观易懂但是缺乏效率, 占用过多内存, CPU与图形卡没有协同工作。方法二:操作有些复杂, 但节约内存用量, 效率高[2]。
3. 火焰效果的实现
火焰具有如下的特点: (1) 具有持续性; (2) 形状的变化。火焰会有特殊的显示效果, 如摇曳等; (3) 颜色的变化。火焰从焰心到外焰颜色呈现从亮白色到黄色、红色的变化。[3]
3.1 火焰粒子的初始化
火焰的初始粒子数量很重要, 它决定了火焰的密度和逼真度, 粒子越多、越密, 则火焰的效果越好, 但是也需要考虑内存的消耗。
粒子的初始位置设为pos, 由粒子的产生区域决定。一般来讲, 粒子系统的发射器都是从某一个点或者某一个平面 (如xoz平面) 发射[1], 这样的发射器在火焰的模拟中并不灵活, 模拟出的火焰格外呆板, 故而采用自定义形状的发射器。
如公式1, pos是粒子的初始位置, pos0是自定义粒子发射器的参考中心位置, 而Area向量表示自定义发射器的区域, rand () 表示随机函数, 即随机从区域内任意一点发射火焰粒子。
对于火焰粒子的初始速度, 可以参考公式2。
Mean Speed和Var Speed分别表示粒子的平均初始速度和速度变化范围, 这样可使得火焰粒子的初始速度显得不同。
3.2 使用关键帧技术
所谓关键帧就是指粒子系统的行为可以以帧为单位来控制, 或者说是粒子的行为和时间满足一个函数关系。例如模拟火焰, 火焰由某个位置生成, 受热气作用向上漂浮, 到了一定高度或者向四周散开, 或者归笼到一起形成火焰尖, 这种粒子在中途的行为发生很大变化的物资就要借助关键帧技术[4]。
有了火焰粒子的初始位置和速度, 接下来要考虑的就是粒子的更新及绘制。
假设第n帧和n+1帧的时间间隔为△t, 粒子的位移为s (t) , 粒子的速度和加速度分别为v (t) 和a (t) , 则粒子的运行方程为:
火焰效果的原理是由于受到热气流的影响, 当热气遇到周围冷环境时, 热气体的上升产生的热浮力导致其上面的冷空气被热气体推动, 同时由于气压的改变, 冷空气冲进热气体下面进行补充, 在热气体的两边不同温度的气体相交。产生的拉力促使热气速度变慢而冷气速度加快。
为了模拟这种效果, 可以建立了随机坐标点的数组。用这些随机点来模拟空气流动形成的低压点。在每一帧时间内, 通过某一随机函数改变形成新的低压点数组。当粒子由发射器发射到系统中后, 粒子逐步向离它最近的低压点进行y方向的上升运动。这样, 可以通过这种点的控制产生粒子的灵活的动态运动轨迹。另外, 在x和z方向上也建立随机函数, 模拟风向的不确定性, 即可产生动态的火焰飘忽不定的感觉。此过程将重定义火焰类继承自其父类粒子系统类的粒子运动函数。
3.3 自定义形状的发射器及火焰颜色
每个粒子系统都有个发射器, 此系统的所有粒子都由发射器发出, 一般不作特别定义, 发射器均为某个点, 但是火焰如果从某个点发射, 会显得很失真, 于是自定义一个范围, 在本实验中火焰的发射为一个长方体区域, 所有粒子在此区域内均匀产生。由随机函数具体决定其产生的点。图1为两种发射器的火焰对比。
火焰的颜色是火焰粒子在渲染时的重要的属性之一。在现实中, 火焰的颜色往往是中心颜色亮白, 边缘颜色暗红, 当然也有蓝色和黄色的火焰。对火焰进行计算机模拟时, 模拟单个粒子的颜色在生命周期内由亮度较高的黄白色渐变为红色 (或蓝色等) , 然后变为和背景相近的颜色而消亡, 控制这种颜色过渡平滑, 即可增强了真实感, 这种控制仍然可以利用上述关键帧技术, 重载渐变函数控制粒子颜色属性即可。另外, 火焰的中心位置产生的粒子较多, 可由多个粒子进行混合, 从而在中心部分火焰为亮白色, 外焰部分粒子数逐渐减少, 变为亮黄色, 最后边缘部分变为红色、黑色。这样的混合颜色更加符合真实火焰的颜色变化特性。
3.4 实验环境及结果
根据上述分析, 设计出的基于游戏场景的粒子系统, 并在该粒子系统上进行了火焰效果的模拟, 实验环境为普通PC机的VS2008集成开发环境, 采用direct X图形库, 图2是本实验的最终火焰模拟效果。
实验结果表明:使用上述系统设计并实现的火焰模型模拟效果逼真, 在普通PC上满足实时渲染的需要。.
4. 结束语
在游戏场景的渲染中, 粒子系统的应用相当普遍, 本文做出的这种火焰模拟器有着极大的应用空间。并且, 在此系统基础之上可以做出烟花、闪电、烛光等一系列不规则形体的模拟, 甚至流水、雨雪等也是常见的应用, 这在真实感图形学和游戏场景有广阔的应用前景。
参考文献
[1]张芹, 吴慧中, 谢隽毅, 等.基于粒子系统的火焰模型及其生成方法研究[J].计算机辅助设计与图学学报, 2001, 13 (1) :79-821.
[2]Frank D.Luna.DirectX 9.0 3D游戏开发编程基础[M].清华大学出版社, 2008.
[3]陈大炜, 李利军.基于Vega的虚拟战场对抗仿真应用研究[J].微计算机信息, 2005, 11-1:183-185.
3D场景 篇4
目前基于OSG的动态调度方法主要应用于单一大场景的内存优化[3,4,5],将一个大场景拆分成多个场景区域, 场景区域在二维索引数组中具有各自的索引值,漫游时根据场景摄像机的位置动态调度场景数据,加载进入视点的场景区域,卸载远离视点的场景区域,相当于“ 拼图” 上的拼块, 只具有二维平面结构。 民航飞机维修仿真场景较多, 到达维修场景前通常会进入过渡场景,根据维修任务的不同需要载入多个不同的场景模型,是一种深度遍历的过程。 场景具有树形层次结构特征,常用的OSG动态调度方法不适合解决这类问题。
本文针对民航维修仿真场景特点建立场景树,划分场景结构层次,对庞大的场景数据进行合理分配;提出多场景动态调度方法,使用4 个状态页面队列和内存引用计数来管理各场景页面, 实现对多个3D维修场景的动态加载和卸载;除此之外使用多线程开发的方式进行场景的渲染,增强场景的绘制和传输效率,从而提高渲染帧率,使软件运行更加流畅。
1 场景树结构
OSG采用包围体层次(BVH ) 树结构来保存信息, 即每个场景包括多个子节点(Node)。 在其中选择一个或几个作为开关节点(Switch Node),起到场景转换时桥梁的作用。 维修仿真需按照具体维修任务要求,操作开关节点(舱门等)进入对应的维修场景,有些任务要先进入过渡场景, 操作过渡场景的开关节点后才能到达维修场景。 完成维修任务后,通过开关节点返回之前已访问场景,再进行其他维修任务。
因此将所有场景按照访问的顺序分为根场景、枝节场景及叶场景三层。 第一层的飞机外观模型为根场景,根场景具有多个开关节点,每个开关节点与一个位于第二层的枝节场景对应,而通过枝节场景的开关节点又可以进入第三层的叶场景,如图1 所示。 初始化时根据维修训练环境的不同载入相应的环境模型(机场模型或机库模型),从而使仿真环境更具有真实感。
2 多场景动态调度方法
2.1 场景动态加载
将多个场景数据进行空间页面(Page)划分。 Page为场景数据调度的基本单位,每一个Page对应一个3dmax的OSG或IVE格式的场景模型。 OSG采用状态机保存场景状态数据并对状态队列进行处理,Page的状态信息有4 种:已初始化(inited)、已纹理化(textureload)、已加载( loaded ) 、 已卸载( unloaded ) 。 针对以上四种状态, 创建4个用于方便调度的场景页面队列:初始化队列(InitLoad)、纹理化队列(TextureLoad)、加载队列(PageLoad) 和卸载队列(Unload)。
所有场景Page的动态数据加载和管理都是基于以上队列。 当应用程序启动并且场景初始化完成后,首先加载根场景Page,从事件处理队列(Eventhandlers)获取摄像机的初始坐标和Page本身的渲染数据, 将数据加入PageLoad队列中并立即显示。 根场景Page加载完成后,根据将要载入的枝节场景Page的状态, 加载枝节场景Page 。 加载方法如下:
( 1) 选中当前场景Page中的开关节点来加载相应的枝节场景Page, 将枝节场景Page的数据填充到InitLoad队列,并由数据线程执行数据的预编译工作。 通过预编译可以缓解帧延迟的问题。
( 2) InitLoad获取该场景Page数据后, 将预编译好的数据放入TextureLoad,再通过OSG的渲染器,用对数据进行处理。 渲染器将处理后数据传递给裁减访问器以裁减场景信息,并生成后台的状态树和渲染树。最后,再按照顺序遍历渲染树,执行各个渲染叶的绘制。 此过程中渲染器监控前端数据更新和后台渲染的过程,避免产生数据变度的冲突,并将处理后的数据送入PageLoad中。
( 3) 数据进入PageLoad后,图形系统根据漫游器的位置,调整场景中的摄像机并将数据合并到场景界面中去。 其中,更新场景相机观察矩阵决定了这一帧的场景将如何呈现给终端的用户。 而相机观察矩阵是世界坐标系下的顶点转换到观察坐标系的变换矩阵。
在观察坐标系(VCS)下,用3 个分量w、u、v来表示坐标基向量。 分量w是一个从参考点center指向视点( eye ) 的向量, 相当于世界坐标系( WCS ) 的Z轴; 分量u是视点上方向( up ) 与w的叉积,相当于X轴;而分量v是w与u的叉积,相当于Y轴。 这3 个分量与参考点和视点的关系如下:
世界坐标系下的坐标基向量为x、y、z,WCS向VCS的过度矩阵A为:
考虑到观察坐标系原点和世界坐标系原点的偏移关系,令偏移量为e,场景相机的观察矩阵MVIEW应为:
2.2 场景动态卸载
传统的开发流程只能手动卸载,无需渲染的场景中,当所有已分配的内存空间释放后才能进行其他场景加载。若未能释放所有场景相关数据,则会产生内存泄露,但编写代码去逐个释放场景Page的方法不仅繁杂而且易出错[6]。 而基于OSG的垃圾回收机制可以通过内存引用计数的形式来管理各场景Page, 实现场景Page动态地从内存中卸载的目的。 页面卸载方法如下:
(1)设置一个基于OSG智能指针模板ref_ptr
( 2 ) 首先载入的是根场景, 当载入根场景Page的枝节场景时,根场景Page引用计数值变为2,接着载入叶场景时,根场景引用计数值变为3,枝节场景的引用计数值变为2。 再由叶场景Page回到枝节场景Page时,叶场景Page的引用计数值由1 变为0, 此时系统将该叶场景Page的相关数据送入UnLoad队列并自动从内存中卸载。 根场景Page和枝节场景Page的引用计数值同时也自减1。 这样可以保持内存中的模型数量始终不大于3 个。
填充队列的操作每一帧只进行一次,可避免因单帧加载数据过多而导致的帧冲击。 系统每帧执行的流程如图2 所示。
2.3 多线程方式渲染
场景Page的数据在TextureLoad队列中需经过渲染器处理才可呈现到场景界面。若使用单线程模式渲染会使得程序执行效率较低, 而多线程渲染可将场景的更新、裁减和绘制工作同步进行, 很好地解决了线程之间执行顺序和数据共享的问题, 从而显著地提高渲染效率[7]。OSG中自行创建线程的类包括GraphicsContext和Camera两大类。 每个图形设备类(GraphicsContext)可以创建一个设备图形线程,用于实现多设备并发的绘制操作;相机类(Camera)可创建一个相机线程,将场景裁减任务分离出来,使裁减工作与绘制工作同时进行[8]。
相机线程裁减后的数据通过缓存传递给图形线程绘制。 若缓存中数据在未被当前帧绘制完之前被下一帧裁减后的新数据所覆盖,将导致场景绘制不完整[9]。 为避免这一问题,需要一个双缓存的过程[9],即令当前帧绘制阶段读取“缓存0”中所存数据,而下一帧裁减数据则写入“缓存1”,并在适当时候交换缓存数据。 场景绘制模型如图3 所示。
这种模式的优点在于不必等待前一帧绘制结束就可开始下一帧的更新工作。 但在此期间, 若某个场景Page中的数据进行了动态的变度, 则可能造成绘制工作的错误甚至系统崩溃。 解决这一问题的方法如下:
( 1 ) 程序开发时,将可能发生动态更新的场景Page数据设置为“动态”,并且预设一个动态对象池,将所有可能需要动态更新的场景Page数据都在这个对象池中注册。
( 2) 在当前帧的场景裁减阶段进行动态场景Page数据的收集工作, 一旦某一动态场景Page数据的渲染工作执行完毕,即将动态对象池中的对象数目减 “1”。 当对象数目降为“0”时,认为当前线程中所有的动态场景Page数据绘制完毕, 新的用户更新阶段随时可以开始。
( 3 ) 执行每新一帧的更新阶段前, 检查动态对象池中是否还有正在绘制的动态场景Page数据。 若尚有动态场景Page数据等待绘制,将暂时阻塞新的更新动作;若所有动态场景Page数据都已绘制完, 即使当前的绘制阶段还未完成亦可立即开始新一帧。
上述方法可有效避免可能由动态场景Page数据变更导致的线程间数据冲突问题。 若系统拥有足够高的CPU数量和工作性能,使用这种多线程模式将最大限度地发挥多任务、多图形设备、多CPU系统的场景渲染能力,从而实现多相机并发裁剪与多设备并发绘制的协同操作。
3 软件的实现及应用
采用OSG3.0.1、Visual C++2008 实现了3D虚拟设备维修仿真程序。 在Corei7-3960X 6 核超线程处理器、4 GB内存、AMD ATI HD7970 显卡、Windows7 32 位操作系统的电脑上,系统运行流畅。
本文所给出的方法与常规方法用于飞机维修仿真系统的性能对比如图4 所示。 常规方法主要由数据线程负责场景的调度工作,没有充分利用OSG的其他机制。图4(a)为使用常规方法时,程序内存使用率较高,但GPU和帧速较低,导致程序运行不够流畅。 图4(b)为使用本调度方法后, 同一场景中场景绘制帧速由48.3 Hz变为83.4 Hz , 取得了明显的提升。 降低了内存使用率的同时也提高了GPU的使用率,取得了良好的运行效果。
3D场景 篇5
J ava3D是SUN公司最近几年发布的专为三维场景构建的软件包。它继承了Java语言的优良特性, 为虚拟现实技术的发展开辟了新的路径。它的跨平台性, 面向对象性与当前网络技术相结合, 更为虚拟现实技术做出了巨大的推动作用。Java3D给我们编写三维应用程序提供了一个非常完善的API, 它可以帮助我们生成简单或复杂的形体 (也可以直接调用现有的三维形体) ;使形体具有颜色、透明效果、贴图;可以在二维环境中生成灯光、移动灯光;可以具有行为 (Behavior) 的处理判断能力 (键盘、鼠标、定时等) ;可以生成雾、背景、声音等;可以使形体变形、移动、生成三维动画;可以编写非常复杂的应用程序, 用于各种领域如虚拟现实。
本文根据现实的网球球场的要求, 利用Java3D开发出用于虚拟现实场景的各种基本形体类, 并用Java和Java3D编写基本形体类生成各种基本形体对象来再现虚拟场景, 实现Java3D虚拟网球比赛场景。
1 系统的构建要素分析
标准的网球场地占地面积应不小于670m2 (长36.60米, 宽18.30米) , 其中双打场地标准尺寸为长23.77米、宽10.97米。如果是两片或两片以上相邻而建的并行网球场地, 两片场地之间距离应不小于5米。网球场的物体构建有以下几个要素:
1) 长方形的网球场再用球网横隔成两个等区。场上纵横交错的白线都有各自的名称, 球场两端的界线称为“端线”, 球场两边的界线称之为“边线”。在球网两侧6.40米处的场内各画一条与边线平行的横线为“发球线”。联结两发球线的中点画一条与边线平行的线称“中线”。中线与球网成“十”字形, 将发球线与边线之间的地面分成四个相等的区域, 称为“发球区”。在端线的中心, 向场内画一条垂直于端线的短线称为“中点”。全场各区的丈量, 除中线外都从各线的上沿计算, 场上所有的线应是同一颜色 (白色或黄色) 。
2) 全场除端线可宽至10厘米外, 其他各线的宽度均在2.5-5厘米范围之内。全场各区域的丈量除中线外, 均从各线的外沿量计算。
3) 单打球网长为10.06米, 双打球网长为12.8米, 球网上沿用5~6.3厘米宽的白色帆布包缝, 并用直径不超过0.8厘米的钢丝绳穿起来, 挂在场中央离边线0.914米以外的网柱上, 球网应充分展开, 完全填满两柱之间的空隙, 球网网孔大小以不让球穿过为准。球网的中央高为0.914米, 并用5厘米宽的白布速带束于地面。要求球网的下边须和地面接触。
4) 地周围空地端线以外至少要有6.40米的空地, 边线以外至少要有3.66米的空地, 如果是室内网球场, 端线6.40米以外的上空净高应不少于6.40米, 室内屋顶在球网上空的净高应不少于11.50米。国际网联规定, 室内馆球场上空的净高应为12.50米。
5) 球场固定物除了球网、网柱、单打支柱、绳或钢丝绳、中心带、网边白布外, 还包括裁判, 球场四周的广告牌、挡网、看台、固定座位、座椅以及安置在场地周围上空的设备, 如照明灯具。
除此之外, 实际的网球比赛场景的构建还包括球拍击球、球弹地和观众呐喊的等声音要素。
2 系统的设计与实现
三维建模是实现网络三维实景可视化系统的基础, 建模的成功与否, 直接影响到运行的效果和场景的逼真度。对于一个复杂的大规模的场景来说, 模型的建立和优化工作是非常重要的。
对现实形体的三维表达, 传统的方法称为基于图形或几何的绘制, 实际上是对真实场景中对象的光线交互过程的模拟。在重建三维形体时, 首先要用造型系统建立场景的几何模型, 然后设置物体的材质和纹理, 定义场景中光源的位置和强度, 最后用绘制算法计算画面上每一个可见点的光亮度。
2.1 场景的声像设计
2.1.1 基本原理
通常Java语言可以编写两种格式的文件:一种是Java Application, 它是一种能适用于任何计算机工作平台的应用程序;另一种是J ava Apple t (J ava小应用程序) , 是专门用于Inte rne t上的程序, 它能直接被嵌入到HTML文件中而被支持Java的Web浏览器解释运行, 从而实现网上设计;其中, Java Applet文件在Java语言中继承了Apple t类, 利用继承类中的一些固有方法, 就能编写自己的小应用程序来实现动画, 接受用户的交互式输入, 实现音乐控制, 完成图形化用户界面设计。而Java Application更适合桌面应用, 因为在本地运行, 对程序的载入迅速, 并且可以调用本地系统的资源, 对复杂的程序提供更强大的支持。
根据这些特点在建设网球虚拟场景时适宜使用Java Application, 因为它不仅能实现灵活编程而且可以实现多机联网进行数据通信, 从而增强场景的互动性。另外因为在本地运行, 程序可以被迅速载入, 比如声音与模型文件较为庞大, 如果使用Java Applet实现, 以目前的网络环境, 程序的载入速度并不理想。
2.1.2 场景中的声音
J ava3D中可以通过Sound类来使用声音。Sound类是一个抽象类, 定义了其它声音子类的公共属性, 包括声音数据、声音强度的增益系数、结束方式标志、播放次数、声音状态、有效范围、优先级和静音播放标志等属性。也可以直接调用Applet.new AudioClip () 方法生成Apple t.Audio对象播放声音。但是Apple t.Audio对象只提供了声音播放、停止、延迟等几个简单功能。在网球场景中并没有用到复杂的声音效果, 而且Applet.Audio调用方式简单, 所以这里使用Applet.Audio对象播放声音。
2.2 模型的导入与动画设计
2.2.1 基本原理
复杂的三维形体一般很难直接通过编程实现, 虚拟建筑环境中的场景对象包含大量复杂的场景对象, 如建筑物, 雕塑, 树木等, 这些三维形体大多由CAD软件生成, 并且在工程设计过程中已经大量存在各种类型的CAD图形文件, 应充分利用这些资源。Java3D可以调用其它格式的三维图形文件来获得复杂形体, 如VRML2.0格式, OBJ格式的三维文件。Java3D也可以间接的调用DWG, DXF, 3DS, DGN格式的三维文件, 一些常用的三维图形软件都提供了不同文件类型的转换程序, 如3DSMAX就可以读入DWG, DXF, 3DS格式的文件, 并把它们转换成VRML2.0的格式。目前常用的三维图形软件有:3DSMAX, Maya等。
2.2.2 在场景中使用模型和动画
J ava3D的com.s un.j3d.loade rs包中包括了Loade r和Sce ne两个接口, 在Java3D中调用不同格式的3D图形文件, 应根据这两个接口编写自己的Loader类, 针对不同类型的图形文件编写不同的Loade r类, 因为采用相同的接口, 对类的使用者来说针对不同类型文件的Loade r调用的方法基本是相同的。在网球场景中使用的是MilkShape3D制作的.m s 3d格式模型, 而J ava3D不支持此格式, 所以需要使用开源的第三方开发包java3dgamesdk, 这个开发包不仅提供了.ms3d格式模型导入、动画播放等功能, 还提供了鼠标、键盘事件监听等功能。
2.2.3 给物体添加纹理
3D物体即使是有了光照和材质, 但其表面还是很单调, 看起来还不十分真实。这是因为在现实世界中的物体, 其表面通常有它的构造细节, 即各种纹理, 如刨光的木材表面上有色彩或明暗度变化体现出来的表面细节, 这种纹理称为颜色纹理。在Java3D中, 纹理是物体表面的细小结构, 可以用来表示物体表面的花纹、图案。这里纹理一般都是二维图像纹理, 当然也有三维纹理。
纹理也被称为纹理映射。纹理一般定义在单位正方形区域 (0≤u≤1, 0≤v≤1, 也常用S, T表示, S表示水平方向, T表示垂直方向) 之上, 称为纹理空间。理论上, 定义在此空间上的任何函数可以作为纹理函数, 而在实际上, 往往采用一些特殊的函数, 来模拟生活中常见的纹理。Java3D中, 首先将矩形图像通过线性插值映射到单位正方形区域, 然后再采用特殊的纹理函数, 将这一正方形映射到物体的几何表面上。
纹理映射的步骤如下:
1) 准备图片
为了保证实时渲染场景的效率, Java3D要求图片的尺寸必须为2的整数次幂, 长和宽可以不相等。如果图片不满足这一要求, 程序在运行的时候会抛出异常 (Exception) 。如果中意的纹理图片不满足这一要求, 那么一定要事先调整好。
J ava3D中, 一般采用工具类Te xture Loade r来导入纹理图片。现在的Texture Loader对象只支持JPEG、GIF图像。
2) 导入图片
这一步就是将图片从磁盘文件装载到内存中的图像对象中。在J ava3D中, 可以从本地文件夹或者URL导入图片。一般使用Te xture Loade r的构造函数即可完成。然后将这一图片保存到Im ageCom pone nt2D对象。
3) 创建纹理对象
这一步就是实现由图片到单位正方形区域的线性插值映射, 可以具体指定映射的模式及边界的模式等。
4) 将纹理与外观绑定
这一步将纹理对象复制给外观对象。通常在这一步还会指定纹理的属性对象。不过在简单程序中可以省略。
2.3 碰撞检测
2.3.1 基本原理
J ava3D提供了两个类Wake upOnCollis ionEntry及WakeupOnCollis ionExit, 这两个类在构造的时候要求提供被检测的范围 (类Bounds的子类) 或三维对象 (类Node的子类) , 当场景图中的任何对象与被检测的对象 (范围) 发生碰撞时WakeupOnCollisionEntry就会被唤醒 (Wake up) , 当碰撞解除时Wake upOnCollis ionExit就会被唤醒。所以我们把它们作为唤醒条件加入Behavior类 (Behavior类是一个抽象类, 是对交互和动画的实现, 连接激励和响应的桥梁) 中, 对碰撞做出反应, Behavior类的方法process Stimulus接收并处理Behavior类的碰撞信息。
2.3.2 人物的运动碰撞检测
本文采用基于几何元素特征对的检测算法。以球场的几何特征为对象, 当运动员碰到网球网、墙壁时, 也就是当运动员的到达球场的边界时, 运动员在这个方向上的坐标将不能改变。
本文利用上二叉树球模型来检测运动人物与物体间的碰撞。
1) 首先要消除那些可以被剪除的分支, 只对那些可能发生碰撞的球进行检测, 这里就两个物体间的碰撞检测进行描述, 多个物体间的碰撞检测可以用递归地调用来进行检测。
2) 取两个代表物体的二叉球树tre e 1和tre e 2, 从根节点开始进行碰撞检测, 如果没有碰撞, 则不可能发生碰撞, 否则用下一级tre e 1的球节点和tre e 2的同级球节点进行检测, 如果tre e 1的一个球节点没有和tree2的同级球节点发生碰撞, 那么就剪除这个节点, 这样就减少了下一级碰撞检测的球数量。同样tree2也和tree1的同级节点进行碰撞检测, 也可以剪除与所有同级不发生碰撞的节点, 持续这个过程, 直到tree1和tree2都被检测完毕。
3 结语
随着计算机软、硬件技术的发展, 以及用户群的不断扩大。软件设计的要求已不再是简单的功能实现, 人机界面、用户体验也被提升到非常重要的地位, 而三维立体的显示方式无疑是最为直观的。通过三维虚拟环境的构建, 创建一个三维空间的虚拟世界, 用户可以通过操作模拟实现的物体与软件进行交互, 使用户全身心地投入到计算机创建的三维虚拟环境中。
本文综合介绍了Java3D的一般要求、原则及方法。根据真实网球场景的构建要素, 设计和实现了一个基于Java3D的虚拟网球比赛场景。下一步的工作主要在于:
1) 优化界面, 使用精度更高的模型和图片。
2) 可以以观众模式进入场景, 并能以第一人称方式观看比赛。
3) 使程序网络化, 能用网络联机进入场景。
摘要:本文先探讨了如何利用Java3D技术建立网球场景、三维几何形体以及设计交互功能等, 研究了Java3D的技术在多媒体素材的处理、三维动画的制作以及添加纹理等方面的综合应用。
关键词:Java3D,网球场景,三维
参考文献
[1]张茂军.虚拟现实系统[M].北京:科学出版社, 2001.
[2]袁海波, 刘厚泉, 吴雪峰.虚拟场景动态交互式可视化的研究[J].电脑与信息技术, 2008.
[3]夏红霞, 刘舂燕, 邹承明, 李兵.基于Direct3D的虚拟三维场景漫游系统实现[J].计算机与信息技术2007.
[4]扈春霞, 王子茹.基于OpenGL的参数化斜拉桥三维可视化的研究[J].江汉大学学报 (自然科学版) 2008.
[5]刘丹丹, 彭达顺.基于Java3D化工网络虚拟场景的构建[J].计算机与应用化学2009.
3D场景 篇6
关键词:数据驱动,约束框架,Unity 3D
1 概述
Unity3D是一个跨平台,层级式的综合游戏开发平台,是一个全面整合的专业游戏引擎,其性价比很高,Unity3D能够支持一些开发语言,可以实现在3D仿真模拟和可视化情景再现等应用中。[1]但当前进行3D仿真模拟和情景再现大多属于固定场景重现,即每次运行时环境和场景都是固定的;许多游戏场景中,某些角色虽然可以自行移动,但其行进路线大多是预先设定好的。这就使得虚拟的3D场景无论显示效果如何逼真,也难以避免内容重复和单调的问题,正所谓“好看不耐看”、“好看不好玩”,形式华丽而缺乏有意义的内涵。古希腊哲学家赫拉克利特曾有名言“人不能两次踏进同一条河流”,现实生活中人们的活动无论如何单调,也不会出现两次完全相同的场景和事件,而在虚拟世界里,这却是一种常见现象。因此,仿真模拟从其内涵方面来看,必须首先破除“不真”:典型特征是场景、事件和角色的重复单调问题;其次是努力“仿真”,即让虚拟场景中的角色和物体行为与现实相拟合。[2]
基于Unity3D的程序开发是事件驱动的。当Unity3D预定义的虚拟事件发生时,Unity3D系统会调用开发人员编写的事件响应脚本,并根据脚本执行后返回的结果调整虚拟实体的状态或触发新的事件。[3]这种编程模式在许多软件系统和平台上被广为采用,因此开发人员非常容易接受。而对于美工人员来说,他们的责任到事件发生为止,不用去关心事件如何响应,也不必等待具体的执行逻辑和结果。因此,事件既是Unity3D程序开发的基础,也是美工和程序员之间的接口,由系统框架提供技术保证和支持,可谓责任明确,泾渭分明。这样的分工充分满足了各方需要,使得Unity3D得以迅速发展。
但如果仅仅聘请最好的美工和最有经验的程序员,就一定能做出好的游戏或仿真场景吗?答案显然是否定的。Unity3D回避了一个它无能为力但又非常重要的关键点:情节。情节是一切游戏和虚拟场景的核心问题。很多知名游戏爆红的第一版画面并不一定精细华丽,但外观更佳的后续版本往往并不能继续得到用户的青睐,其原因往往是情节出了问题。
情节的真实感源于用户或观众基于常识对情节做出是否合理的判断。纯粹由人构想出来的虚拟情节很难不留下破绽。唯一没有破绽的情节,就是对客观事件的虚拟再现,即所谓的“唯真不破”。与其费劲心力去构建随时可能出现破绽的情节,不如直接将真实场景映射到虚拟世界来得方便。这就是解决前述“不真”与“仿真”问题的基本思路:将实际情节和场景(或可进行适当剪裁梳理)引入虚拟世界中。
2 设计与实现
2.1系统分析
将现实引入虚拟并非是一件容易的事情。最重要的问题是现实世界的信息过多、过杂,例外情况层出不穷。因此,需要仔细确定一套抽象程度适中的抽象标准,提出最重要的抽象指标,合理采用性价比最高的抽象方法,将现实世界简化为一组组抽象的数据,从而实现虚拟世界中实际情节的引入。
现阶段物联网(Internet of Things, Io T)和无线通讯等相关技术的快速发展可以对客观世界进行抽象提供成熟可行的工具和手段,因此本文讨论的重点在于获得数据后,如何将数据导入虚拟场景中并以直观的形式再现出来。
借助于目前再次兴起的“物联网”热潮,即把所有物品通过射频识别等信息传感设备与互联网连接起来实现智能化识别和管理,[4]因此现实世界的实体可以通过RFID等技术将代表自身的符号和数据自动提供给Unity3D服务,并按照特定的标准,根据合理的比例尺调整后,在虚拟世界里生成虚拟场景。这样的直接映射虽然可以在虚拟世界里产生现实世界非常准确的重现,但对于后台服务程序而言,这样的映射关系是无法“理解”和使用的。为了能够正确分析和处理前台数据,我们提出了“场景约束框架”的概念,如图1 所示。“场景约束框架”位于“反映现实的抽象和数据”与Unity3D引擎之间,负责将来自于现实的数据根据场景约束规则转换成“合规”且符合Unity3D确定格式的数据。然后再由Unity3D负责将最终场景以图形和动画的形式再现出来。
由于经过了场景约束框架的转换,再现出来的场景本质上和真实场景并非完全一致。打个比方:实景直接映射相当于用照相机“照相”,而经过转换的映射相当于画家“画像”。场景约束的本质是减少现实中过多的细节,把握业务关注的核心问题。从信息论的角度看,这是一种“降噪”的过程。
整个框架可由观察者根据现实世界与虚拟场景的拟合情况,通过控制器对场景约束框架进行调节以实现优化控制。
根据前述设计思想,结合当前技术实践,给出了如图2 所示场景约束框架的整体结构。
从现实世界采集的信息被加工处理后经由Node.js服务器处理,然后以Json格式存入Mongo DB数据库中。之所以选择Mongo DB而不是传统关系数据库,是因为采集的数据量很大,且来源差异较大,因此格式未必完全统一。这样的数据用关系数据库存储不仅转换代价高,而且由于数据中有价值的内容的比例不高,因此存储代价也很高。No Sql非关系型数据库,能有效解决传统关系型数据库所面临的问题,因此采用No Sql数据库更为合理高效。[5]
Node.js服务器同时还通过Apache服务器为面向业务的关系数据库提供经过初步加工的“粗数据”。之所以不用Node.js进行“精加工”,是由Node.js不擅长高强度运算的特点决定的。由于对从Node.js推送到Apache服务器的数据实时性要求不高,因此不采用类似Hadoop的大规模并行计算框架,而是交由Apache服务器来完成。
Node.js同时要为Unity3D引擎提供构造场景的基础数据以实现对现实场景的拟合。随后Unity3D将处理完成的场景发布到Apahce服务器上供用户使用。为实现虚拟场景与现实场景的实时同步,还需要进一步由Node.js将实时信息推送到Apache服务器上供实时虚拟场景变换使用。
2.2 框架设计
数据交换问题是框架设计的基础,本文采用JSON协议进行不同组成部分间数据交换的基本形式。图3 展示了支撑数据交换的软件结构。其中,左右两个虚线框分别代表数据提供端和数据使用(客户)端。每端都绘制了两层结构。底层表示的是所采用的软件框架或模块,上层代表的数据结构或对象。
如图3 所示,在数据提供端的上层,从关系数据源和非关系数据源分别获取Data Record和Document对象,然后统一封装成JSON对象,以字符流的形式通过网络传送到数据使用端,经Lit Json模块进行转换,形成标准C#对象以供Unity3D引擎处理。
篇幅所限,本文不讨论经整理过的现实数据驱动的虚拟场景的生成过程。本文关注的重点在于当虚拟场景的布景及组成元素已组装完成后,如何保证后续推送的不断变化的数据仍能使虚拟场景与现实相拟合,即:如何约束来自于现实场景的信息和数据,使它们可以以符合实际情况的顺序和逻辑在虚拟场景中重现。鉴于此,框架设计部分主要考虑的问题是场景约束问题。
整个约束框架中最核心的部分是对服务器端与Unity3D虚拟场景交换的实时数据进行过滤,以使根据过滤后的数据所拟合出来的虚拟场景的动态逻辑符合实际情况。因此,场景约束问题可以归结于对数据过滤的问题。
如前所述,Unity3D的开发框架是事件驱动的,[6]Unity3D已经对开发接口做了很好的封装,将所有对事件进行响应的基本类和工具全部封装到Unity Engine中,并提供了Mono Behavior抽象类供开发者继承。因此,对数据过滤完全可以通过对Mono Behavior类进行扩展来加以实现。按照这一思路,本文在Mono Behavior的基础上按照数据约束的要求,构造了一系列的数据约束类,如图4所示。
约束框架中重要的两个类是如图4(1)所示的抽象类Pas-sive Behavior(被动对象行为类)和Active Behavior(主动对象行为类)。整个继承逻辑是这样的:所有的Unity3D/2D对象都可以具有Mono Behavior,其中我们所关心的场景对象都应具有Passive Behavior,即,所有虚拟场景中的实体对象都是被动对象,可以响应其他对象的作用。当然,虚拟场景中还应有主动对象。主动对象首先必须是被动对象,因此“主动对象行为”类继承自“被动对象行为类”。这样,所有我们关心的场景实体只需根据其自身类别分别继承自Passive Behavior和Active Behav-ior类即可。在图4(1)中,可以看到Road Behavior(道路行为)类继承自Passive Behavior,所以虚拟场景中一切道路实体均可以作为Road Behavior的实例对象而存在。
为了方便管理,继承自主动对象的类可划分为三种类型:ID1Behavior、ID2Behavior和ID3Behavior,分别代表一维、二维和三维对象类型。一维行为类型的对象应该是严格按照一维坐标运动的,如火车。二维行为类型的对象应在二维平面内运动,如车辆。三维行为类型对象可以在空间内自由运动,如飞行器。ID1Behavior、ID2Behavior和ID3Behavior的存在是为了便于约束主动实体以提供方便的控制工具。比如,对于一维的火车对象,虽然其在虚拟空间中的轨道是曲线,甚至是空间曲线,但并不妨碍将其抽象成一条一维的线,其度量可以简单地依赖于起点刻度值。最自由的是三维行为实体,如果加入航线的概念,可以将其绑定到固定航线上以降维成一维实体。当然,也可以通过与被动对象的关系加以约束。
以上列示的只是与运动空间位置相关的行为类型。现实世界中根据问题领域的关注不同,约束的种类还有很多种。比如综合考虑物体的速度、运动方向、材料可以承受的极限加速度等参数,物体在没有遇到障碍物时在极短时间内突然改变运动方向是不符合牛顿运动定律的,应予以约束。
约束的基本方法有两种:第一种,在当前合理的取值范围内任选一值,然后根据该取值调整实体的运动状态;第二种,抛出约束异常ULException。约束异常的静态结构见图4(2)。约束异常可分为两大类ULAlert和ULFail,分别代表警告和失败。警告意味着即将出现失败,而失败将导致实体行为中止。默认的实体行为失败的处理是停止实体的运动。如果是主动实体将会被强制转换为被动实体,只能响应被动事件。应积极捕获ULAlert和ULFail异常并加以处置(如报警、发生爆炸等),以实现与现实拟合的场景变化。
2.3 框架实现
约束框架的具体实现是工作量最大的一步。首先需要根据领域知识将所有场景中涉及的实体分为被动和主动两大类,然后进一步细分为不同的行为类型;其次,需要根据不同行为类型的主要关注点抽象出该类型对象的共同应遵守的行为。与面向对象父类抽象的基本思路不同,约束抽象的父类对象中应该规定是最苛刻、严格的情况,而子类对象根据自身具体特点有选择地“做减法”,减少或弱化约束。
下面以道路约束类型为例介绍被动对象的约束方式。虚拟世界中的道路在显示效果上是相当简单的,如果不考虑地势变化的话(比如仓库、堆场、厂区内的场景)道路就可以抽象成一种二维对象,因此应采用ID2Behavior类型的约束。
如图5(1)所示,道路的约束被定义为两方面内容:行进方向约束和左右边界约束。行进方向约束指对于任何在道路上行进的车辆,其行进方向必须和道路方向相一致,否则将抛出ULAlert或ULFail异常。具体是哪一类需要根据约束强度来确定,比如高速公路应抛出ULFail异常,而支线小路可以抛出ULAlert异常。左右边界约束稍微复杂,可以再具体细分为内外边界。当车辆越过内边界时,抛出ULAlert,而车辆触及外边界时,将抛出ULFail并中止车辆运行。
被动对象的设置比较灵活,可以设置现实中完全不存在的被动对象以增强对主动对象的约束。如在十字路口设置虚拟的警示性对象,以探测超速或不减速情况的发生。
主动对象的约束以车辆为例,如图5(2)所示,车辆的约束包括:
1)行进方向限制:限制在前向a度和后向b度以内。超过a和b则抛出ULFail异常。可以将a、b值设为定值,并设置警告边界值以预警;也可以参考当前速度动态确定a和b的值,使得车辆在虚拟场景中的运行更符合实际情况。
2)速度限制:最低速度为0,最高为指定值,如120 公里/小时。超出则抛出ULAlert异常。也可增设理论最大值,如500公里/小时,超出则抛出ULFail异常,表示车辆不可能达到该速度。
3)加速度限制:最低为0,最高为车辆、货物和人能承受的极限加速度的最小值。
除自然规律约束外,约束主动对象的人为因素还有很多,比如需要根据车型约束可同行线路;根据车牌号约束可以出行的日期等等。主动对象的约束不一定必须在主动对象内设置,可以借助于被动对象间接进行约束。比如设定道路的被动约束为限行某类车型,或增加虚拟被动对象以约束通行车号。用被动对象进行约束可以大大减少主动对象的约束负担,提高程序执行效率,并且有助于对约束进行合理分类。
3 总结和展望
本文介绍的场景约束框架基于实际的可视化平台整合与建设项目,该框架是实现将不同来源的虚拟场景实体有机地组织在一起的基本保证。
Unity3D系统中有将虚拟实体设置为钢体的选项,再加上碰撞设置,可以十分逼真地模拟虚拟物体间在重力作用下相互碰撞、移动甚至是旋转。场景约束框架与Untiy3D的“钢体-重力-碰撞”系统在最终可视化表现上有一些相似之处,但目标和实现手段完全不同。Unity3D的“钢体-重力-碰撞”系统完全由Unity3D进行处理,一旦选择,则很难再通过程序对其进行微调。而且该系统仅仅是为了简便地实现逼真的显示效果,对于背后的原理和逻辑并不关心。
场景约束框架的运行机制中完全不需要界面元素的参与,约束体系依赖于对业务逻辑的分析、归类和对抽象数据的处理。目前框架的主体框架已经形成,但更艰巨的任务在于增加对象类型,寻找稳定的行为模式,确定行为类型。同时,需要大量加入实际操作细节以逐步实现更高精度的拟合。约束的内容和类型非常丰富,或可通过面向对象封装机制按照不同应用领域进行分包,以实现模块化的“插拔”式使用。这种机制非常灵活,需要做进一步的理论分析和更细致的工程实践工作。
参考文献
[1]任国栋,陈林华,陶学锋,等.基于unity3D的虚拟博物馆信息可视化系统[J].计算机系统应用,2013(9):86-87.
[2]汪国平.仿真模拟技术及其应用[J].物理学与信息科学技术专题,2005(8):596.
[3]Brad Dayley(布拉德.德雷).Node.js+Mongo DB+Angular JSWeb开发[M].北京:电子工业出版社,2015:51.
[4]王宝云.物联网技术研究综述[J].电子测量与仪器学报,2009(12):1.
[5]江民彬.非关系型与关系型空间数据库对比分析与协同应用研究[D].北京:首都师范大学,2013.
3D场景 篇7
网络通信技术的发展促使网络带宽和网络用户不断增加, 基于Internet实现实时在线的三维虚拟场景交互式展示已成为可能, 同时用户可以通过电脑和智能手机等多种终端设备访问在线三维虚拟场景。旅游景点、文化遗址、商业楼盘、购物商城等场景的在线交互式虚拟展示成为当前研究的热点问题, 但现有的在线虚拟场景往往存在规模较小、内容较少、交互方式单一等问题。
ShiVa3D是一款支持多种操作系统平台的3D游戏引擎, 包含所见即所得的场景编辑器、多平台发布工具、网络多用户服务器等, 支持实时地形编辑、动态复合对象 (Compound Dynamic Body) 建模、大规模虚拟场景管理与优化、Web浏览器展示、C/C++/LUA脚本编程等, 基于XML协议和SOAP协议实现网络应用程序与各种数据库和服务器的兼容。为提高大规模在线虚拟场景展示的实时性和流畅性, 丰富虚拟场景的内容及其用户交互方式, 本文采用ShiVa3D引擎实现对巴东古县城的复原和在线虚拟交互式展示。
1 在线虚拟交互式展示系统设计
以巴东古县城为例, 设计了一种在线三维虚拟场景交互式展示系统, 主要有虚拟场景漫游、视角切换、语音交互控制、手势交互控制、虚拟对象属性查询等功能。虚拟场景漫游包括交互式漫游和固定路径漫游两种模式, 主要用于用户观察虚拟场景的室内和室外情景, 是系统的核心功能。视角切换、语音交互控制和手势交互控制可改变以往单一的鼠标或键盘交互方式, 增强系统的趣味性和交互的自然性, 使用户全方位、多视角体验虚拟场景的丰富内容。对于感兴趣的历史建筑、虚拟文物、历史事件和历史人物, 用户可通过属性查询功能浏览相关信息的文字描述、图片或视频演示等。
如图1所示, 基于ShiVa3D引擎的在线三维虚拟场景交互式展示系统开发包括系统设计、虚拟场景构建、交互式展示、发布与测试4个阶段。系统设计主要是在分析ShiVa3D引擎特点的基础上, 设计系统的功能和技术实现方案;虚拟场景构建是通过利用ShiVa3D引擎的地形编辑工具制作3D地形、绘制地表的虚拟植物和树木, 利用ShiVa3D引擎自带的3D模型制作和动画编辑工具制作几何形状简单的3D模型和动画, 同时导入利用第三方建模工具所制作的3D静态模型和动画;对于虚拟场景中的各种3D模型和动画采用ShiVa3D引擎提供的模型管理与优化功能进行处理, 提高系统整体性能和实时性;交互式展示主要是通过碰撞检测技术和ShiVa3D脚本编程实现虚拟场景漫游的各种交互式控制, 如鼠标和键盘交互控制、语音交互控制、手势交互控制等;最后一个阶段是利用ShiVa3D多平台发布工具将开发完成的系统发布为Web格式文件, 用户只要安装插件ShiVa Players即可通过Web浏览器在线体验流畅的三维虚拟场景, 并根据测试结果解决前面三个开发阶段存在的问题和不足。
2 三维虚拟场景构建
地形、建筑物、人物、花草树木等虚拟场景元素的建模, 不仅可采用Maya、3DSMax、Solidworks等常用3D建模工具, 而且可采用相关专业模型制作软件, 如3D树模型制作工具TreeGenerator等。巴东古县城包括30多个民宅、2个小桥、1个县衙、1个寺庙等静态对象, 以及许多历史人物、家禽、小鸟等动态对象。巴东古县城虚拟场景的构建流程是:首先, 利用Maya、3DSMax等常用3D建模工具制作各种建筑物和特殊花草树木的静态模型, 以及动态对象的3D动画设计;其次, 利用巴东古县城的历史地形图和ShiVa3D引擎的地形制作工作直接生成逼真的3D地形;最后, 向虚拟场景中导入植被、树木、建筑物、人物动画、动物动画等3D模型对象, 并调整模型的位置、设置3D动画的播放方式。
2.1 地形建模
利用ShiVa3D的地形编辑器 (Terrain Editor) 构建虚拟场景地形, 包括基本3D地形的建模和通过地形纹理设置模拟虚拟场景中的花草树木等植被对象两个基本步骤。第一步, 利用Terrain 菜单中的Create命令创建一个平坦的地形, 然后利用地形编辑工具在平坦的地形上绘制噪声, 使得地形有起伏和地表纹理;第二步, 利用地形编辑器中的Paint工具绘制地表植被, 如被风吹动的草、树木、道路等。完成地形建模之后, 便可得3D地形 (图2) 。
2.2 外部模型导入
虽然可利用地形编辑器创建3D地形以及部分花草树木和道路, 也可利用动态复合模型构建工具制作一些简单的3D模型和动画, 但这并不能满足复杂虚拟场景展示的要求, 仍需利用第三方建模工具制作一些精细的复杂3D模型和动画。ShiVa3D引擎支持的3D模型文件格式主要有dae、dwf和bsp, 需要在Maya、3DS Max等建模软件中安装模型导出插件ShiVaTools导出dae格式的3D模型或动画文件;将制作完成的3D模型或动画导出为ShiVa3D支持的任何一种格式之后, 便可利用Data Explorer工具栏中的Import->Model命令将其导入到虚拟场景中, 并设置其几何尺寸、大小、空间位置等参数。
在巴东古县城这个大型三维虚拟场景构建过程中, 会多次重复使用某些3D模型或动画, 如部分民宅、树木、飞鸟、小鸡等, 它们仅仅是位置、大小和方向不一样, 模型几何形状、网格结构、纹理贴图等都完全相同, 如果重复向虚拟场景中导入同一个3D模型或动画必然会造成三维几何对象数量的迅速增加, 浪费大量的存储空间和计算资源。由于通过模型实例化创建的模型对象并不会增加虚拟场景中几何模型的多边形数, 可节省系统的大量内存和磁盘空间, 减少对存储空间和计算资源的消耗, 缩短在线虚拟场景展示系统的响应时延。因此, 通过一个指向模型的指针以及模型实例对象的空间移动、旋转、缩放等变换实现3D模型的重用, 即采用模型对象实例化来解决同一个模型在虚拟场景中重复使用的问题。
3 三维虚拟场景漫游与交互控制
3.1 三维虚拟场景漫游
三维虚拟场景漫游主要有交互式漫游和固定路径漫游两种方式。交互式漫游具有很大的灵活性, 主要由用户操作鼠标或键盘等输入设备实现漫游位置和方向的控制, 漫游的视点类似于人眼在虚拟场景中的化身, 系统根据场景中虚拟摄像机的位置、相对高度、视角等参数自动进行场景分析和路径选择, 并根据实际情况实时绘制虚拟场景。一般可定义前进、后退、左移、右移等基本漫游动作, 这时视点的方向保持不变。ShiVa3D引擎采用的是Z轴向上的左手坐标系, 沿Z轴方向将视点平移一段距离F, F的值大于0时是前进, 小于0时是后退;沿X轴方向将视点平移一段距离R, R的值大于0时是右移, 小于0时是左移。按照这种漫游控制方法, 通过空间向量分解运算即可计算得到视点的新空间坐标。
路径漫游是按照事先设置好的固定路径、视角参数等进行三维虚拟场景的漫游, 如图3所示。视点的高度、运动速度、运动路径等设置成功之后, 系统便会实时更新视点的空间位置并绘制相应视角范围内的虚拟场景。
由于用户与虚拟场景的交互以及虚拟物体的运动, 虚拟对象可能与其他物体经常发生碰撞, 为保持虚拟场景的真实感和逼真性, 需要及时、准确地检测这些碰撞, 并根据系统需求做出响应, 否则物体之间就会发生穿透现象, 严重破坏虚拟场景的真实感。在虚拟场景交互式漫游系统中, 作为用户视点化身的虚拟摄像机以及场景中的相关物体, 如地形、建筑、树木、人物等都需要添加适当的碰撞器, 同时采用适当的碰撞检测方法探测不同对象之间是否发生了碰撞。近年来, 国内外相关研究者提出和改进了许多碰撞检测算法, 在虚拟场景漫游中应用最广的是层次包围盒法。层次包围盒法是利用体积略大而几何形状简单的包围盒将目标对象包裹起来, 在进行碰撞检测时, 先进行包围盒相交判断, 当包围盒之间发生相交时就表示发生了碰撞, ShiVa3D引擎就是采用这种方法实现虚拟场景中虚拟对象的碰撞检测。导入3D静态模型和3D动画之后, 可对需要添加碰撞检测功能的模型和动画主体设置碰撞检测器 (Collider) 属性。
3.2 基于语音和手势的交互控制
语音和手势是人们日常生活中最常用的互动交流工具, 也是一种最自然的交互方式。传统通过鼠标、键盘等硬件设备实现的人机交互缺乏沉浸感, 语音识别技术和手势识别技术的发展促进了它们在数字电视机、虚拟展示、网络游戏方面的应用。一方面, 在噪音较大的环境中, 语音交互的效果很差;另一方面, 目前比较成熟的语音输入法和语音交互方式都需要不断地下达语音输入开始的指令, 如按下说话按钮或长按说话按钮。根据手势交互的工作原理, 可将其分为接触式和非接触式两大类。接触式手势交互主要是利用多点触控技术识别用户手指在屏幕上的动作, 从而判断用户所发出的交互指令, 往往局限于使用触摸屏的终端用户。非接触式手势识别主要是利用摄像头采集到的静态手部形状特征判断用户的指令内容, 或利用光笔等手持设备、微软Kinect平台等体感交互设备识别用户的手部运动轨迹, 根据用户手部运动轨迹判断指令内容, 主要缺点是手部运动轨迹信息采集设备昂贵。为此, 通过语音交互和手势交互的结合, 利用摄像头和话筒即可实现自然的三维虚拟场景交互控制, 具体方案是:
(1) 伸开五指表示开始输入语音, 握紧拳头表示停止语音输入。
(2) 竖起大拇指表示前进、竖起小拇指表示后退, 竖起无名指表示右移, 竖起中指表示左移, 同时竖起中指和无名指表示打开系统主菜单。
(3) 当周围环境噪音较大时采用手势交互方式, 当用户不方便将手部对准摄像头时采用语音交互方式。
4 总结与展望
本文基于ShiVa3D引擎设计并实现了一个复杂三维虚拟场景的在线交互式展示系统, 主要采用了大规模复杂虚拟管理与优化技术、层次包装盒碰撞检测技术、语音和手势相结合的交互控制技术等, 能够给用户提供自然的人机交互、逼真的三维虚拟场景、流畅的漫游体验等。随着计算机性能的不断提升, 基于语音交互和手势交互相互融合的人机交互方式将为虚拟展示和网络游戏带来更自然、更逼真的虚拟体验, 面向3D网络游戏的体感交互模型与技术值得进一步研究。
参考文献
[1]爱迪斯通科技公司.ShiVa3D简介[EB/OL].http://www.shi-va3d.cn/intro/Index.html, 2012.
[2]童小念, 罗铁祥, 李志玲.MuItiGen Creator建模技术的优化与实现[J].计算机系统应用, 2008 (2) .
[3]AYBARS UGUR.TAHIR EM RE KALAYCI.Automatic genera-tion of virtual computer rooms on the internet using X3D[C].ICCS2007.Berlin, Germany:Springer-Verlag, Part II, 2007.
[4]杜宝江, 刘佳, 钱诚元.网上博览会虚拟场景在线拖建技术研究[J].系统仿真学报, 2010 (9) .
[5]薛艳敏, 胡静, 李晓玲.基于网络的产品虚拟展示系统设计与研究[J].机械科学与技术, 2011 (7) .
[6]熊伟, 毛善君, 马蔼乃.基于观察者的碰撞检测技术在虚拟环境漫游中的应用[J].计算机应用, 2002 (11) .
[7]VANDEN B G.Efficient collision detection of complex deformablemodels using AABB trees[J].Journal of Graphics Tools, 1997 (4) .
[8]姜晓路, 刘渊.一种新的基于混合层次包围盒的碰撞检测算法[J].计算机工程与应用, 2012 (6) .
[9]小光.电视迈向语音手势交互时代, 遥控器将消失[EB/OL].ht-tp://hea.chinabyte.com/256/12244256.shtml, 2012.
[10]王中宝, 任丽月, 张宇红.关于手势交互移动平台的手势研究[J].大众文艺, 2012 (5) .
[11]万华根, 肖海英, 邹松.面向新一代大众游戏的手势交互技术[J].计算机辅助设计与图形学学报, 2011 (7) .