程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 引入湍流概念實現對大理石紋理的造型模擬

引入湍流概念實現對大理石紋理的造型模擬

編輯:vc教程

  摘要:本文通過在物體表面紋理的造型算法中引入流體力學中的湍流概念而成功實現了對大理石表面紋理的模擬仿真。

  前言

  計算機仿真模擬技術在生物、醫學以及國防等諸多科研和應用領域得到了廣泛的應用。仿真的過程也就是把仿真對象從物體提煉成數學模型的過程,因此其內在數學模型的提煉和從數學模型設計出相應的仿真算法在整個仿真過程中是很關鍵的兩個環節。本文以大理石為例,通過引入流體力學中湍流概念從數學角度提出了一個仿真效果比較好的紋理仿真算法,並給出了關鍵部分的VC++編碼。

  過程紋理造型技術

  過程紋理造型技術在功能同二維紋理管理技術比較相似。但由於二維紋理管理技術采用固定的圖像來描述表面細節,而客觀世界中的自然物體表面紋理卻往往具有較強的不規則性和隨機性,因此這種采用固定圖像對表面細節進行描述的紋理造型技術效果並不好,不能對自然物體進行較好的造型和模糊。在20世紀80年代中後期提出的過程紋理造型技術采用代碼段或算法來編碼抽取模型細節,並且允許高層控制和規范,從根本上克服了二維紋理管理技術的上述缺陷。而且該技術是通過控制參數來管理紋理數據的放大,因此在仿真過程中只需簡單地設定若干個控制參數就可以動態產生大量豐富的幾何細節。

   1985年由Peachey和Perlin所提出的三維紋理映射方法將三維紋理函數直接定義在三維紋理空間中,數學形式為:

  T=T(x,y,z)(T:顏色的RGB值; (x,y,z):空間點三維坐標)。現在用來構造三維紋理的基本方法常用的主要有兩種:

  基於高頻采樣的數字化紋理和采用數學模型動態計算生成紋理。基於高頻采樣的數字化紋理由於需要有三維數組的支持,在處理高分辨率的紋理時占用空間將急劇增大,對空間的要求比較苛刻。一些真實感較強的圖形合成系統多采用數學模型動態計算生成紋理的紋理定義方法。經過多年的研究實踐已經開發積累了許多過程迭代函數以產生各種復雜的紋理,這些過程紋理(procedural texture)函數被證明是非常有效的,已經可以對木材、大理石、雲彩、火焰和石板等許多自然物體的紋理進行逼真的模擬仿真。這些函數從本質上來說都是一種經驗模型。

  在算法中引入湍流概念

  湍流(turbulence)本是流體力學中的重要研究對象,但在此不准備從湍流的精確物理模型出發對其做任何討論,而是提出一種近似描述該物理現象的經驗模型。這種技術最早在1985年由Perlin提出,曾成功用於對大理石、火焰以及雲彩等紋理的仿真。這種經驗模型是由一系列的三維噪聲函數疊加而成,根據流體力學中湍流的有關概念可以得出可以體現上述經驗模型的數學表達式:

  turbulence(p)=∑|Noise(pow(2,i)*p)/(pow(2,i))|

  其中,p為一紋理空間中的點(x,y,z)。求和區間為i從0到k,上限k是滿足下列不等式的最小整數:
1/(pow(2,k+1))<像素通長。通過選取滿足上述條件的求和上限值 k,可以避免采樣湍流函數時的走樣現象。該函數表達式任取和式的相鄰兩項,後一項噪聲函數的變化頻率總是前一項函數的變化頻率的兩倍,幅度則為前者的一半,也就是對湍流函數的貢獻率減小了一半。因此,上述的構造方法從數學上保證了湍流函數本身就具有一定的自相似特性。從信號分析的角度看,則其功率譜分布滿足1/f的規律。該函數並不能直接對紋理進行仿真,我們所借鑒的只是其隨機性和自相關特性,這些特性在紋理定義時可以很好的描述各種自然紋理的不規則細節。因此湍流函數在紋理造型算法中還是能起到重要作用的。紋理的描述過程大致分兩步:首先選取一個簡單的合適的函數來描述自然物體如大理石的基本紋理結構特征,其中選取的這個描述函數一般應當是連續的且其一階導數應具有較大的變化。在選定描述函數後用湍流函數來對描述函數的某些基本參數進行擾動,以產生復雜的不規則紋理細節。

  對於本文的研究對象--大理石,可以注意到大理石漂亮的紋理其實是其內部不同組成材質的顏色的反映,因此可以定義一個函數來描述這種構造。大理石區別於普通石材的一個比較明顯的特點是其紋理多呈周期分布,對此特性可用某方向的正弦波函數作為彩色濾波:

  marble(p) = marble_color(sin(x))

  p仍為空間點(x,y,z),marble_color()為彩色濾波函數,把[-1,1]區間內任一函數值映射成為RGB顏色之間的顏色值,通常將其表達為三條各自獨立的樣條曲線。在采取了紋理描述的第二步引入了湍流擾動後,上述函數變為最終的描述函數:

  marble(p) = marble_color(sin(x+turbulence(p)))

  算法的實現

  根據前面總結的結論,筆者經過實驗發現,如果定義的樣條曲線在某些點存在較大的一階導數,那麼用該樣條曲線模擬出來的大理石表面紋理將存在較明顯的尖銳邊界。在下面采取的描述算法中樣條曲線為線性函數(一次樣條),效果還是適中的:

COLORREF marble(float px,float py,float pz)
{
float y=py+3.0*turbulence(px,py,pz,0.0125);
y=sin(y*M-PI);
return (marble_color(px));
}

……

COLORREF marble_color(float px);
{
COLORREF col;
float x=sqrt(px+1.0)*0.7071;
int G=(int)(0.30+0.8*x);
x=sqrt(x);
int R=(int)(0.30+0.6*x);
int B=(int)(0.60+0.4*x);
return col;
}
 

以上兩段代碼可以較好地對大理石紋理做仿真模擬處理。同其他紋理一樣,湍流函數也可以用來表達各種表面顏色屬性的不規則性如凹凸紋理、透明度等。

  小結

  本文通過在過程紋理造型技術引入流體力學的湍流概念,成功對大理石的表面紋理作了仿真模擬。通過本文對大理石紋理的計算機仿真的實現過程,可對此類仿真模擬程序有一個基本的認識。湍流函數算法也適用於需要對參數進行擾動處理的其他一些仿真環境。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved