基于Panda3D场景漫游中若干问题的实践

2017-07-20 12:58丁亚峰姜保庆
计算机时代 2017年7期
关键词:碰撞检测文化遗产

丁亚峰+姜保庆

摘 要: 为了解决古迹复原的问题,本文利用Panda3D游戏引擎重建了开封古城部分场景,实现了场景漫游。本文从解决三维模型中纹理无真实感的问题入手,采用Panda3D中的纹理映射增强了三维模型的真实感;还解决了三维场景中的物体之间碰撞的问题。该场景从开封古城示范系统中演变而来,用系统的渲染工具做出一个小模型的演示场景。与传统的保留在纸质书籍中的文化遗产相比,演示系统能更加立体、直观地反应出当时社会的情景。

关键词: 古迹复原; 纹理映射; 碰撞检测; 场景漫游; 文化遗产

中图分类号:TP317 文献标志码:A 文章编号:1006-8228(2017)07-47-04

Practice of realizing scene roaming with Panda3D

Ding Yafeng, Jiang Baoqing

(Henan University, Institute of Computer and Information Engineering, Institute of Data and Knowledge Engineering, Kaifeng, Henan 475000, China)

Abstract: To solve the problem of the restoration of monuments, this paper uses the Panda3D game engine to reconstruct the scene of the ancient city of Kaifeng, and realized the scene roaming. Starting with solving the problem of no realistic texture in 3D model, this paper uses the texture mapping of Panda3D to enhance the reality of 3D model. And also solves the problem of collision between objects in 3D scene. The scene evolved from the Kaifeng ancient city demo system, using a system rendering tool to make the small model of presentation scene. Compared with traditional cultural heritage preserved in paper books, the presentation system has the more three-dimensional, intuitive response to the social scene.

Key words: monuments restoration; texture mapping; collision detection; scene roaming; cultural heritage

0 引言

国务院在2016年“十三五”国家战略性新兴产业发展规划通知中专栏19“数字文化创意技术装备创新提升工程”提到了构建数字文化创意产业创新平台,加强基础技术研发,大力发展虚拟现实、增强现实,为了促进优秀文化资源创造性转化,鼓励对非物质文化遗产等文化资源进行数字化转化和开发。依托地方特色文化,创造具有鲜明区域特点和民族特色的数字创意内容产品。文物保护传承和创新技术应用研究与示范项目得到了国家重视,尤其是古建筑文化的传承与保护方面,我国需要保护的古建筑颇多,古建筑文化的流失造成了我们无法传承古代优秀的建筑的魅力,同时也不能保护灿烂辉煌的建筑文化[1]。

我们在参与国家科技支撑计划课题的示范系统“开封城摞城可视化展示”的设计实现过程中,参考了文献[2-3]先进的设计理念和虚拟仿真技术。经过前期素材搜集,实地测量,三维建模等一系列步骤,最终做出一个基于Panda3D的场景漫游系统。

1 古建筑虚拟再现的前期设计

开封地下每座城池规模随着朝代的繁华记录着当时中国朝代的历史兴衰,特别是北宋时期的东京城,三层城垣,密密麻麻的城市道路和河流系统每时每刻都在显示着当时中国的繁荣和强盛。参考史料收集素材,对于现在开封城下的年代久远古建筑的资料考古发掘的文字,数据和照片进行整理,现存的古迹进行实地考察和测量。将收集的数据和图片信息利用建模软件制作模型,然后用3dmax制作模型,模型格式转化,导入Panda3D中,最后python语言调用Panda3D设计场景的漫游和碰撞检测效果,最后完成虚拟漫游系统的仿真再現。

1.1 实地考察现存古迹和整理收集史料

实物的具体数据一定要到古建筑所在的地方测量,对古建筑进行各项数据进行实地的测量[6]。这个过程是制作精确的古建筑模型,以及更准确地复原古建筑的原来面貌所必要的。我们花费了大量的时间和人力,走遍了开封的大街小巷,收集到很多古建筑的实际规模,尤其是到博物馆和文化遗址;同时我们请教考古学家和考古现场的工作人员,以及他们收集和发掘的数据为我们在接下来的任务中起到关键性的作用;以及相关部门为我们提供城墙和城门精确坐标的位置,这对我们规划开封古城明确了方向。为了能够精确地摆放场景中的模型,采用OpenStreetMap来绘制开封历朝历代的地图和城市道路布局。

