徐曉丹,李秉杰,李伯森,呂 舜
(1.民政部 一零一研究所,北京100070; 2.北京航空航天大學 計算機學院,北京 100191)
隨著互聯網的發展,網絡祭祀成為引導人民群眾從實地實物祭掃轉移到對逝者精神傳承的一種途徑,是節地生態安葬、綠色低碳祭掃、文明節儉的方式,是更加充滿個性、人文和文化特色的方式。其中三維(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文本格式進行存儲,提升了建模結果的可復用性。
本文基于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場景進行建模后最終得到的場景描述腳本由三個區域組成:變量定義區,用于描述場景描述腳本中所使用的變量信息;場景對象模板定義區,用于描述場景中所有的場景對象模板信息;場景構造腳本定義區,用于描述場景的實際構成信息。其中,場景對象模板定義區是整個語言結構中的關鍵組成部分。
為加強語言本身對復雜場景對象屬性和特征的描述能力,同時賦予語言對界面化建模的支持特性,本文在語言的提出和設計過程中以形式化方法為基礎,通過對3D祭祀場景的構成特點進行分析并對其進行高度抽象,抽象出場景對象、場景對象模板、場景對象模板屬性三個層次,并基于BNF的描述規則,根據場景抽象層次提出場景建模語言。
1.2.1 場景對象模板概念
為對3D祭祀場景進行建模,首先對祭祀場景的組成結構進行分析并抽象成如圖1所示的形式。為盡可能地使具體業務與場景結構一致,提出場景對象的概念,它代表了場景中每一個獨立的對象。雖然對象的內部可能由更細微的顆粒構成,為簡化暫時先不考慮內部的構成情況,將其看作一個整體。

圖1 一般虛擬場景的抽象層次結構
場景對象模板是用于描述一類性質相同的場景對象,將具有相同特征的場景對象的屬性進行提取所形成的一種抽象屬性集合。這些場景對象僅僅是在屬性構成上相同,并非屬性值也一致。場景對象模板的形成過程分為兩個步驟:一是將場景中具有相同特征的對象進行歸類;二是對同一種類型的場景對象進行屬性提取形成場景對象模板。場景對象模板形成后,需要保留每個場景對象特有的屬性值信息,因此每個對象要保留對應的模板特化參數。為了壓縮參數數量,每個場景對象模板都會匹配一個默認模板參數,如果場景對象某個屬性的值與默認模板參數一致則無需再進行保存。
通過這樣的抽象方式,將場景中的所有場景對象歸結為幾大類場景對象模板,從而通過任何一個場景對象模板就可以隨意生成具有此類特性的場景對象,該場景對象的屬性值來源于默認模板參數和模板特化參數的組合。
1.2.2 場景對象模板屬性概念
場景對象中的復雜屬性構成是影響目前大多數建模方法應用的主要難點[10],為解決此難點,本文在場景對象模板概念的基礎上,對其中的屬性信息進行抽象,如圖1所示,提出三種屬性類型:鍵值屬性、序列屬性、結構體屬性。其中,鍵值屬性主要用于描述鍵值類型的屬性信息,這種屬性只包含一個數據類型和一個對應數據類型的值;序列屬性語句用于描述一系列具有相同數據類型的數值所構成的集合,這種屬性包含一個數據類型和至少一個該數據類型對應的值,類比于程序語言中的數組;結構體屬性語句用于表示結構體類型的屬性信息,它可以看作多個鍵值類型屬性信息的集合,類比于程序語言中的結構體。
通過這種抽象的方式就可以將場景對象模板中的所有屬性信息抽象成為上述三種類型的屬性并加以描述,基于這種結構所設計出來的建模語言將會對具有復雜屬性結構的場景對象有非常強的適應性。
除此之外,如果該語言所包含的三種屬性類型無法滿足目標3D場景的需求,也可以通過增添新的屬性類型加以應對,由于場景建模語言是基于BNF設計的,因此只需要遵守語言的描述規范就可以在不破壞語言原有結構的情況下實現語言的擴充。
1.2.3 引入界面化建模支持特性
本文在設計3D場景建模語言時,基于圖1所展現的抽象層次[11],結合BNF規則提出了一套嚴謹的語言語法模型,這有利于界面化編輯,只需提出一套該語言的編輯操作API即可實現對應的界面化編輯環境。
另外,為了在界面化編輯過程中用戶能夠更清晰地理解場景對象模板中每一個屬性的含義,對構成場景對象模板的屬性根據其用戶再次進行劃分,并為每一個屬性的含義進行標定,將這些屬性的描述信息嵌入到每一個屬性語句中。通過這樣的方式,在實際建模過程中,就可以對每個屬性的分類及描述信息進行標識,這有助于界面化程序識別各種屬性并將其相關信息展示給使用者,以輔助使用者完成場景建模工作。
因為渲染程序對場景描述腳本進行解析時不能直接對該腳本進行讀取,所以,還需要針對該腳本設計一套專用的語言解釋器。因此,為了使得本文所提出的建模語言能夠更容易地被渲染系統讀取和解析,還需設計3D場景建模語言的XML轉化規則,通過該規則可以將建模結果轉化為XML的存儲格式。這種做法的優勢是:1)避免了為該語言開發專門的語法解釋器,同時降低了渲染程序與語言之間的耦合程度;2)提升了建模結果的可復用性,當需要使用其他描述格式重新對場景進行建模時,只需要實現對應的自動化轉換程序,而無需重新對該場景再進行建模,此外轉換程序的實現難度遠低于語言解釋器。
為此,本文首先提出了一套轉換規則操作符,用于描述轉換規則應遵循的執行方式,然后再針對場景建模語言語法規則中的每一種非終結符和終結符給出對應的轉化規則。

表3 3D場景建模語言XML轉換規則
為了刻畫轉換過程中的操作,基于3D場景建模語言的語法規則定義提出了一套轉換規則操作符,如表2所示,這些操作符以BNF語法規則中的符號為輸入進行操作。其中,對符號進行XML展開時需要參考該符號下所支持的轉換規則,而對符號值展開時,則將符號所對應的值直接填寫到XML中即可。

表2 3D場景建模語言XML轉換規則操作符
表3只列出了3D場景建模語言XML轉換規則中比較關鍵的部分,建模語言語法規則中的每一個非終結符都對應了一套詳細的轉換規則,基于這些轉換規則即可按照語法樹自頂向下進行展開最終完成整個轉換過程。
對于每一個非終結符號而言轉換規則并不是唯一的,這種設計的目的是為了壓縮轉換后的XML文本量,接下來介紹壓縮優化原理。
在建模語言的設計過程中為了讓場景建模語言邏輯縝密,導致了語言本身在使用時會產生一定的數據冗余,其主要表現在屬性語句的內容冗余。如果存在兩個屬性名一致的屬性語句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文件組織結構
在目前的建模方法應用過程中,大多數方法都需要使用者通過文本編輯的形式直接對建模文件進行修改,這種方法在面對數量級較小的建模結果時還是很有效的,但是,隨著目標建模場景規模和復雜度的不斷提升,直接對文本進行編輯不僅效率較低,還有可能因為人為失誤引入一些錯誤。其中主要的一部分錯誤就是語法錯誤,這些錯誤的排查往往要消耗很多的精力和時間,會嚴重影響建模效率。
為了解決該問題,本文提出了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格式的場景描述腳本,以便渲染程序讀取和分析。
本文以“中國殯葬公共服務平臺”項目中具有典型代表性的祭祀用品蠟燭、木桌、畫框以及火焰粒子這6種場景對象為例,分別應用本方法與相關建模方法觀察建模能力[4-6,12]。其中,測試所使用的場景對象特征信息如表5所示,經實際測試后得到了如表6所示的結果。

表5 典型場景對象特征信息
通過對比可以得到如下結論:本方法相對于現有方法進一步強化了針對復雜場景對象屬性和特征的描述能力,在增強了新增數據類型特性支持的同時完善了序列屬性、結構體屬性類型的描述;本建模方法在界面化建模支持程度上優于先前方法;本建模方法基于抽象的建模結果通過自動化轉化方法可以生成各種文本結構下的建模結果,相比采用固定文本格式描述的先前方法而言通用性、靈活性更強,可復用程度高。

表6 本文建模方法與先前建模方法的功能對比結果
相對于現有建模方法直接對目標場景特征從零構造描述規則[10],以人工編寫和檢查的方式生成場景描述文本這種方式而言,本文提出的建模方法流程雖然復雜一些,但具有更強的通用性、描述能力和界面建模支持特性,具體應用流程如圖2中實線所示:一是針對目標場景特征進行分析,對本文所提出的建模語言BNF語法規則進行擴充,形成用于描述目標場景的建模語言語法規則;二是基于建模語言及場景資源文件,在界面化建模環境中通過調用建模語言編輯操作完成場景描述腳本的編輯生成工作;三是依據XML轉化規則將場景描述腳本轉化為XML格式的描述信息;四是將XML文本輸入到渲染程序中,完成解析和虛擬場景的生成工作。

圖2 本文方法和先前方法應用流程比較
圖3展示了網絡祭祀中基于C# .Net開發的界面化建模原型系統的啟動效果,該系統從功能上驗證了界面化建模的可行性并且可根據項目進展動態擴充建模數據。圖3中可以看到基于形式化的建模語言規則信息以及建模場景資源信息已經被載入到系統中。
圖4展示了變量定義區的界面化編輯環境,通過該窗體可以創建、修改、刪除業務所需要的枚舉、集合類型變量,并且可以向變量中添加所需的成員信息。系統會將這些變量臨時保存在內存中,并在后續的場景對象模板的編輯過程中根據需要自動提示用戶進行選擇。

圖3 界面化建模環境啟動效果

圖4 變量編輯窗口
圖5展示了場景對象模板的界面化編輯環境,通過該窗體用戶可以創建所需類型的場景對象模板,并通過雙擊該模板中的屬性信息進行編輯,此時系統會根據屬性的類型自動打開對應類型的修改窗口方便用戶完成編輯操作。圖6、圖7和圖8分別展示了鍵值屬性、序列屬性和結構體屬性的界面化編輯窗口。

圖5 場景對象模板編輯窗口

圖6 場景對象模板鍵值屬性編輯窗口
圖9展示了界面化編輯后的場景對象模板自動轉化效果,可以看到所有界面化編輯產生的信息會以XML的形式導出存儲并等待建模過程使用。
圖10為實際生成的一個典型場景的建模結果效果圖,可以看到窗體內部不僅可以顯示文字貼圖等信息,還能夠進行3D物體的動態展示,以及可以交互的按鈕等內容。

圖7 場景對象模板序列屬性編輯窗口

圖8 場景對象模板結構體屬性編輯窗口

圖9 場景對象模板XML轉化效果預覽

圖10 3D場景交互效果
本文對于現有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.)