APP下载

基于一种形式化方法的3D虚拟祭祀场景建模语言与环境

2018-10-16徐晓丹李秉杰李伯森

计算机应用 2018年9期
关键词:键值语句界面

徐晓丹,李秉杰,李伯森,吕 舜

(1.民政部 一零一研究所,北京100070; 2.北京航空航天大学 计算机学院,北京 100191)

0 引言

随着互联网的发展,网络祭祀成为引导人民群众从实地实物祭扫转移到对逝者精神传承的一种途径,是节地生态安葬、绿色低碳祭扫、文明节俭的方式,是更加充满个性、人文和文化特色的方式。其中三维(Three Dimensional, 3D)图像虚拟祭祀借助互联网、虚拟现实、大数据等技术,将现实的纪念馆与墓地通过虚拟技术展现到移动、PC等终端设备上,实现跨越时空;以祭祀场景更加贴近实际、良好的视觉和交互体验,方便人们随时随地祭奠已逝亲人等优点备受人们青睐。为此,民政部近年来组织建设“中国殡葬公共服务平台”重大项目,3D虚拟祭祀是该项目中的一个重要组成部分,本文介绍了该项目建设过程中关于3D虚拟祭祀开发的部分研究成果。

3D虚拟祭祀的技术特点:一是所构造的场景是根据用户需求自行进行搭建的,用户通过静态或动态的方式对场景进行修改,这包括了对场景中对象的布局或对象本身的属性信息进行修改;二是3D虚拟祭祀场景较复杂,具有明显的场景构成粒度低、场景属性种类繁杂的特点;三是要具备面向虚拟祭祀提供渲染任务调度与交互管理的基本功能,根据用户前端平台的性质,面向PC终端提供超文本标记语言(Hyper Text Markup Language, HTML)5交互引擎构造以及面向移动终端提供云渲染引擎任务请求,用户线上虚拟环境交互过程中实现各种操作动作的捕捉以及响应回馈,满足不同终端用户线上3D的虚拟环境体验。

虚拟现实(Virtual Reality, VR)又被称作沉浸式多媒体或者是计算机模拟仿真[1]。通过虚拟现实技术可以在计算机中模拟出逼真的三维场景,给用户良好的视觉和交互体验,因此近些年来虚拟现实相关技术在各个领域的应用越来越频繁,涵盖了军事、教育、科研等多个方面并取得了良好的效果[2]。场景建模是虚拟现实相关应用程序开发中非常重要的环节,因此在应用场景建模技术时,需要综合分析目标场景的构成特点及业务需求以选择合适的建模方法。

目前场景建模技术主要分为传统三维建模技术和基于图像的几何建模技术两大类[3]。在该技术领域的研究中,先前研究主要着眼于描述场景的组成和场景对象的特性,基于包括可扩展标记语言(Extensible Markup Language, XML)、可扩展虚拟现实建模语言(Extensible Virtual Reality Modeling Language, X-VRML)、可扩展三维图像(Extensible Three Dimensions, X3D)或自定义脚本语言在内的多种文本格式形成场景描述文本文件,最终根据该描述文本利用模型进行场景拼接完成建模工作[4-7]。

这些方法一般能满足对复杂程度低的场景的需求,还不能解决像3D虚拟祭祀这类用户根据自身需求自行搭建场景且构成粒度细、对象属性复杂的场景的情况,主要是因为这些建模技术普遍存在如下问题:1)对复杂场景对象的属性和特征描述手段不足,具体表现在数据类型不足、构造新数据类型困难以及对数组、结构体等复杂类型描述困难等方面;2)业务耦合性强,一方面没有总结出抽象的场景对象描述方法,另一方面经常局限于某一种具体的文本描述规则,因此导致其通用性不足;3)在设计时较少考虑到界面化建模支持,当目标场景的规模非常庞大时,直接人工编辑建模文本会降低工作效率,并增加因人为疏忽导致的文本编辑错误的概率。