1.2 三维模型的制作过程

利用现有史料和图片整理所得到的数据,使模型制作显得简单。3D Max的几何建模方法主要有多边形(Polygon)建模、非统一有理B样条曲线建模(NURBS)、构造几何体建模(CSG)[4-5] 。以刘青霞故居某房屋为例。根据整理的资料采用3D Max建模方法生成的房屋模型。图1是房屋模型渲染后截取的前视图。

1.3 纹理映射

由于用建模软件直接制作的三维模型过于粗糙,所以用纹理映射来增强表面细节和场景的真实感。纹理映射是指,确定物体表面的可见点,以纹理模式的对应点参与光照模型进行计算,把纹理模式附加到物体表面上的过程。纹理模式在纹理空间(st坐标系)中一般用矩阵定义;而场景中的物体在物体空间中一般用纹理坐标(uv坐标系)来定义;投影平面上的像素点则在像素空间中用平面坐标系(xy坐标系)来定义。可以有两种方法实现映射:一是将纹理模式映射到物体表面,然后再映射到投影平面;二是将像素区域映射到物体表面,再映射到纹理空间。如图2所示。

由纹理空间向物体空间的映射用含参数的线性函数来表示

然而在Panda3D中的egg模型文件格式必须建立纹理坐标,模型中的每一个顶点和贴图中的每个(u,v)顶点相关联。纹理坐标的每个顶点(u,v)在纹理中,顶点(x,y,z)在三维立体空间中。Pand3D中调用Texture()函数来完成一些简单的纹理参数化,但是这种方式只适用于一般简单的纹理映射。在Panda3D引擎中一般将纹理坐标定义在顶点,初始化时从模型文件中直接读入顶点的纹理坐标。

2 虚拟场景漫游设计

虚拟漫游是在以建立虚拟场景技术为基础,运用虚拟漫游技术为手段,二者相互结合才是真正的虚拟漫游实现。而Panda3D是一个集合了图像,音效,输入输出,碰撞检测的3D的游戏引擎。运用Python编程实现场景的虚拟漫游和碰撞检测。

2.1 场景文件的导入

对于场景建模有两种方式,一种是利用Panda3D自带的功能建模,另一种则是从外部导入的模型,不同的游戏引擎都有独特模型导入格式,然后Panda3D特有的格式.egg格式。以下是3dmax和panda3d模型转换的步骤。

⑴ 先将3dmax模型转成obj格式,把贴图转换成统一的格式(如jpg,png等)。

⑵ 其次在3dmax导入obj,再转成fbx格式,格式装换时需要修改特定的参数。

⑶ 然后由maya导入fbx格式,存成 maya的mb格式(保存ASCII和二进制格式)。

⑷ 最后由panda3d的自带的 maya2egg 转成egg格式 ,再把obj格式文件中的jpg图片拷贝到egg目录,然后修改egg文件中的贴图位置,此时模型可以转化成Panda3D所需要的格式。图3表示游戏引擎的特殊模型文件(egg)格式转换的步骤。

如果使用的建模工具是maya,则可以直接生成模型转换mb格式的文件,然后利用上述条件第⑷步,即可得到egg格式的模型。

2.2 场景漫游技术

在虚拟场景漫游中,可以设计多种漫游形式供用户选择,相应的,就需要不同的视点控制方式来实现不同形式的漫游。Panda3D提供了一个默认的相机base.camera,这个节点同样是一个PandaNode,因此,它的位置等属性可以通过set*()函数来更新。如果道路起伏不平,相机应随着起伏颠簸让用户有更真实的感受。由于相机也是一个节点,于是可以为它创建一个碰撞实体来适应道路的起伏。为适应环境中这种颠簸状态需要改变相机的角度。当用户想自由的游走,设计人员这时需要利用键盘的方向键为用户来提供不同方向的游走,即为每个方向键的up down设定响应函数就非常重要。Panda3D提供了一个事件句柄来响应某种消息。游走的部分代码如下:

def setAI(self):

self.accept("enter", self.setMove)

self.accept("arrow_up", self.setKey, ["up",1])

self.accept("arrow_up-up", self.setKey, ["up",0])

taskMgr.add(self.Mover,"Mover")

2.3 碰撞检测技术

碰撞检测是模拟现实环境中的人物及物体在遇到障碍物时发生的本能反应,三维场景的效果必须符合客观世界的发展规律,则碰撞检测就成为了物体仿真引擎中一个不可回避的问题。设想,如果三维场景的物体发生位移,就必须判断是否与其他物体之间保持一定的距离,否则就可能碰撞。假如物体在移动的过程中与其他物体同时出现在同一空间区域,就会大大降低漫游效果的真实性。然而解决此类碰撞检测问题的方法是在被碰撞的物体(比如墙体)对应的图像区域设置掩码,处理人物活动时判断当前所在区域的掩码。碰撞检测的问题就变成了在三维场景中对所有物体两两求交判断,算法是求物体之间的位置关系[7]。

Panda3D中CollisionNode有两个碰撞掩码,“from”CollisionNode中的solid和另一个CollisionNode或几何体进行碰撞检测之前,会先比较两个物体的碰撞掩码。具体来说,就是from物体的“from”掩码和into物体的“into”掩码,进行与运算。如果结果不为零,就进行碰撞检测,否则,不进行检测。碰撞检测的掩码是为碰撞节点设置“from”的碰撞掩码,而且必须为节点本身设置掩码:

nodePath.node().setFromCollideMask(BitMask32(0x10))

接下来是处理碰撞检测的问题,Panda3D中的CollisionHandler函数可以处理复杂的程序。CollisionHandlerPusher可以处理CollisionHanderEvent處理范围以外的逻辑事件,如果两个物体快发生碰撞的时候,从表面上看物体撞到被撞物体以后,它会在被碰撞物体旁停下,如果物体以一个打在被碰撞物体上,物体会延被碰撞物体滑动。这里使用Panda驱动摄像机的移动(或者其他节点),设置了pusher的驱动节点,通过调用pusher.addCollider。碰撞处理重要的代码如下:

4 结束语

开封古城场景在Panda3D的应用具有良好的系统结构,古建筑复原模型和3D Max的结合,可让古代的建筑再次展现在人们的视野中。本文解决外部模型转换问题;同时还解决在Panda3D中实现漫游和碰撞检测的问题,通过Python函数调用Panda3D生成图形展示界面,为展示具有真实感的三维模型,并可为其改变显示效果和满足漫游要求。目前,宋朝的开封古城已初具规模,我们下一步将着手去做开封其他历史时期的古城场景,最终给出开封“城摞城”的大规模场景。通过参与项目开发来实践其可行性,对将来的研究工作和虚拟交互发展方向进行展望。本文所使用的方法以及现有的大部分方法都是针对小规模的场景,对于后期的大规模复杂场景显然并不实用,为了解决这一问题,近年来已经有研究者尝试引入点云重建方法的三维重建,我们认为基于点云重建的三维重建方法是未来的发展方向之一。

参考文献(References):

[1] 刘光然.虚拟现实技术[M].清华大学出版社,2011.

[2] 任国栋,陈林华.基于Unity3D的虚拟博物馆信息可视化系

统[J].计算机系统应用,2013.22(9):86

[3] 高少峰.基于VRML的古代建筑动态漫游系统[D].北京化工

大学硕士学位论文,2009.

[4] 罗康.基于OpenGL的3D游戏场景编辑器的设计与实现[D].

北京化工大学硕士学位论文,2009.

[5] 佟帅,徐晓刚,易成涛,邵成勇.基于视觉的三维重建技术综述[J].

计算机应用研究,2011.28(7):2411

[6] 郭云仲.虚拟现实技术在古建筑复原中的应用研究[D].武汉

理工大学硕士学位论文,2008.

[7] http://www.panda3d.org

猜你喜欢
碰撞检测文化遗产
全新预测碰撞检测系统
与文化遗产相遇
酌古参今——颐和园文化遗产之美
基于BIM的铁路信号室外设备布置与碰撞检测方法
论非物质文化遗产整体性保护
Unity3D中碰撞检测问题的研究
活态文化
《文化遗产》2016总目录
空间遥操作预测仿真快速图形碰撞检测算法
BIM技术下的某办公楼项目管线碰撞检测