曹 莹,王 辉
(北京联合大学应用文理学院,北京 100083)
畅春园始建于康熙二十六年(1684年),是皇家第一御园,占地1200亩,是损毁最为严重的一座御园。为了保护畅春园文化遗址及数字化复原,在研究了大量古籍文献、搜集史料、以及对考古勘测数据分析研究的基础上,利用虚拟仿真技术数字化复原畅春园文化遗址。圣祖仁皇帝在御制畅春园记中写道:“而以畅春为名,非必其特宜于春日也。夫三统之选建,以子为天之春,丑为地之春,寅为人之春,而易文言称乾元统天,则四德皆元,四时皆春也。”春春有白丁香、桃花树、柳树、杏树、春兰、玉兰,夏有牡丹、芍药、鸢尾花、荷花、惠兰,秋有小叶丁香、建兰,冬有腊梅、寒兰,四季常青有松树、柏树、竹林。因而,畅春园以植物景观为主,以畅春为名,四时皆春,畅春园春、夏、秋、冬四季变化的植被复原、植物仿真尤为重要。
畅春园内种植的植物主要有:
1)三道花堤:有丁香堤、兰芝堤、桃花堤。丁香堤以丁香花为主,兰芝堤以兰草、鸢尾花为主,桃花堤以桃花树为主。
2)花海:畅春园前湖四周、后湖西岸成千上万的牡丹花、芍药花,被称为“花海”。
3)竹轩:畅春园清溪书屋之后山建有竹轩,由翠竹编搭而成,轩后是峻峭假山,构成一片青翠竹林。
4)松柏:畅春园内有大量古松树、古柏树。
园中还有荷花、腊梅树,柳树、玉兰、杏树、葡萄藤等植物。
为了构建精细、逼真的各种植物仿真模型,以及丁香堤、兰芝堤、桃花堤、花海、竹轩等,采用专业植物建模软件SpeedTree构建各种植物模型及植被场景,研究了各种构建方法;为了不影响畅春园文化遗址复原仿真的渲染效率,设计了优化各种植物模型面数的有效方法,精确构建了各种植物高、中、低分辨率的LOD模型,提高了植物仿真模型的实时渲染速度;为了模拟各种植物的四季变化、风吹树动等自然景观,研究了逼真植物动态风效模拟方法,以及植物四季变化的动态仿真,开发了畅春园多种植物仿真原型系统。
在传统虚拟仿真场景中,树、花、草通常采用基于图像的绘制技术,将树、花、草的模型用其透明贴图代替,主要方法是:创建适合树、花、草尺寸的矩形面片或十字交叉矩形面片,在矩形面上贴上树、花、草透明贴图,设置为实时面向观察者渲染,在中、远视点观察时,效果还是可以的。但是,对于畅春园的植物仿真,需要突出展现的就是精细、逼真的各种植物的仿真,主要分为:树类植物和花草类植物。
对于精细、逼真的各种树类植物的仿真方法,采用基于多边形和图像混合的绘制技术,借助专业植物建模软件SpeedTree构建树类植物模型,将树的绘制分为树干、树根、粗枝分支、细枝分支、树叶、开花、果实几个组成部分,并贴上相应的纹理贴图,模拟出符合现实树类植物。下面以桃花树为例,说明创建精细、逼真树类植物的方法。例如:桃花树自然高度300cm,胸径8cm,冠幅200cm,扩大10倍创建桃花树。
启动SpeedTree,新建一个工程,保存为:taohuashu.spm。
1)添加树干。在结点面板,单击Trunk,添加树干,在Generation中,设置Mode为Absolute,树干数量Number为1。在Spine中,改变树高度Length为30,在Skin中,改变树的半径Radius为0.4,调整桃花树倾斜度,在Spine中,改变Start angle为0.51,Gravity重力为0.12,单击其后的曲线调整面板,调整树干为平滑弯曲。精确调整:精确调整树干的弯曲度,单击All,在Hand Drawn下,单击Convert to hand drawn,单击Nodes结点模式,选中树干,调整树干中间的各个控制点,精确调整树干的弯曲度。
2)添加树根、树干封顶。在结点面板,选中树干,单击Decorations修饰,单击Roots,添加树根。在Generation中,Mode为Interval,分支数量frequency为3,Count为4,控制分支生长的起点,改Boundaries下First为0.001,Last为0.01。在结点面板,选中树干,单击+Add,单击Cap,添加树干横截面封顶。
3)添加粗分枝。在结点面板,选中树干,单击Big Branches,添加粗分枝,在Generation中,Mode为Interval,分枝数量Frequency为3,控制树分支生长的起点,改Boundaries下First为0.2,Last为0.9,让分枝互相错开,改Spread为0.65。在Spine中,改变粗分支长度Length为10,正负相差1.5。改变树枝生长的方向,改Start angle为0.4,调整树顶部密集一点,单击右侧曲线图,调整左侧顶点向上,右侧顶点向下,在曲线中间双击增加一个点,双击产生平滑调整点,拖动使树冠符合桃花树冠外形。可以精确调整修剪每一个树枝,选择Nodes结点模式,选中不合适的树枝,可以任意调整其长度、旋转方向、或删除等。
4)添加细分枝。在结点面板,选中粗分枝,单击Little Branches,添加细分枝,在Generation中,Mode为Interval,分支数量frequency为2,Count为3,控制细分支生长的起点,改Boundaries下First为0.15,Last为0.85,让分枝互相错开,改Spread为0.6。在Spine中,改变细分支长度Length中的+%ofparent为0.15,改变树枝生长的方向,改Start angle为0.35,在Skin中,改变细分支的半径Radius为0.6。可以精确调整修剪每一个细分树枝,选择Nodes结点模式,选中不合适的细树枝,可以任意调整其长度、旋转方向、或删除等。
5)添加更细分枝。在结点面板,选中细分枝,单击Little Branches,添加更细分枝,在Generation中,Mode为Interval,分支数量frequency为3,Count为4,控制更细分支生长的起点,改Boundaries下First为0.15,Last为0.9,Spread为0。在Spine中,改变细分支长度Length中的+%ofparent为0.13,改变树枝生长的方向,改Start angle为0.34,在Skin中,改变细分支的半径Radius的+%ofparent为0.9。可以精确调整修剪每一个更细分树枝,选择Nodes结点模式,选中不合适的更细树枝,可以任意调整其长度、旋转方向、或删除等。
6)添加树叶。在结点面板,选中更细分枝,单击Leaf Mesh,添加树叶,单击Meshes,单击+/-按钮,单击Add new,改名为taoyezi,单击High右侧浏览按钮,选择桃叶子模型,taoyezi.FBX,导入树叶材质贴图及透明贴图,单击选择Materials面板,单击+/-按钮,单击Add new,添加材质,命名为taoyezi,在Materials文本框选择taoyezi,勾选Two-sided,单击Color,选择taoshuye.tga,单击Normal法线贴图,选择taoshuye2.tga,单击Opacity不透明度,选择taoshuye3.tga,在通道文本框中,选择Aloha,单击Mesh下的文本框,选择关联桃叶子模型taoyezi,选中叶子结点Leaf Mesh,单击选择Material,在Material中选择树叶材质taoyezi。在Generation中,Mode选择Phyllotaxy,控制页生长起点,改Boundaries下First为0,Last为0.6,在Skin中,改变树叶顶端变小一点,单击Size右侧曲线框,将右侧控制点向下移动一些,单击+/-按钮,输入0.1,给叶子一个大小变化值。使叶子下垂一点,选择Orientation方向,改变Fold折叠为-0.3,单击+/-按钮,输入0.1,给折叠一个变化范围。选中更细分支,加一点重力,在Spine中,改变Start angle为0.3,Gravity重力为0.1。在桃树里面再增加一些树叶,在结点面板,选中细分枝,单击+Add,单击Leaf Mesh,选中这个Leaf Mesh,单击选择Material,在Material中选择树叶材质taoyezi。在generation中,调节树叶大一点,改Size scalar为1.5。
7)添加桃花。单击Meshes,单击+/-按钮,单击Add new,改名为taohua,单击High右侧浏览按钮,选择桃花模型,taohua.FBX,单击选择Materials面板,单击+/-按钮,单击Add new,命名为taohua1,在Materials文本框选择taohua1,勾选Two-sided,单击Color,选择taohua1.tga,单击Normal法线贴图,选择taohua2.tga,单击Mesh下的文本框,选择关联桃花模型taohua,选中更细分枝Little Branches,单击+Add,单击Leaf Mesh,添加桃花,选中桃花结点Leaf Mesh,单击选择Material,在Material中选择桃花材质taohua1。
8)添加纹理贴图。给树干贴图:单击选择Materials面板,单击+/-按钮,单击Add new,添加材质,命名为taoshugan,在Materials文本框选择taoshugan,单击Color,选择taoshugan1.tga,单击Normal法线贴图,选择taoshugan2.tga,选中树干结点Trunk,单击选择Material,在Material中选择树干材质taoshugan,选中Cap结点,单击选择Material,在Material中选择树干材质taoshugan。给树枝贴图:单击选择Materials面板,单击+/-按钮,单击Add new,命名为taoshuzhi,在Materials文本框选择taoshuzhi,单击Color,选择taoshuzhi1.tga,单击Normal法线贴图,选择taoshuzhi2.tga,选中粗分枝结点Big Branches,单击选择Material,在Material中选择树枝材质taoshuzhi。文件,保存。逼真桃花树制作完成,如图1所示。
图1 逼真桃花树制作过程
9)制作桃花提。将SpeedTree制作的桃花树导出为Unity格式,在Unity中构建桃花堤。具体方法是:先创建文件夹taohuadi,启动Unity,新建工程:taohuadi,选中Assets,创建toahuadi文件夹。然后,在SpeedTree中,单击文件,导出模型(Export Mess),选择Unity中的toahuadi文件夹,保存为taohuashu.fbx。最后,在Unity中创建桃花堤,拖动taohuashu到层次面板中,在桃花堤上种植桃花树,构建桃花堤,如图2所示。
图2 在Unity中构建桃花堤
对于精细、逼真的各种花类植物的仿真方法,也是采用基于多边形和图像混合的绘制技术,借助SpeedTree构建花类植物模型,将花类的绘制分为茎秆、叶、花、果几个部分,并贴上相应的纹理贴图,模拟出符合现实花类植物。下面以牡丹花为例,说明创建精细、逼真花类植物的方法。例如:牡丹花自然高度100cm,茎秆直径2cm,冠幅70cm,扩大10倍创建牡丹花。
启动SpeedTree,新建一个工程,文件,保存为:D: SpeedTreemudanhua.spm,
1)添加茎秆。在结点面板,单击Trunk,添加茎秆。在Generation中,Mode为Absolute,树干数量Number为1。在Spine中,改变茎秆高度Length为10,在Skin中,改变茎秆的半径Radius为0.1,调整茎秆倾斜度。在Spine中,改变Start angle为0.51,Gravity重力为0.15,单击其后的曲线调整面板,调整茎秆为平滑弯曲,改Turbulence为0.65。精确调整茎秆的弯曲度,单击All,在Hand Drawn下,单击Convert to hand drawn,单击Nodes结点模式,选中茎秆,调整茎秆中间的各个控制点,精确调整茎秆的弯曲度。
2)添加分枝。在结点面板,选中茎秆,单击Big Branches,添加分枝。在Generation中,Mode为Interval,分枝数量Frequency为4,Count为4,控制分支生长的起点,改Boundaries下First为0.1,Last为0.8,让分枝互相错开,改Spread为1,Position为-0.07。在Spine中,改变分支长度+%ofparrent为0.4,改变生长方向,Start angle为0.3,Gravity重力为0.05。
3)添加细分枝。在结点面板,选中分枝,单击Little Branches,添加细分枝。在Generation中,Mode为Interval,分支数量frequency为5,Count为6,控制细分支生长的起点,改Boundaries下First为0.005,Last为0.644,让分枝互相错开,改Spread为0.6。在Spine中,改变细分支长度Length中的+%ofparent为0.098,改变树枝生长的方向,改Start angle为0.34,Gravity为0.05。在Skin中,改变细分支的半径Radius的+%ofparent为0.3。
4)添加牡丹叶。在结点面板,选中细分枝,单击Batched Leaver,添加牡丹叶。单击Meshes,单击+/-按钮,单击Add new,改名为mudanye,单击High右侧浏览按钮,选择牡丹叶模型,mudanye.FBX,导入牡丹叶材质贴图及透明贴图,单击选择Materials面板,单击+/-按钮,单击Add new,添加材质,命名为mudanye,在Materials文本框选择mudanye,勾选Two-sided,单击Color,选择mudanye.tga,单击Normal法线贴图,选择mudanyefaxian.tga,单击Opacity不透明度,选择mudanyealpha.tga,在通道文本框中,选择Aloha,单击Mesh下的文本框,选择关联牡丹叶模型mudanye,选中牡丹叶结点Batched Leaver,单击选择Material,在Material中选择牡丹叶材质mudanye。在Generation中,Mode选择Phyllotaxy,控制页生长起点,改Boundaries下First为0,Last为0.9。在Skin中,改Size为0.54,单击+/-按钮,输入0.15,给牡丹叶一个大小变化值。在细分枝顶端增加一些牡丹叶,选中细分枝Little Branches,单击+Add,单击Leaf,添加牡丹叶,选中牡丹叶结点Leaf,在Generation中,Mode选择Interval,Frequency为2,Count为3,Boundaries的First改为0.8,Last改为0.95。在Placement中,勾选Weld,Angle设为0.35,Spread scalar为1.94。在Meshes中,Size改为0.6,在Material中选择牡丹叶材质mudanye,在Geometry中牡丹叶模型mudanye,选择Orientation朝向为Sky sensitive,Sky设为0.5。
5)添加牡丹花。单击Meshes,单击+/-按钮,单击Add new,改名为mudanhua,单击High右侧浏览按钮,选择牡丹花模型,mudanhua.FBX,单击选择Materials面板,单击+/-按钮,单击Add new,命名为mudanhua,在Materials文本框选择mudanhua,勾选Two-sided,单击Color,选择mudanhua.tga,单击Normal法线贴图,选择mudanhuafaxian.tga,单击Opacity不透明度,选择mudanhuaalpha.tga,在通道文本框中,选择Aloha,单击Mesh下的文本框,选择关联牡丹花模型mudanhua。选中茎秆Trunk,单击+Add,单击Leaf,添加牡丹花,选中牡丹花结点Leaf,单击选择Meshes,在Material中选择牡丹花材质mudanhua,在Geometry中牡丹花模型mudanhua。勾选Use actual size。在Generation中,Mode选择Absolute,Number为1,Rotation为1.7,Size scalar缩小为:0.02,Boundaries的First改为1,Last改为1。在Placement中,勾选Weld,Angle设为0.6,选中分枝Big Branches,单击+Add,单击Leaf Mesh,添加牡丹花,选中牡丹花结点Leaf Mesh,在Generation中,Mode选择Absolute,Number为1,Boundaries的First改为0.9,Last改为1。在Skin中,改Size为0.9,大小相差0.3,在Material中选择牡丹花材质mudanhua,在Orientation中,改Sky influence为0.3,Face改为0.2。
6)添加纹理贴图。给茎秆添加纹理:单击选择Materials面板,单击+/-按钮,单击Add new,添加材质,命名为mudangan,在Materials文本框选择mudangan,单击Color,选择mudanjing.tga,单击Normal法线贴图,选择mudanjingfaxian.tga,选中茎秆结点Trunk,单击选择Material,在Material中选择茎秆材质mudangan。
文件,保存。逼真牡丹花制作完成,如图3所示。
图3 逼真牡丹花制作过程
7)制作花海。将SpeedTree制作的牡丹花导出为Unity格式,在Unity中构建花海。具体方法是:先创建文件夹huahai,启动Unity,新建工程:huahai,选中Assets,创建huahai文件夹。然后,在SpeedTree中,单击文件,导出模型(Export Mess),选择Unity中的huahai文件夹,保存为mudanhua.fbx。用以上同样的方法可以制作出各种颜色的牡丹花,以便构建花海。最后,在Unity中创建花海,拖动mudanhua到层次面板中,在花海地面上种植各色牡丹花,构建花海,如图4所示。
图4 在Unity中构建花海
畅春园仿真系统中包含成千上万颗树木、花草植被,这些形态、结构各异的植被模型极大地降低了场景的实时渲染效率,为了达到实时渲染的要求,必须对所有植物模型进行优化,最有效的技术是细节层次技术(LOD技术),针对畅春园多种植物的逼真仿真要求,需要在近视点距离观看高逼真植物仿真,中视点距离观看简化面数的植物仿真,大量远视点距离观看特别简化面数的低植物仿真,才能提高整个场景植物仿真模型的实时渲染速度,这就是LOD技术。实现LOD技术的核心是,精确构建各种植物的高、中、低分辨率LOD仿真模型。下面以桃花树为例,探讨精确构建高、中、低LOD植物仿真模型的方法。
1)近视点处采用高分辨率、高精度桃花树仿真技术,高精度桃花树总面数为1716749面,如图5所示。
图5 近视点LOD桃花树仿真图
在speedtree中,导出高精度模型为obj格式,再导入到Unity中。
2)中视点处可以采用多种减面技术。
方法一:在SpeedTree的主视图窗口有一个分辨率按钮区,有高、中、低分辨率三个按钮,同一个植物模型可以转换成三种不同分辨率的模型构建。例如:桃树干的高、中、低分辨率的面数分别为:高2000个面,中962个面,低300个面。如图6所示。
图6 LOD桃树干的减面技术
方法二:在SpeedTree属性窗口,提供了面数优化调节参数,例如:选中桃树干Trunk,在Segments分段属性中,调节Optimization优化减面的数值,Trunk是2000面,调节优化数值,从0增加到1,面数减低到40面,再选择低分辨率按钮,面数就减低到12面。如图7所示。
图7 桃树干的面数优化调节技术
方法三:在中视点处,桃树的叶子模型、花朵模型、果实模型都可以去掉,改用叶子、花朵、果实的面片透明贴图代替,面数从337824面减低到3312面。并可设置叶片、花朵片、果实片面向摄像机渲染。如图8所示。
图8 面片透明贴图代替叶子模型技术
通过采用上述综合技术,高精度桃花树总面数1716749面,减面后的中精度桃花树总面数为13916面。如图9所示。
3)远视点处采用基于图像的广告牌技术,是最低的LOD技术,仅有2个面,主要方法是:创建适合树尺寸的矩形面片,在矩形面上贴上树的透明贴图,设置为实时面向观察者渲染。具体做法是:对SpeedTree制作的高精度桃树做屏幕抓图,制作成带Alpha通道的透明贴图,在Unity中,创建材质球,设置渲染模式为Cutout剪贴效果,导入透明图,创建一个矩形面片,加透明材质球制作成透明树面片。如图10所示。
图10 低LOD桃树仿真图
4)在Unity中采用LODGroup组件,将高、中、低三种不同分辨率的桃花树LOD模型,设定为根据视点远近距离,自动显示高、中、低模型,从而达到实时渲染的仿真效果。用LOD技术可以在近距离看到非常精细的桃花树模型,在中视点看到中细节桃花树模型,在远视点看到低细节桃花树模型。
具体方法如下:在Unity中,使用Create Empty命令,创建一个空物体,命名为LODGroup,为其添加LODGroup组件。如图11所示。
图11 为LODGroup组件添加高中低模型
用鼠标选中LOD0/100%渲染框,单击添加按钮,选择高LOD模型,表示在61%至100%,显示高LOD模型;选中LOD1/60%渲染框,添加中LOD模型,表示在31%至60%,显示中LOD模型;选中LOD2/30%渲染框,添加低LOD模型,表示在11%至30%,显示低LOD模型;Culled框为10%,表示当视点距离在10%以远时,不显示桃花树模型。可以拖动LODGroup中的摄像机图标观看高中低的显示效果。
畅春园逼真植物动态风效模拟是提高沉浸感、真实感必不可少的自然表现,需要为植物添加风效,达到随风飘摇的效果。
在自然环境中,风力场始终存在,所有植被受风力作用始终产生动态摇摆,在虚拟仿真环境中,需要构建风力场,目前,针对风力场的易变性和不可控制性的特征已经建立了多种风力场模型,比如:基于高斯随机过程、噪声函数、组合风速、指数分布等风力模型,另外,在风力场模型作用下,植物变形的物理计算、形态变化、弹性力学等变化特征也复杂多样,会造成巨大的计算量,需要提高计算效率。本文在畅春园逼真植物动态风效模拟中,采用SpeedTree提供的风力场技术,有效解决了这些难点问题。
创建风力场的方法是:在主视图选中风力场图标,勾选Enabled,即创建了风力场。但对于场景中的每一个植物及其结点,还需要开启风力和设置风力参数。调节风力场图标的红、绿、蓝圆环,可以调节风力绕X、Y、Z轴的方向,调节图标下方左侧滑块,可以调节风力强度,右侧滑块可以调节阵风频率。在风力属性面板,Main参数有:风力向导设置、风力场开启/关闭、风力质量;Settings参数设置有:风力强度、风力持续间隔时间;Branch Motion参数:设置树干及分枝的运动状态、摇摆频度、摇摆幅度、摇摆力度、柔软度、弹性、独立度、对分枝影响风力的起始位置;Leaf Motion参数:设置树叶的运动状态,叶子的摇摆旋转幅度、摇摆频度;阵风特性参数调节等。树的每一个结点都要勾选风力应用,并可以分别进行风力的细节设置,具体方法是:选中树干,All,Wind,勾选Apply,同样方法设置大分枝、小分枝,树叶的风力设置主要在风力属性中,本身也可以做一些调整,例如:桃树叶受风力影响大,桃子就受风力影响小一点。桃花树受风力影响的对比,如图12所示。
图12 桃花树动态风效模拟对比
对于同一棵逼真植物的一年四季变化的动态仿真,也是畅春园仿真系统的难点之一,采用SpeedTree提供的季节变化、分时段导出的技术,解决了这一难点问题。具体方法如下:
在主视图窗口的Edit按钮区,有Season季节变化按钮,植物模型可以根据拖动到春、夏、秋、冬的位置显示一年四季的变化状态,包括:四季的落叶状态。如图13所示。
图13 植物模型季节设置
选中季节变化按钮,分别拖动到春、夏、秋、冬合适的位置,再调节模型细节,例如:春季隐藏桃子,夏季隐藏桃花、桃子,秋季显示桃子、隐藏桃花,冬季隐藏桃花、桃子、桃叶。例如:桃树四季变化动态仿真如图14所示。
图14 桃树四季变化动态仿真
畅春园文化遗址数字化复原的核心是四季植物的精细仿真,在研制畅春园仿真系统过程中,依据上述植物仿真方法,还制作了腊梅、荷花、松树,如图15所示,制作了竹轩、丁香、柳树,如图16所示。
图15 腊梅、荷花、松树仿真实例
图16 竹轩、丁香、柳树仿真实例
在研究畅春园文化遗址数字化复原过程中研究的精细植被仿真方法,是最好的植被仿真方法,可以推广应用到其它具有植被仿真需求的虚拟仿真系统之中,该方法不仅可以构建各种精细、逼真的植物仿真模型,而且可以精确构建各种植物的LOD模型,提高植被仿真实时渲染速度,逼真植物动态风效模拟,植物四季变化的动态仿真都提高了自然景观仿真的沉浸感和真实感。在植被仿真技术研究中,也存在一些需要解决的问题,比如:专业植物建模软件SpeedTreed与实现虚拟场景渲染、实时交互功能的虚拟仿真软件Unity开发系统之间文件格式转化问题。总体来看,该方法解决了植物仿真领域困扰多年的一些难点问题,有效实现了各种植物的逼真仿真、风效模拟、四季变化动态仿真等自然景观。