针对上述问题,本文提出了一种基于形式化的场景建模语言与环境。首先,对场景的构成特性进行了清晰的分析,并基于巴科斯范式(Backus-Naur Form, BNF)规则[8]提出了场景建模语言;其次,定义了场景建模语言的操作使得该语言可以通过应用程序编程接口(Application Programming Interface, API)调用的方式完成编辑,证明了该语言对界面化建模的支持;最后,定义了一套该语言的XML映射方法,实验结果表明通过自动化的映射方法使场景建模结果以XML文本格式进行存储,提升了建模结果的可复用性。

1 3D场景建模语言

1.1 3D场景建模语言语法规则定义

本文基于ISO/IEC 14977标准化文档中扩展BNF规则给出了3D场景建模语言的语法规则[9]。其中扩展BNF规则中的符号如表1所示。

表1 扩展BNF符号表

3D场景建模语言语法规则定义如下:

场景描述脚本=变量定义区,场景对象模板定义区,场景构造脚本定义区

变量定义区={变量定义}

变量定义=变量名,变量类型,{变量值}

变量名=标识符

变量类型=基础数据类型

变量值=终结符

场景对象模板定义区= {场景对象模板}

场景对象模板=模板ID,场景对象类型,缺省标记,{属性语句}

属性语句=键值属性语句 | 序列属性语句 | 结构体属语句

键值属性语句=语句基本信息,属性类型,属性值

序列属性语句=语句基本信息,属性类型,{属性值}

结构体属性语句={键值属性语句}

属性类型=数据类型,[数值范围]

属性值=标识符

语句基本信息=属性名,语句类型,帮助信息

属性名=标识符

语句类型="键值属性", "序列属性", "结构体属性"

帮助信息=属性别名, 属性描述, 属性分类

属性别名=标识符

属性描述=终结符

属性分类=标识符

数值范围=最小值,最大值

最小值=终结符

最大值=终结符

数据类型=基础数据类型|场景对象类型|扩展数据类型

基础数据类型="Integer"|"Float"|"Double"|"Boolean"

|"String"|"Enum"|"Collection"

场景对象类型="Unit" | "Particle" | "Capacity" | "Item"

扩展数据类型="ModelAsset" | "ParticleAsset" | "AudioAsset" | "MaterialAsset" | "TextureAsset"

场景构造脚本定义区= {场景对象}

场景对象=索引ID, 模板ID, {特化信息}

特化信息=(属性名, 属性值) | (属性名, 成员名, 属性值)

终结符="′" , 符号, {符号} , "′" | ′"′ , 符号, {符号} , ′"′

标识符=字母, {字母 | 数字 | "_"}

字符=字母 | 数字 | 符号 | "_"

数字="0" |"1" |"2" |"3" |"4" |"5" |"6" |"7" | "8" |"9"

符号= "[" | "]" | "{" | "}" | "(" | ")" | "<" | ">"| "'" | '"' | "=" | "|" | "." | "," | ";"

字母="A" | "B" | "C" | "D" | "E" | "F" | "G"| "H" | "I" | "J" | "K" | "L" | "M" | "N"| "O" | "P" | "Q" | "R" | "S" | "T" | "U"| "V" | "W" | "X" | "Y" | "Z" | "a" | "b"| "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p"| "q" | "r" | "s" | "t" | "u" | "v" | "w"| "x" | "y" | "z"

由此,采用该语言对目标3D场景进行建模后最终得到的场景描述脚本由三个区域组成:变量定义区,用于描述场景描述脚本中所使用的变量信息;场景对象模板定义区,用于描述场景中所有的场景对象模板信息;场景构造脚本定义区,用于描述场景的实际构成信息。其中,场景对象模板定义区是整个语言结构中的关键组成部分。

1.2 语言设计

