李麗亞
(太原工業(yè)學(xué)院 計(jì)算機(jī)工程系,山西 太原 030008 )
·計(jì)算機(jī)科學(xué)研究·
基于VC++的圖像紋理映射算法的應(yīng)用
李麗亞
(太原工業(yè)學(xué)院 計(jì)算機(jī)工程系,山西 太原 030008 )
將phong明暗算法和紋理映射方法應(yīng)用于圓柱面,在圓柱面上映射一幅位圖,并進(jìn)行光照計(jì)算.在算法實(shí)現(xiàn)中,利用點(diǎn)表來(lái)進(jìn)行圖像紋理綁定.圖像紋理映射主要實(shí)現(xiàn)的是載入紋理的功能,并且可以控制三維立體圖的形狀、尺寸及紋理等,并通過(guò)時(shí)間設(shè)置使三維圖像最終在視覺(jué)上產(chǎn)生動(dòng)態(tài)效果以及旋轉(zhuǎn)起來(lái)的三維視覺(jué)效果.
紋理映射;載入功能;三維效果
計(jì)算機(jī)圖形學(xué)藝術(shù)的一個(gè)重要目的就是繪制接近真實(shí)的圖形和場(chǎng)景.當(dāng)前流行的兩種熱點(diǎn)技術(shù)分別是LOD技術(shù)和圖像繪制技術(shù)[1].LOD技術(shù)符合人眼的視覺(jué)特點(diǎn),即離視點(diǎn)近繪制較高細(xì)節(jié),遠(yuǎn)則繪制較低細(xì)節(jié);而圖像的繪制技術(shù)是先建三維模型,然后再把圖片映射到模型的表面上,最后利用光照模型,通過(guò)透視投影生成二維圖像.本文即是使用后一種方法來(lái)實(shí)現(xiàn)的,先對(duì)三維圓柱面建模,然后貼圖,添加光照、透視投影,形成三維的視覺(jué)效果.
自然界中的物體表面擁有各種各樣的紋理細(xì)節(jié),我們通過(guò)這些紋理的差別來(lái)區(qū)分相同形狀的物體.在圖形學(xué)中涉及的紋理有兩種:其一是繪制物體面上有凹凸感的紋路所構(gòu)成的圖像,也叫溝紋;其二是形形色色的光滑的彩色圖像,也叫花紋[2].比如:我們?cè)谇蛎嫔腺N上地球表面貼圖,希望陸地是凸起的,海平面是凹下去的,這種圖案是不規(guī)則的,而這種凹凸感僅僅是我們的視覺(jué)感受.而對(duì)于花紋,在物體的外表面添加上以后依舊光滑,就像我們?cè)诨ㄆ康哪P蜕咸砑踊y,我們看起來(lái)它平滑而且有磁器的質(zhì)感.無(wú)論是凹凸感的溝紋和還是平滑的花紋,繪制添加在物體表面的方法是一樣的,也就是生成方法一致,這就是為什么在圖形學(xué)藝術(shù)中把二者統(tǒng)稱紋理.所謂紋理映射即是在繪制好的物體線框圖上添加的各種美麗的圖案.
紋理一般分為顏色紋理、幾何紋理及過(guò)程紋理.顏色紋理是指物體模型上添加的平滑的花紋或文字.幾何紋理一般是針對(duì)物體模型上的微觀幾何形狀的表面紋理,比如地球表面、混凝土墻面、石塊等具有不平滑的凹凸表面.過(guò)程紋理是指由規(guī)則過(guò)渡到不規(guī)則的動(dòng)態(tài)變化的自然景象,比如火、云、煙、霧、水波紋等.這里使用的是顏色紋理的映射[3].
(1)紋理映射的過(guò)程
三維計(jì)算機(jī)圖像處理的核心部分主要包括幾何數(shù)據(jù)輸入、動(dòng)畫(huà)、坐標(biāo)變換、視域裁剪、取景變換、繪制渲染、直到最后輸出合成圖像.
(2)紋理映射的實(shí)現(xiàn)方法
我們常用的顏色紋理和凹凸紋理在實(shí)現(xiàn)時(shí)可以用這樣的方法:顏色紋理映射可以用兩種方法來(lái)實(shí)現(xiàn),方法一是不計(jì)算光照,而是直接用紋理來(lái)替代物體原先的顏色.方法二是紋理數(shù)據(jù)參加光照計(jì)算.因?yàn)楦吖獾念伾Q于光源的顏色,它和物體模型本身材質(zhì)的顏色沒(méi)有關(guān)系.所以需將鏡面反射光分離,通過(guò)設(shè)置材質(zhì)漫反射系數(shù)kd完成紋理映射后,再將鏡面反射光分量加上去.凹凸紋理(bump map)的基本思想是用簡(jiǎn)單光照模型計(jì)算物體表面的光強(qiáng)時(shí),對(duì)物體表面的法向進(jìn)行微小的擾動(dòng),導(dǎo)致表面光強(qiáng)的突變,產(chǎn)生凹凸不平的真實(shí)感效果.
幾何模型在圖形學(xué)藝術(shù)中有廣泛的應(yīng)用,而圓柱體就是其中之一.本文是在圓柱體的基礎(chǔ)幾何體上進(jìn)行紋理添加,從而實(shí)現(xiàn)一個(gè)真實(shí)感圖形的實(shí)際應(yīng)用.利用 Phong 算法及圓柱面圖像紋理映射旋轉(zhuǎn)展示“清明上河圖”的畫(huà)軸.畫(huà)軸紋理圖如圖1所示.
(1)Phong明暗處理步驟
首先計(jì)算多邊形頂點(diǎn)的平均法矢量;第二步對(duì)多邊形網(wǎng)格的每個(gè)頂點(diǎn)根據(jù)簡(jiǎn)單光照模型計(jì)算光強(qiáng);根據(jù)每個(gè)多邊形網(wǎng)格的頂點(diǎn)的光強(qiáng),按照掃描線順序使用線性插值計(jì)算多邊形網(wǎng)格邊上每一點(diǎn)的光強(qiáng);在掃描線與多邊形相交區(qū)間內(nèi),使用線性插值獲得區(qū)間內(nèi)每一點(diǎn)的光強(qiáng).然后再將光強(qiáng)分解為該點(diǎn)的RGB顏色.
(2)紋理映射的設(shè)計(jì)
紋理映射的步驟:將屏幕坐標(biāo)系中四個(gè)角點(diǎn)的像素點(diǎn)映射到物體坐標(biāo)系中物體表面的可見(jiàn)部分;將物體坐標(biāo)系對(duì)應(yīng)到紋理坐標(biāo)系;再對(duì)紋理坐標(biāo)系下的四邊形面片中的所有像素點(diǎn)做加權(quán)平均,最后的結(jié)果作為物體表面的漫反射系數(shù)參與顏色計(jì)算[4].如圖2所示.
圖2 紋理映射步驟
當(dāng)物體表面是參數(shù)曲面時(shí),給定參數(shù)與紋理坐標(biāo)之間的關(guān)系,如圖3所示.
(1)
(2)
(3)圓柱面映射過(guò)程
從平面圖像坐標(biāo)到柱面坐標(biāo)的幾何變換,就是根據(jù)平面圖像上個(gè)點(diǎn)的坐標(biāo),求出對(duì)應(yīng)圓柱表面上點(diǎn)的坐標(biāo),實(shí)現(xiàn)圖像從平面到圓柱表面的映射.即以屏幕客戶區(qū)中心自定義坐標(biāo)系,并把它作為圓柱面模型的體心.然后讀入二維位圖圖像紋理,利用點(diǎn)表將紋理綁定到圓柱表面.使用材質(zhì)漫反射設(shè)置紋理顏色,廣元顏色設(shè)置為白色.使用 Phong 明暗原理來(lái)繪制光照紋理圓柱面動(dòng)畫(huà).如圖4所示.
圖3 曲面紋理映射圖4 從平面到圓柱面的映射
3.1 觀察視點(diǎn)的設(shè)置
視點(diǎn)即人的眼睛處于的方向,在這里的視點(diǎn)是指模擬的人眼在場(chǎng)景中的位置(也就是在用戶坐標(biāo)系中的位置) ,由于本程序是要實(shí)現(xiàn)畫(huà)軸效果,所以視點(diǎn)應(yīng)該高于水平線.在初始化構(gòu)造函數(shù)中 R、Phi、Theta 控制視點(diǎn)在用戶坐標(biāo)系中的球坐標(biāo),d 來(lái)控制視距.將 R 設(shè)置為1000,d 設(shè)置為 800,Phi 的值設(shè)置為 80,Theta 的值置 0,即可設(shè)置視點(diǎn)位于水平線.
bPlay=FALSE;//初始設(shè)置不選擇,點(diǎn)擊 play 按鈕后才開(kāi)始旋轉(zhuǎn)
R=1000.0,d=800.0,Phi=80.0,Theta=0.0;//視點(diǎn)視距
Near=200.0,Far=1200.0;//近剪切面與遠(yuǎn)剪切面
Alpha=0.0,Beta=0.0;//旋轉(zhuǎn)角
3.2 自定義圓柱半徑和高度
給點(diǎn)表函數(shù) ReadVertex 設(shè)置兩個(gè)參數(shù) rr 和 hh, 即圓柱體的底面半徑和圓柱體的高, 通過(guò)這兩個(gè)參數(shù)設(shè)置圓柱體的底面和高度,在調(diào)用時(shí),只需要給定這兩個(gè)參數(shù),然后由函數(shù)將這兩個(gè)實(shí)參傳遞進(jìn)去,從而實(shí)現(xiàn)圓柱體的初始化.
void CTestView::ReadVertex(double rr,double hh)//點(diǎn)表
{
double r=rr;//圓柱底面半徑
h=hh;//圓柱的高
}
3.3 控制旋轉(zhuǎn)頻率的定時(shí)器設(shè)置
時(shí)間定時(shí)器可以控制圓柱體畫(huà)軸的旋轉(zhuǎn)速度, 點(diǎn)擊 play 按鈕后, 定時(shí)器 SetTimer()開(kāi)始工作,間隔時(shí)間為 0 ms,再次單擊運(yùn)行,KillTimer()函數(shù)重新進(jìn)入工作狀態(tài),銷毀定時(shí)器 SetTimer().
void CTestView::OnPlay()
{
bPlay=bPlay?FALSE:TRUE;
if(bPlay)
SetTimer(1,0,NULL);
else
KillTimer(1);
}
圖5 “清明上河圖”畫(huà)軸開(kāi)始效果
3.4 每次旋轉(zhuǎn)角度的設(shè)置
在旋轉(zhuǎn)的時(shí)候旋轉(zhuǎn)的時(shí)間間隔和選擇角度會(huì)影響旋轉(zhuǎn)的效果,選擇一個(gè)合適的選擇角度就比較重要,這里將旋轉(zhuǎn)角度設(shè)置為 2,使旋轉(zhuǎn)呈現(xiàn)一個(gè)緩慢漸進(jìn)的效果.
void CTestView::OnTimer(UINT nIDEvent)//動(dòng)畫(huà)時(shí)間函數(shù)
{
Beta=2;
tran.RotateY(Beta);
Invalidate(FALSE);
CView::OnTimer(nIDEvent);
}[5]
(5)項(xiàng)目效果
模型初始化開(kāi)始時(shí)的效果:
點(diǎn)擊繪圖圖標(biāo)后,畫(huà)軸開(kāi)始轉(zhuǎn)動(dòng),效果如圖6、7、8、9所示.
圖6 旋轉(zhuǎn)角度為72度的圖像 圖7 旋轉(zhuǎn)角度為144度的圖形
圖8 選擇角度為216度的圖像 圖9 旋轉(zhuǎn)角度為288度的圖像
本文是將Phong明暗算法和紋理映射方法應(yīng)用于在圓柱面上映射一幅位圖,并進(jìn)行了光照計(jì)算.圓柱面?zhèn)让嬲归_(kāi)為長(zhǎng)方形,獲取需貼圖案的展開(kāi)尺寸后,則圓柱面模型表面上的像素點(diǎn)可以與貼圖上的像素點(diǎn)一一對(duì)應(yīng).在案例中,運(yùn)用點(diǎn)表進(jìn)行圖像紋理綁定.圖像紋理映射的設(shè)計(jì)在程序運(yùn)行的結(jié)果中可以通過(guò)實(shí)際的截圖看出,主要實(shí)現(xiàn)的是載入紋理的功能,并且通過(guò)代碼編寫(xiě)來(lái)控制三維立體圖的形狀、尺寸及紋理等.最后通過(guò)時(shí)間設(shè)置使三維圖像最終在視覺(jué)上產(chǎn)生動(dòng)態(tài)效果以及旋轉(zhuǎn)起來(lái)的三維視覺(jué)效果.
[1]孔令德.計(jì)算機(jī)圖形學(xué)基礎(chǔ)教程[M].北京:清華大學(xué)出版社,2012.
[2]D.P.Mukherjee,Debasish Jana.Computer Graphics Algorithms and Implementations[M].北京:清華大學(xué)出版社,2012.
[3]韓希珍,趙建.結(jié)合偏微分方程增強(qiáng)圖像紋理及對(duì)比度[J].光學(xué)精密工程,2012(6).
[4]姚嘉梁,胡軍.人臉全景紋理圖像拼接算法[J].計(jì)算機(jī)仿真,2011(2).
[5]孔令德.計(jì)算機(jī)圖形學(xué)實(shí)踐教程[M].北京:清華大學(xué)出版社,2013.
2016-10-02
李麗亞(1981-),女,山西陽(yáng)城人,講師,研究方向?yàn)閳D形圖像.
TP311.1
A
2095-185X(2017)02-0043-04