劉雪梅 馬瑞志
摘 要:針對傳統(tǒng)隨機中點位移法在地形仿真中存在的繪制過程復(fù)雜、細節(jié)表現(xiàn)不足、山頂處易出現(xiàn)失真的問題,提出一種在Unity3D下利用Perlin噪聲構(gòu)造分形,并對網(wǎng)格頂點進行位移映射進而生成地形的方法。根據(jù)設(shè)定好的分辨率構(gòu)造網(wǎng)格,計算并疊加各頂點不同頻率的噪聲值構(gòu)造分形,最后對網(wǎng)格頂點進行位移映射,生成滿足要求的地形。在噪聲計算過程中修改了隨機梯度選取方法,可使梯度選取更具有隨機性,且計算出的噪聲值分布更加均勻,避免了在山頂處出現(xiàn)失真的現(xiàn)象。實驗結(jié)果表明,該方法可以很方便地實現(xiàn)三維地形仿真,并能很好地表現(xiàn)地形細節(jié)特征,解決了因山頂過于尖凸出現(xiàn)的失真問題。
關(guān)鍵詞:隨機中點位移法;地形仿真;Unity3D;Perlin噪聲;分形;位移映射
DOI:10. 11907/rjdk. 191054
中圖分類號:TP317.4文獻標識碼:A文章編號:1672-7800(2019)004-0174-05
0 引言
三維地形仿真是構(gòu)建虛擬自然場景的重要組成部分。隨著計算機技術(shù)的發(fā)展,特別是計算機仿真技術(shù)的日趨成熟,動態(tài)地形仿真被廣泛應(yīng)用于軍事仿真、游戲、動畫及電影制作等領(lǐng)域[1-2]。針對三維地形繪制,國內(nèi)外學(xué)者已進行了大量研究。如Clark[3]首先提出一種判定可見面的層次細節(jié)模型,利用物體和視點之間的距離,加載不同分辨率的物體模型,解決了計算機運算負荷過大的問題,奠定了層次細節(jié)技術(shù)(Level of Detail,LOD)的研究基礎(chǔ);Hoppe[4-5]提出一種大規(guī)模場景地形網(wǎng)格預(yù)處理技術(shù),以及高效實現(xiàn)漸進網(wǎng)格數(shù)據(jù)結(jié)構(gòu)的方法,可以表現(xiàn)復(fù)雜地貌,但缺點是數(shù)據(jù)結(jié)構(gòu)復(fù)雜、占用內(nèi)存較大,且效率不高;Boer[6]在文獻[4]的基礎(chǔ)上,將多辨率(GeoMipMapping)算法與GPU并行處理相結(jié)合,提高了仿真系統(tǒng)的實時性。
在國內(nèi),張潤花等[7]利用隨機中點位移法繪制地形,但由于網(wǎng)格細分的隨機范圍難以抉擇,導(dǎo)致生成的地形可能出現(xiàn)失真現(xiàn)象;李玉娟等[8]利用基于數(shù)字高程模型(Digital Elevation Model,DEM)的方法,實現(xiàn)了大規(guī)模地形渲染和漫游,但是該方法需要處理海量地形數(shù)據(jù),繪制效率較低,實時性較差;馬海鳳[9]對GeoMipMapping算法進行改進,利用基于GPU的四叉樹瓦片LOD繪制算法繪制地形,提高了繪制速度,且效果較好,但未考慮動態(tài)地形的情況;劉瑤等[10]利用Perlin噪聲構(gòu)造分形進而生成地形的方法,在GPU上進行噪聲計算與疊加過程,提高了地形繪制效率,但是隨著數(shù)據(jù)量增加,GPU和CPU之間的數(shù)據(jù)傳遞會占用大量時間,影響繪制效率;鄭顧平等[11]采用WebGL標準進行動態(tài)地形繪制,但實際上只是實現(xiàn)了幾何剪切圖算法。
綜合分析上述算法后,針對文獻[6]使用隨機中點位移法生成地形存在的細節(jié)表現(xiàn)不足、山頂尖凸失真問題,本文在Unity3D平臺下,通過對傳統(tǒng)Perlin噪聲計算過程中的隨機梯度選取方法進行改進,使噪聲分布更加均勻,從而使得繪制出的地形細節(jié)更為豐富。
1 Perlin噪聲
在計算機圖形學(xué)中,噪聲是指通過引入一些隨機變量以表現(xiàn)自然景物中的隨機效果,如云[12]、波浪[13]、水面[14]、湍流[15]、雪花[16]、場景渲染[17-18]等。最常見的噪聲即類似舊式電視機無信號時出現(xiàn)的隨機雪花像素點,如圖1所示。然而,完全隨機變化的數(shù)據(jù)是無用的,在計算機圖形學(xué)中需要一種可重復(fù)的隨機數(shù)函數(shù),也稱為偽隨機函數(shù),即對于同一輸入,得到的結(jié)果是相同的。Perlin[19]在1985年的SIGGRAPH大會上首次提出該函數(shù),并給出了具體算法描述,稱為經(jīng)典Perlin噪聲。為了簡化計算,并方便利用硬件進行實現(xiàn),Ken Perlin[20]于2001年改進了該算法,也即后來的SimpleX噪聲。目前,Perlin噪聲已被廣泛應(yīng)用于三維游戲、計算機仿真等領(lǐng)域。
Perlin噪聲的本質(zhì)是根據(jù)輸入?yún)?shù)(可以是N維向量)生成一個位于(-1,1)之間的隨機數(shù)。根據(jù)輸入?yún)?shù)的維度,有一維、二維和三維等不同維度的噪聲。Perlin噪聲是基于晶格(一維下是線段,二維下是方格,三維下是立方格)的噪聲,其生成過程可分為確認晶格、選取隨機梯度向量、計算點積、計算插值因子并進行插值4個階段。Perlin最初使用如式(1)所示的三次多項式進行插值因子計算。
但是式(1)的二階導(dǎo)函數(shù)不連續(xù),2002年P(guān)erlin[21]將光滑函數(shù)修改為一個五次多項式。
式(1)與式(2)雖然相似,但是式(2)具有連續(xù)的二階導(dǎo)數(shù),能更好地適用于計算機圖形學(xué)中諸如凹凸貼圖、位移映射等場景的渲染。單一的Perlin噪聲看上去很單調(diào),一般都是通過疊加不同倍頻、頻率和振幅的噪聲構(gòu)造分形生成各種有趣的效果。
2 基于三維Perlin分形噪聲生成地形的方法
由于本文主要利用三維Perlin噪聲構(gòu)造分形,下面將分別從三維Perlin噪聲生成、分形構(gòu)造與地形生成三方面進行詳細介紹。
2.1 三維Perlin噪聲生成
在三維空間上,噪聲函數(shù)用Noise(p)表示,p是一個三維向量,表示輸入點位置。計算給定點p處的噪聲需要經(jīng)過以下過程:
(1)確定晶格。三維情況下的晶格是單位立方體,如圖2所示,中間點p是給定點。要確定其所在晶格,只需確定晶格左下角及背面右上角的坐標即可,也即確定圖中p0(x0,y0,z0)和p1(x1,y1,z1)的坐標。其中p0是離p最近的整數(shù)點,可求得p0的坐標如下(floor表示對參數(shù)向下取整):
(2)選取隨機梯度向量。晶格確定之后,接下來為晶格每個頂點挑選一個偽隨機梯度向量。挑選基本思路如下:首先,生成一個隨機排列表P[N1],這里采用Perlin的方法,將0~255的數(shù)字隨機打亂放入表P中。為避免重復(fù),將打亂后的數(shù)字再復(fù)制一遍,也放入表P中;然后設(shè)置一個位掩碼hashMask用于隨機選擇,令hashMask=255;接著,生成一個隨機梯度表G[N2],Perlin建議選取單位球內(nèi)不同方向的12個向量。由于12不是2的整數(shù)次冪,所以為了方便隨后進行的位運算,將其拓展到16個。最終得到的隨機梯度表G[N2]如下:
經(jīng)過以上兩個步驟,得到P[N1]和G[N2]。在Perlin給出的算法中,采用式(9)進行晶格頂點處梯度的選擇。
其中i、j、k分別取0或1,如G000代表晶格點(X0,Y0,Z0)處的梯度,n取255即hashMask的值。在實際應(yīng)用中,為了簡便可以不必進行求模運算,采取位運算留下低8位的值即可,如式(10)所示。
為了使梯度選取更具有隨機性,并使最終生成的噪聲分布更均勻,本文在生成隨機梯度表時,設(shè)置一個梯度位掩碼gradientMask,取值為15。將式(10)修改為:
2.2 構(gòu)建分形
構(gòu)建分形的過程其實是疊加不同頻率、振幅的噪聲值,如式(31)-(33)所示。
式(31)中,fractal是最后的分形噪聲,octaves表示需要疊加的噪聲個數(shù),frequency是計算噪聲時的采樣頻率,amplitude表示振幅。在每一次迭代中,式(32)、(33)用來控制頻率與振幅變化,其中l(wèi)acunarity是決定頻率變化的因子,一般是大于等于1的浮點數(shù);persistence是決定振幅變化的因子,一般取不大于1的浮點數(shù)。
由于振幅變化可能會引起最終噪聲值超出(-1,1)區(qū)間,所以在程序中設(shè)置了一個變量range記錄振幅變化。在每次振幅發(fā)生變化時,用式(34)記錄當前振幅的值,在噪聲計算完成后,再利用式(35)將fractal的值規(guī)范到(-1,1)區(qū)間內(nèi)。
圖3、圖4分別展示了octaves為2、frequency為8,以及l(fā)acunarity為2、3、4與persistence為0.5、0.75、1時的三維Perlin分形噪聲。
2.3 地形生成
三維Perlin分形噪聲生成地形的基本思想是:利用噪聲函數(shù)生成高度場,對原平面網(wǎng)格頂點進行位移映射,構(gòu)建地形。整個過程可分為網(wǎng)格構(gòu)建、高度場生成與映射位移3部分。
2.3.1 網(wǎng)格構(gòu)建
(1)在Unity中新建一個空對象,并為其添加Mesh組件。
(2)指定要生成地形的分辨率,分辨率用resolution表示。分辨率越大,最后生成的地形細節(jié)表現(xiàn)得越充分。
(3)計算網(wǎng)格頂點和頂點法線。假設(shè)要構(gòu)建一個分辨率為resolution * resolution的地形,則總頂點數(shù)目為(resolution+1)2,將頂點坐標保存在數(shù)組vertices中,數(shù)組vertices的成員用三維向量表示。用數(shù)組normals保存頂點法線,頂點坐標計算如下:
Unity的坐標系統(tǒng)是左手坐標系,Y軸代表垂直方向,X軸代表水平方向,Z軸代表深度。由于要構(gòu)建的是水平平面地形,這里只計算了頂點的X和Z坐標,并按照先X方向、后Z方向的順序進行計算。X和Z坐標減0.5的作用是為了使最終生成平面網(wǎng)格的中心仍位于原點處。因為構(gòu)建的平面是基于X-Z的,每個頂點的法線都是沿Y軸朝上,所以法線可以用Unity中的內(nèi)置變量Vector3.up表示。最后將計算出的頂點和法線分別賦給Mesh組件的vertices屬性和normals屬性。
(4)網(wǎng)格生成。Unity中的網(wǎng)格都是以三角形為基礎(chǔ)的,用Mesh組件的triangles屬性保存所需的三角形。
定義一個triangles數(shù)組,triangles數(shù)組主要保存構(gòu)建三角形時所用到的頂點索引。由于一個四邊形由2個三角形構(gòu)成,因此對于分辨率為resolution*resolution的網(wǎng)格,數(shù)組大小為resolution2*6。利用之前計算出的頂點可以構(gòu)造出需要的網(wǎng)格,需要注意的是,Unity中三角形的前向面頂點是依順時針排列的。以圖5所示4*1的分辨率為例,構(gòu)建第一個四邊形所用到的頂點索引為0,1,5,6,則對應(yīng)的兩個三角形分別為0,5,1和1,5,6。對于分辨率為resolution*resolution的網(wǎng)格,triangles數(shù)組生成過程如圖6所示。
圖6中用t表示構(gòu)成四邊形的頂點索引,按照先X方向、后Z方向的順序,每個四邊形構(gòu)建完畢之后,t值增加6。
2.3.2 高度場生成與位移映射
網(wǎng)格構(gòu)建完成后,利用之前構(gòu)造的分形噪聲fractal生成高度場。按照先X方向、后Z方向的順序,分別求出每個頂點處的fractal值。為了能夠動態(tài)調(diào)整最終生成地形的起伏程度,設(shè)置一個strength變量調(diào)整fractal的值,如式(39)所示,strength范圍為(0,1]。
然后將其賦值給頂點的Y坐標,完成位移映射,如式(40)所示。
對頂點作位移映射之后,可以利用Mesh組件自帶的RecalculateNormals()函數(shù)重新計算頂點法線。
3 實驗結(jié)果與分析
根據(jù)本文方法,在Unity3D 2017.3.1f平臺下,利用C#語言在VisualStdio2017下編寫腳本,最終生成的地形效果如圖7所示。圖7(a)為分辨率100*100的地形,圖7(b)為分辨率200*200的地形。從圖中可以看出,在200*200分辨率下,如地表褶皺等地形細節(jié)特征表現(xiàn)得更加充分。采用一個漸變的顏色帶對最終地形進行著色,藍色越深表示海拔越低,黃色表示高海拔地帶。
Unity3D可以自動處理光照和陰影,當向場景中添加光照,生成的地形效果如圖8所示,其中圖8(a)為關(guān)閉Unity陰影效果,圖8(b)為開啟陰影效果。
圖9展示了通過改變strength的值調(diào)整地形起伏狀態(tài)。
最后,與隨機中點位移法生成的地形相比,如圖10所示,可以看到隨機中點位移法生成的山頂過于尖凸,而且如山體表面褶皺等地形細節(jié)表現(xiàn)不夠充分。利用本文算法生成的地形山頂表現(xiàn)自然,沒有過于尖凸的現(xiàn)象出現(xiàn),而且山體表面褶皺也表現(xiàn)較好,整體而言本文算法效果更佳。
4 結(jié)語
本文提出一種在Unity3D平臺下,利用三維Perlin噪聲構(gòu)造分形進而生成地形的方法。對經(jīng)典Perlin噪聲中晶格頂點處隨機梯度的選取方法進行改進,從而使最終生成的噪聲更具有隨機性。利用Unity3D中Mesh組件的自動計算法線功能,簡化了頂點在位移映射之后計算法線的過程。但是本文方法還存在一些不足,如當分辨率過大時,需要計算的頂點數(shù)目也相應(yīng)增多,耗費時間較長,幀數(shù)也會急劇下降,而且地形起伏不能通過局部進行調(diào)整,這是下一步需要改進的地方。本文方法在生成地形方面效果較好,能夠充分表現(xiàn)出地形細節(jié)特征,且過程簡單,能夠滿足地形仿真需求。
參考文獻:
[1] 吳欣. 大場景可變地形特效技術(shù)研究[D]. 北京:北方工業(yè)大學(xué),2016.
[2] 邢玥. 基于GPU的動態(tài)地形實時繪制[D]. 北京:華北電力大學(xué),2016.
[3] CLARK J H. Hierarchical geometric models for visible-surface algorithms[J]. ACM SIGGRAPH Computer Graphics,1976,10(2):267-267.
[4] HUAGUES H. Progressive meshes[C]. Proceedings of the 23rd Annual Conference on Computer Graphics and Interactive Techniques. ACM Press,1996: 99-108.
[5] HUAGUES H. View-depedent refinement of progressive meshes[C]. Proceedings of the 24th Annual Conference on Computer Graphics and Interactive Techniques. ACM Press,1997:189-198.
[6] BOER W H D. Fast terrain rendering using geometrical mipmapping[C]. World Wide Web Conference Series,2000.
[7] 張潤花,劉樹群,趙付青. 地形生成的細分隨機移位方法[J]. 華中師范大學(xué)學(xué)報:自科版, 2012, 46(5):533-536.
[8] 李玉娟,譚同德. 三維場景中大規(guī)模地形地貌的生成[J]. 計算機應(yīng)用與軟件,2013,30(11):131-135.
[9] 馬海鳳. 大規(guī)模地形可視化技術(shù)研究[D]. 西安:西安電子科技大學(xué),2015.
[10] 劉瑤,庹先國,李懷良,等. Perlin噪聲生成地形的一種高效率并行方法[J]. 科技通報,2016,32(3):200-204.
[11] 鄭顧平,白若林. 基于WebGL的動態(tài)地形實時繪制[J]. 軟件導(dǎo)刊,2017,16(12):202-205.
[12] 王帥. 基于Simplex噪聲繪制云的方法[J]. 遼寧石油化工大學(xué)學(xué)報,2009,29(3):58-61.
[13] 石秋華. 利用Perlin噪聲生成水波面的動態(tài)模擬研究[J]. 軟件導(dǎo)刊,2012,11(2):140-142.
[14] 項予,許森. 基于Perlin噪聲的動態(tài)水面實時渲染[J].? 計算機工程與設(shè)計,2013, 34(11): 3966-3970.
[15] ROBERT B,JIM H,MARCUS N. Curl-noise for procedural fluid flow[J]. ACM Transactions on Graphics (TOG),2007,26(3):46-48.
[16] 徐建華,顧浩,康鳳舉,等. 真實感降雪場景可視化[J]. 系統(tǒng)仿真學(xué)報,2014,26(10):2391-2394,2399.
[17] BARNARD R, URAL S.Rendering translucency with Perlin noise[C]. International Conference on Computer Graphics and Interactive Techniques in Australasia and South East Asia. ACM,2005:131-134.
[18] CONINX A,BONNEAU G P,DROULEZ J, et al. Visualization of uncertain scalar data fields using color scales and perceptually adapted noise[C]. ACM SIGGRAPH Symposium on Applied Perception in Graphics and Visualization, ACM, 2011:59-66.
[19] PERLIN K. An image synthesizer[C]. ACM Siggraph Computer Graphics, 1985, 19(3):287-296.
[20] PERLIN K. Noise hardware[C]. Real-Time Shading SIGGRAPH Course Notes, 2001.
[21] PERLIN K. Improving noise[J]. ACM Transactions on Graphics, 2002, 21(3):681-682.
(責任編輯:黃 ?。?/p>