为加强语言本身对复杂场景对象属性和特征的描述能力,同时赋予语言对界面化建模的支持特性,本文在语言的提出和设计过程中以形式化方法为基础,通过对3D祭祀场景的构成特点进行分析并对其进行高度抽象,抽象出场景对象、场景对象模板、场景对象模板属性三个层次,并基于BNF的描述规则,根据场景抽象层次提出场景建模语言。

1.2.1 场景对象模板概念

为对3D祭祀场景进行建模,首先对祭祀场景的组成结构进行分析并抽象成如图1所示的形式。为尽可能地使具体业务与场景结构一致,提出场景对象的概念,它代表了场景中每一个独立的对象。虽然对象的内部可能由更细微的颗粒构成,为简化暂时先不考虑内部的构成情况,将其看作一个整体。

图1 一般虚拟场景的抽象层次结构

场景对象模板是用于描述一类性质相同的场景对象,将具有相同特征的场景对象的属性进行提取所形成的一种抽象属性集合。这些场景对象仅仅是在属性构成上相同,并非属性值也一致。场景对象模板的形成过程分为两个步骤:一是将场景中具有相同特征的对象进行归类;二是对同一种类型的场景对象进行属性提取形成场景对象模板。场景对象模板形成后,需要保留每个场景对象特有的属性值信息,因此每个对象要保留对应的模板特化参数。为了压缩参数数量,每个场景对象模板都会匹配一个默认模板参数,如果场景对象某个属性的值与默认模板参数一致则无需再进行保存。

通过这样的抽象方式,将场景中的所有场景对象归结为几大类场景对象模板,从而通过任何一个场景对象模板就可以随意生成具有此类特性的场景对象,该场景对象的属性值来源于默认模板参数和模板特化参数的组合。

1.2.2 场景对象模板属性概念

场景对象中的复杂属性构成是影响目前大多数建模方法应用的主要难点[10],为解决此难点,本文在场景对象模板概念的基础上,对其中的属性信息进行抽象,如图1所示,提出三种属性类型:键值属性、序列属性、结构体属性。其中,键值属性主要用于描述键值类型的属性信息,这种属性只包含一个数据类型和一个对应数据类型的值;序列属性语句用于描述一系列具有相同数据类型的数值所构成的集合,这种属性包含一个数据类型和至少一个该数据类型对应的值,类比于程序语言中的数组;结构体属性语句用于表示结构体类型的属性信息,它可以看作多个键值类型属性信息的集合,类比于程序语言中的结构体。

通过这种抽象的方式就可以将场景对象模板中的所有属性信息抽象成为上述三种类型的属性并加以描述,基于这种结构所设计出来的建模语言将会对具有复杂属性结构的场景对象有非常强的适应性。

除此之外,如果该语言所包含的三种属性类型无法满足目标3D场景的需求,也可以通过增添新的属性类型加以应对,由于场景建模语言是基于BNF设计的,因此只需要遵守语言的描述规范就可以在不破坏语言原有结构的情况下实现语言的扩充。

1.2.3 引入界面化建模支持特性

本文在设计3D场景建模语言时,基于图1所展现的抽象层次[11],结合BNF规则提出了一套严谨的语言语法模型,这有利于界面化编辑,只需提出一套该语言的编辑操作API即可实现对应的界面化编辑环境。

另外,为了在界面化编辑过程中用户能够更清晰地理解场景对象模板中每一个属性的含义,对构成场景对象模板的属性根据其用户再次进行划分,并为每一个属性的含义进行标定,将这些属性的描述信息嵌入到每一个属性语句中。通过这样的方式,在实际建模过程中,就可以对每个属性的分类及描述信息进行标识,这有助于界面化程序识别各种属性并将其相关信息展示给使用者,以辅助使用者完成场景建模工作。

2 3D场景建模语言XML转换规则

