, ,
(福州大學物理與信息工程學院,福建 福州 350116)
構建復雜的表面,經常需要在紋理中加入一些可控的隨機變化。比如不同的木板紋路,大理石紋路以及水面等等。
這就需要引入可控的隨機特征——噪聲??偟膩碚f,圖形學中的噪聲表示為連續(xù)的變化函數(shù),而且沒有明顯的重復特征。
大多數(shù)的噪聲函數(shù)都在R2上的整數(shù)格子的建立,比如對于(1.2,1.3,2.4)(1.2,1.3,2.4)點,則對由(1,1,2)(1,1,2)和(2,2,3)(2,2,3)構成立方體的八個整數(shù)頂點進行操作。然后得到各個頂點的數(shù)據(jù)后進行插值操作,計算特定點的噪聲值。
噪聲的隨機產生需要隨機數(shù),而且必須滿足相同的輸入產生相同的輸出。如果要高效地產生 和坐標相關聯(lián)的隨機值,通用的偽隨機數(shù)產生器并不適用,常用的方法是使用哈希函數(shù)常表查找參數(shù)。Perlin噪聲函數(shù)是最常用的噪聲函數(shù),稱為Perlin噪聲。Perlin噪聲在全部(x,y,z)(x,y,z)整形頂點處的參數(shù)值都為0,變化源自各頂點間的梯度向量,然后再進行平滑插值。
1)一般情況下,可將噪聲函數(shù)理解為種子隨機發(fā)生器。一個噪聲函數(shù)需將一個整數(shù)當做參數(shù),進而基于此參數(shù)返回一個隨機數(shù)。若兩次傳回的參數(shù)相等,此函數(shù)即可產生兩次一樣的數(shù)。圖1所示為一噪聲函數(shù)案例。橫坐標上個點均代表一個隨機數(shù),范圍為0至1。
圖1 噪聲函數(shù)
圖2 噪聲函數(shù)波長及幅度
圖2所示紅點代表函數(shù)所定義的各隨機值。在此類狀況下,振幅為此函數(shù)最大值同最小值之差。波長為兩隨機值間的水平距離。頻率則等于1/波長[1]。
若使用若干平滑函數(shù),則會具備不同的頻率與振幅,可疊加這些平滑函數(shù),由此所創(chuàng)建得躁聲函數(shù)即為柏林噪聲函數(shù)。將下述2維噪聲函數(shù)進行疊加,可得到如3圖所示的柏林噪聲函數(shù)。
圖3
疊加上述函數(shù)后所得的噪聲樣式:
圖4
2)在疊加噪聲函數(shù)過程中,每次疊加會應用到相應的振幅與頻率。通常需要掌握這些振幅與品頻率信息。如以上所提及的一維案例,在每個連續(xù)疊加時所應用到的頻率與振幅分別為2倍、1/2倍。此案例非常常見,從而易忽略其它頻率與振幅的應用。嚴謹起見,應借助每步應用其它頻率與振幅的操作來完成特征各異的柏林噪聲函數(shù)的創(chuàng)建。例如,在對平滑滾動的丘陵進行創(chuàng)建時,可應用低頻率與高振幅這一特征表現(xiàn)的柏林噪聲函數(shù),此外,低振幅與高頻率可完成平地的創(chuàng)建;低頻率與低振幅可完成顛簸度很高的平面的創(chuàng)建。
3)通過持續(xù)度(Persistence)一詞的應用能夠簡化上述過程,更易于理解,且可不再重復提及頻率與振幅[2]。持續(xù)度指的是每個頻率下的振幅。持續(xù)度與其客觀內涵存在一定的歧異。此概念的提出者為Mandelbrot,該提出者同時在分形現(xiàn)象的發(fā)現(xiàn)中發(fā)揮作用。其界定噪聲具備數(shù)量客觀的高頻率所呈現(xiàn)的持續(xù)度會較低?!俺掷m(xù)度”的提出者還包括Matt[3],然而其定義此概念的方式有所不同。對于上述兩種定義方式,筆者更傾向于后一種,即:
frequency=2i
amplitude=persistencei
在上式中,i代表被疊加的第i個噪聲函數(shù)。通過以下圖表能夠獲知柏林函數(shù)在輸出上Persistence狀況。圖4表對疊加的各個構成單元加以呈現(xiàn),還呈現(xiàn)出持續(xù)度效果以及柏林函數(shù)最終結果[4]。
圖5 噪聲疊加狀況表
1)在完成目標噪聲函數(shù)創(chuàng)建后,需對此噪聲函數(shù)的返回值進行平滑處理。再次,可選擇的方式眾多,然而在效果上存在區(qū)別,有些具備良好效果。典型插值函數(shù)涉及3個輸入:a、b以及x。應于a與b間實施插值,x的取值區(qū)間為0至1。X取值決定了插值函數(shù)具體返回至何值。若x為0,其返回a,若為1,則返回b。若x取值大于0且小于1,其會返回a至b間的某值。
應用線性插值[5]途徑能夠確保插值函數(shù)于插值點上的輸出結果無誤,然而無法確保插值點上插值函數(shù)所對應的導數(shù)。
就所生成曲線的平滑程度而言,相比線性插值,余弦插值更佳。但后者存在速度稍慢這一不足。
除了可保證函數(shù)輸出外,Hermit插值[6]途徑還可確保插值點上插值函數(shù)的導數(shù)等于0,如此可滿足平滑性要求。
若再將插值點位置插值函數(shù)的二階導數(shù)取值設定成0,那么能夠實現(xiàn)平滑度的進一步提升。5次插值函數(shù)如下:
s(x) = 6x5-15x4+10x3
圖6差值過程
圖5所示各小塊均為不同的采樣率應用下雜點紋理隨機采樣結果。所展示的細節(jié)隨著采樣率的下降而變少,反之所獲細節(jié)愈多。左上角小塊應用的最低采樣率,所得細節(jié)最少。右下角小塊則應用了最高采樣率,所得細節(jié)最多。通過這6張小圖用來合成最終柏林噪聲。當進行合成時,在合成比重上,各張小圖有所區(qū)別,細節(jié)愈少,所占用的合成比重愈大,反之則愈小。以上圖為例,左上角小圖的采樣紋理關系到最終柏林噪聲的基本樣式,其余5張小圖的全部紋理逐一疊加構成了細節(jié)構建,然而比重逐漸下降。
所合成的柏林噪聲[7]最終顯示為圖7:
圖7 柏林噪聲圖
2)樣圖細化
紋理所指為物體表面的一種視覺體現(xiàn),其可體現(xiàn)物體表面光澤、質地與顏色等信息,由此來同其它物體加以區(qū)分。在計算機中可視為一類二維平面,憑借一定映射途徑映射至三維物體表面上。針對樣本,此次研究選用紋理合成途徑[8]。首先應保證所選擇的數(shù)據(jù)源具備非均勻各向異性、高精度,故而,將數(shù)據(jù)源確定為心臟切片圖,詳見圖8。
經過柏林噪聲處理后的紋理細化圖9:
3)心臟體的構建
圖8 心臟切片紋理圖
圖9 心臟切片紋理細化圖
圖10 心臟體網格模型
圖11 心臟合成效果圖
為了確保所構建的心臟模型滿足精度要求,第一步通過Maya軟件完成心臟體原型的構建;第二步,在軟件內完成以obj為后綴的模型文件的導出操作,此模型結構呈網格狀(詳見圖1)。由于僅通過表面網格構造不能充分展示心臟內部,故而,應借助模型轉換工具(3D Object Conveter)[9]把完成構建的心臟模型生成為以ply為后綴的文件,然后借助四面體網格生成庫轉換心臟網格為三角體網格,如此可利于紋理貼圖。保存三角體網格模型為ele文件、node文件。其中,前者內含此模型各頂點所鏈接的索引信息;后者內含所有頂點的位置信息。此次研究所構建的心臟三角網格體模型所含三角網格與頂點分別為17718個、10007個,如圖10。
在臺式計算機上借助軟件Visual Studio2012、Matlab 2014完成此次研究,計算機配置均支持上述軟件的應用。圖10為研究所繪制出的心臟效果圖。
此次心臟紋理合成研究所應用的方法用時較少,耗費的內存有限,且具備較高合成效率,可用在虛擬手術顯示方面。
此次研究所應用的Perlin算法在原有算法上有所改進,可自動細化樣本心臟紋理,提升心臟個性化仿真的精準度。