因为渲染程序对场景描述脚本进行解析时不能直接对该脚本进行读取,所以,还需要针对该脚本设计一套专用的语言解释器。因此,为了使得本文所提出的建模语言能够更容易地被渲染系统读取和解析,还需设计3D场景建模语言的XML转化规则,通过该规则可以将建模结果转化为XML的存储格式。这种做法的优势是:1)避免了为该语言开发专门的语法解释器,同时降低了渲染程序与语言之间的耦合程度;2)提升了建模结果的可复用性,当需要使用其他描述格式重新对场景进行建模时,只需要实现对应的自动化转换程序,而无需重新对该场景再进行建模,此外转换程序的实现难度远低于语言解释器。

为此,本文首先提出了一套转换规则操作符,用于描述转换规则应遵循的执行方式,然后再针对场景建模语言语法规则中的每一种非终结符和终结符给出对应的转化规则。

表3 3D场景建模语言XML转换规则

2.1 转换规则操作符

为了刻画转换过程中的操作,基于3D场景建模语言的语法规则定义提出了一套转换规则操作符,如表2所示,这些操作符以BNF语法规则中的符号为输入进行操作。其中,对符号进行XML展开时需要参考该符号下所支持的转换规则,而对符号值展开时,则将符号所对应的值直接填写到XML中即可。

表2 3D场景建模语言XML转换规则操作符

2.2 转换规则

表3只列出了3D场景建模语言XML转换规则中比较关键的部分,建模语言语法规则中的每一个非终结符都对应了一套详细的转换规则,基于这些转换规则即可按照语法树自顶向下进行展开最终完成整个转换过程。

对于每一个非终结符号而言转换规则并不是唯一的,这种设计的目的是为了压缩转换后的XML文本量,接下来介绍压缩优化原理。

2.3 转换过程中的压缩优化

在建模语言的设计过程中为了让场景建模语言逻辑缜密,导致了语言本身在使用时会产生一定的数据冗余,其主要表现在属性语句的内容冗余。如果存在两个属性名一致的属性语句s1和s2,则根据属性名的唯一性,两个属性语句的语句类型必然是一致的。下面对不同语句类型进行讨论:

键值属性语句时:两个属性语句除了属性值以外的构成是完全一致的;

序列属性语句时:两个属性语句除了属性值序列以外的构成是完全一致的;

构体属性语句时:两个属性语句中除键值属性语句序列以外的构成是完全一致的;对于任意键值属性语句m1∈s1存在键值属性语句m2∈s2,此时m1和m2除了属性值以外的构成一定是完全一致的;且对于任意键值属性语句m2∈s2存在键值属性语句m1∈s1,此时m1和m2除了属性值以外的构成一定是完全一致的。

上述讨论可以得到结论:如果属性语句的定义中出现了同属性名的属性语句,那么就会产生冗余信息。而在实际的XML生成过程中,去除属性语句的冗余是能有效地优化建模结果的脚本大小。因此在转换过程中,会对所有场景对象模板中的属性信息进行提取,过滤重复的内容并统一放置在一个XML文件中进行存储,将场景对象模板中属性值信息单独提取出来存放在另一个XML文件中,两者通过属性名称进行关联,从而对转化结果进行了重新组织。如表4所示,将转换后的XML内容分别保存在不同的XML文件中,并约定每个XML文件的初始内容。

每一个XML文件都拥有初始的转换操作需求,因此将先前已经生成的场景建模结果代入到对应的转换操作中,就可以自动生成对应的XML文本信息。

表4 场景描述脚本XML文件组织结构

3 3D场景建模编辑环境

3.1 界面化建模的重要性

在目前的建模方法应用过程中,大多数方法都需要使用者通过文本编辑的形式直接对建模文件进行修改,这种方法在面对数量级较小的建模结果时还是很有效的,但是,随着目标建模场景规模和复杂度的不断提升,直接对文本进行编辑不仅效率较低,还有可能因为人为失误引入一些错误。其中主要的一部分错误就是语法错误,这些错误的排查往往要消耗很多的精力和时间,会严重影响建模效率。

为了解决该问题,本文提出了3D场景建模编辑环境,其核心思想是实现一系列编辑语言的操作,通过这些操作可以让使用者通过类似于函数调用的形式完成建模,再借助界面化的窗口将操作进一步封装,即可实现界面化的编辑环境。这种编辑环境的优势在于:一是用户在通过界面化手段建模过程中,只需填写必要参数,其他内容全部自动生成,提高了建模速度;二是自动化的生成过程避免了直接编辑文本而导致的人为因素输入错误;三是界面化的建模结果相比纯文本而言更加直观、容易编辑。

3.2 3D场景建模语言操作

由于3D场景建模语言是基于BNF描述的,因此本文按照递归的方式定义了语言编辑的相关操作。这些编辑操作根据场景描述脚本的组成结构,可以划分为三个部分:变量定义区编辑操作、场景对象模板定义区编辑操作、场景构造脚本区编辑操作。

以变量定义区中的部分操作为例进行解释,变量定义区中变量查询操作的伪代码描述如下:

findVar(varDefArea,name)=begin

VarDefination var;

foreach(var in varDefArea)

if (var.name==name)

return var;

endif

endforeach

return null;

end

变量定义区中修改变量名操作的伪代码描述如下:

modifyVarName(varDefArea,name,newName)=begin

VarDefination finded;

finded:=findVar(varDefArea,name);

if (finded!=null)

varDefArea:=varDefArea〗{finded};

finded.name:=newName;

varDefArea:=varDefArea ∪ {finded};

endif

end

可以看到这些编辑操作实际上就是根据BNF规范和场景描述脚本的格式,直接进行脚本生成操作,并且这些操作之间是可以进行相互调用的,例如修改变量名称的编辑操作modifyVarName调用了查找变量的方法findVar。

当完成了对所有编辑操作的描述后,就可以将这些伪代码在界面化编辑环境中实现,并使用用户界面(User Interface, UI)将这些操作进行封装供用户调用,从而实现界面化建模的目的。通过界面化建模形成的场景描述脚本,将会通过2.2节中所提到的XML转化规则自动转化成为XML格式的场景描述脚本,以便渲染程序读取和分析。

4 对比分析及实验结果

4.1 功能对比

本文以“中国殡葬公共服务平台”项目中具有典型代表性的祭祀用品蜡烛、木桌、画框以及火焰粒子这6种场景对象为例,分别应用本方法与相关建模方法观察建模能力[4-6,12]。其中,测试所使用的场景对象特征信息如表5所示,经实际测试后得到了如表6所示的结果。

表5 典型场景对象特征信息

通过对比可以得到如下结论:本方法相对于现有方法进一步强化了针对复杂场景对象属性和特征的描述能力,在增强了新增数据类型特性支持的同时完善了序列属性、结构体属性类型的描述;本建模方法在界面化建模支持程度上优于先前方法;本建模方法基于抽象的建模结果通过自动化转化方法可以生成各种文本结构下的建模结果,相比采用固定文本格式描述的先前方法而言通用性、灵活性更强,可复用程度高。

表6 本文建模方法与先前建模方法的功能对比结果

4.2 应用流程对比

相对于现有建模方法直接对目标场景特征从零构造描述规则[10],以人工编写和检查的方式生成场景描述文本这种方式而言,本文提出的建模方法流程虽然复杂一些,但具有更强的通用性、描述能力和界面建模支持特性,具体应用流程如图2中实线所示:一是针对目标场景特征进行分析,对本文所提出的建模语言BNF语法规则进行扩充,形成用于描述目标场景的建模语言语法规则;二是基于建模语言及场景资源文件,在界面化建模环境中通过调用建模语言编辑操作完成场景描述脚本的编辑生成工作;三是依据XML转化规则将场景描述脚本转化为XML格式的描述信息;四是将XML文本输入到渲染程序中,完成解析和虚拟场景的生成工作。

图2 本文方法和先前方法应用流程比较

4.3 应用案例

图3展示了网络祭祀中基于C# .Net开发的界面化建模原型系统的启动效果,该系统从功能上验证了界面化建模的可行性并且可根据项目进展动态扩充建模数据。图3中可以看到基于形式化的建模语言规则信息以及建模场景资源信息已经被载入到系统中。

图4展示了变量定义区的界面化编辑环境,通过该窗体可以创建、修改、删除业务所需要的枚举、集合类型变量,并且可以向变量中添加所需的成员信息。系统会将这些变量临时保存在内存中,并在后续的场景对象模板的编辑过程中根据需要自动提示用户进行选择。

图3 界面化建模环境启动效果

图4 变量编辑窗口

图5展示了场景对象模板的界面化编辑环境,通过该窗体用户可以创建所需类型的场景对象模板,并通过双击该模板中的属性信息进行编辑,此时系统会根据属性的类型自动打开对应类型的修改窗口方便用户完成编辑操作。图6、图7和图8分别展示了键值属性、序列属性和结构体属性的界面化编辑窗口。

图5 场景对象模板编辑窗口

图6 场景对象模板键值属性编辑窗口

图9展示了界面化编辑后的场景对象模板自动转化效果,可以看到所有界面化编辑产生的信息会以XML的形式导出存储并等待建模过程使用。

图10为实际生成的一个典型场景的建模结果效果图,可以看到窗体内部不仅可以显示文字贴图等信息,还能够进行3D物体的动态展示,以及可以交互的按钮等内容。

图7 场景对象模板序列属性编辑窗口

图8 场景对象模板结构体属性编辑窗口

图9 场景对象模板XML转化效果预览

图10 3D场景交互效果

5 结语

本文对于现有3D场景建模方法普遍存在的业务耦合度高、复杂场景对象属性和特征描述能力不足的问题,为解决像3D虚拟祭祀这类构成粒度细、对象属性复杂的场景建模技术难题,提出了一种基于形式化的3D场景建模方法。通过引入场景对象模板、场景对象模板属性等概念,对场景的构成进行抽象,并基于BNF规则提出了一种低耦合、描述手段丰富的场景建模语言语法规则定义;基于该语言进一步地提出了XML转化规则和界面化建模环境,以增强建模结果的可复用性、提高建模速度。最后通过对课题中典型的几类场景对象进行建模,对比了本文提出的方法与其他方法并进行了相关分析,证明了本文提出的方法在描述复杂场景对象属性和特征时能力较强,在降低业务耦合度、提高界面化建模支持方面也有一定的改进。

[11] XIONG W, JIN Y, LIU Z. Recognizing Chinese number and quantifier prefix to enhance statistical parser in machine translation [J]. Journal of Computers, 2014, 9(4): 867-874.

[12] 徐俊杰,孙长嵩,张安真.基于XML的三维场景数据的组织与表示模型[C] // 北京地区高校研究生学术交流会——通信与信息技术会议.北京:北京邮电大学出版社,2006:1542-1547.(XU J J, SUN C S, ZHANG A Z. Model of scene date organization and expression based on XML [C] // Beijing University Graduate Academic Exchange Conference—Communication and Information Technology Conference. Beijing: Beijing University of Posts and Telecommunications Press, 2006: 1542-1547.)

猜你喜欢

键值语句界面
微重力下两相控温型储液器内气液界面仿真分析
非请勿进 为注册表的重要键值上把“锁”
国企党委前置研究的“四个界面”
重点:语句衔接
扁平化设计在手机界面中的发展趋势
一键直达 Windows 10注册表编辑高招
我喜欢
作文语句实录
注册表值被删除导致文件夹选项成空白
“扫除”技巧之清除恶意程序