袁小龍,段新力,畢 武,彭仲秋,黃顯義,李永華
(1.新疆地礦局 物化探大隊(duì),新疆 昌吉 830011;2.烏魯木齊金維圖文信息科技有限公司,新疆 烏魯木齊 830091)
用軌跡球?qū)崿F(xiàn)地物化資料三維立體圖的旋轉(zhuǎn)
袁小龍1,2,段新力1,2,畢 武1,2,彭仲秋1,2,黃顯義1,2,李永華1,2
(1.新疆地礦局 物化探大隊(duì),新疆 昌吉 830011;2.烏魯木齊金維圖文信息科技有限公司,新疆 烏魯木齊 830091)
為了從各個(gè)角度觀察屏幕上的三維場景,可以通過鼠標(biāo)的拖動(dòng)來實(shí)現(xiàn)。通常的做法是使場景繞X、Y、Z旋轉(zhuǎn),但這樣操作不方便,旋轉(zhuǎn)效果不理想。有一種更好的方法是:為三維場景建立一個(gè)外接球,旋轉(zhuǎn)外接球的同時(shí)旋轉(zhuǎn)了球體內(nèi)的三維場景,這種技術(shù)叫軌跡球技術(shù)。這里介紹了軌跡球技術(shù)的數(shù)學(xué)原理、計(jì)算方法,并用軌跡球技術(shù)在OpenGL環(huán)境下實(shí)現(xiàn)了地物化資料三維立體圖的旋轉(zhuǎn),操作起來方便直觀,人機(jī)交互體驗(yàn)良好。
軌跡球;虛擬球;三維旋轉(zhuǎn);四元數(shù)
隨著計(jì)算機(jī)硬件、軟件技術(shù)水平的發(fā)展,地物化數(shù)據(jù)圖形表現(xiàn)形式越來越豐富。用三維圖形顯示地物化資料數(shù)據(jù),形象直觀,易于理解。為了從各個(gè)角度觀察場景,可以通過旋轉(zhuǎn)不同的坐標(biāo)軸來實(shí)現(xiàn)。但旋轉(zhuǎn)坐標(biāo)軸操作復(fù)雜,不易理解,用戶使用不方便,作者在本文提出了使用軌跡球來解決這個(gè)問題。軌跡球技術(shù)是由Ken Shoemake提出的,假設(shè)場景中所有物體都包含在一個(gè)球體中,撥動(dòng)這個(gè)球體,使其繞球心旋轉(zhuǎn),這樣球體內(nèi)的物體跟著旋轉(zhuǎn),就可以達(dá)到旋轉(zhuǎn)物體的目的。在計(jì)算機(jī)操作中,屏幕上創(chuàng)建一個(gè)包含所有物體的軌跡球,通過鼠標(biāo)在二維屏幕上的移動(dòng),模擬旋轉(zhuǎn)球體,可人機(jī)交互良好地實(shí)現(xiàn)三維場景的旋轉(zhuǎn)。
(1)屏幕上的設(shè)備坐標(biāo)稱為屏幕坐標(biāo),如下頁圖1(a)所示,矩形左上角坐標(biāo)為(0,0),右下角坐標(biāo)為 (w,h),w為視圖的寬度,h為視圖的高度,屏幕坐標(biāo)以像素為單位,X方向朝右為正,Y方向朝下為正。
(2)定義正方形坐標(biāo)系,如下頁圖1(b)所示,正方形左下角坐標(biāo)為(-1,-1),右上角坐標(biāo)為(1,1),中心點(diǎn)坐標(biāo)為(0,0),X 方向從左向右增大,Y方向從下向上增大。
(3)將屏幕坐標(biāo) (screenX,screenY)轉(zhuǎn)換到正方形坐標(biāo)(square X,squareY)系內(nèi)。在X方向,將坐標(biāo)從范圍(0,width)轉(zhuǎn)換到(-1,1),坐標(biāo)變換為線性變換,令
當(dāng)screenX=0時(shí),square X=-1;當(dāng)screenX=width時(shí),square X =1。將以上參數(shù)代入公式(1),得將a、b值代入公式(1),得到X 方向坐標(biāo)轉(zhuǎn)換函數(shù)公式(2)。同理,可計(jì)算出Y方向坐標(biāo)轉(zhuǎn)換函數(shù)公式(3)。
這樣轉(zhuǎn)換后的坐標(biāo)X范圍為[-1,1],Y范圍為[-1,1],屏幕中心點(diǎn)坐標(biāo)為(0,0)。
(4)做正方形的內(nèi)切圓,如圖1(c)所示。內(nèi)切圓以它的任意一條直徑為軸,旋轉(zhuǎn)180°,形成一個(gè)球體,如圖1(d)所示。設(shè)球體的中心為(0,0,0),半徑為1,我們把這個(gè)球體稱為軌跡球,軌跡球上的坐標(biāo)系稱為軌跡球坐標(biāo)系。
(5)將正方形坐標(biāo) (x,y)轉(zhuǎn)為軌跡球坐標(biāo)(u,v,w)。首先,把正方形內(nèi)的點(diǎn)分成兩部份,一部份在其內(nèi)切圓內(nèi),另一部份在其內(nèi)切圓之外。鼠標(biāo)點(diǎn)擊的位置 (x,y)落在內(nèi)切圓內(nèi),即時(shí),以(x,y)為基點(diǎn),做垂直于屏幕的射線,與軌跡球的外半球(屏幕上能看到的半球)相交于P點(diǎn),如圖1(e)所示。在拖動(dòng)鼠標(biāo)時(shí),相當(dāng)于以P點(diǎn)為基點(diǎn)拖動(dòng)球體,鼠標(biāo)點(diǎn)擊的位置P(x,y)落在內(nèi)切圓之外,即時(shí),如圖1(f)所示?;c(diǎn)P在軌跡球之外,無法拖動(dòng)球體,必須重新找一個(gè)在軌跡球上的基點(diǎn),在uov平面內(nèi),連接OP,OP交內(nèi)切圓于P’點(diǎn),以P’點(diǎn)為基點(diǎn)拽動(dòng)軌跡球。設(shè)θ為OP與OU的夾角,可得:
因軌跡球半徑為1,可得:
綜合鼠標(biāo)點(diǎn)擊位置落在內(nèi)切圓內(nèi)和內(nèi)切圓外兩種情況,可得公式(4)。
(1)旋轉(zhuǎn)軸及旋轉(zhuǎn)角度的確定。如圖2(a)所示,鼠標(biāo)從P1點(diǎn)移動(dòng)到P2點(diǎn),得到兩個(gè)矢量,旋轉(zhuǎn)所張成平面的法向量,通過計(jì)算的叉乘,可得到旋轉(zhuǎn)軸
旋轉(zhuǎn)角度為OP1與OP2之間的夾角θ,在圖2(a)中,M為正方形左邊的中點(diǎn),N為正方形右邊的中點(diǎn),鼠標(biāo)從M點(diǎn)拖動(dòng)到N點(diǎn)時(shí),軌跡球繞V軸旋轉(zhuǎn)了180°,同樣操作,如果要使軌跡球繞V軸旋轉(zhuǎn)360°,則旋轉(zhuǎn)角度得取θ的二倍。在實(shí)際使用過程中,旋轉(zhuǎn)角度α取θ的二倍更符合用戶習(xí)慣。
(2)多次旋轉(zhuǎn)累加。如果鼠標(biāo)進(jìn)行了多次拖動(dòng),則需要將多次拖動(dòng)的效果累加起來。如圖2(b)所示,第一次拖動(dòng)的旋轉(zhuǎn)量為,第二次拖動(dòng)的旋轉(zhuǎn)量為
(3)旋轉(zhuǎn)矩陣的計(jì)算。四元數(shù) Quat4(x,y,z,w)用來存儲(chǔ)旋轉(zhuǎn)軸和旋轉(zhuǎn)角度,設(shè) (a,b,c)為旋轉(zhuǎn)軸向量,θ為旋轉(zhuǎn)角度,根據(jù)四元數(shù)旋轉(zhuǎn)公式:
如果鼠標(biāo)進(jìn)行了兩次以上的拖動(dòng)操作,則需將多次旋轉(zhuǎn)效果進(jìn)行累加。設(shè)Q1(w1,x1,y1,z1),Q2(w2,x2,y2,z2)為兩次旋轉(zhuǎn)的四元數(shù),將兩次旋轉(zhuǎn)效果累加按公式(5)計(jì)算。
注意:Q=Q1*Q2中,先進(jìn)行的是右邊項(xiàng)Q2的旋轉(zhuǎn),再進(jìn)行左邊項(xiàng)Q1的旋轉(zhuǎn)。將最終累加的四元數(shù)轉(zhuǎn)換成旋轉(zhuǎn)矩陣M[2],在OpenGL中乘以這個(gè)旋轉(zhuǎn)矩陣M,實(shí)現(xiàn)軌跡球的旋轉(zhuǎn)。旋轉(zhuǎn)矩陣M按公式(6)計(jì)算。
用OpenGL函數(shù)建立三維地質(zhì)體模型,在鼠標(biāo)移動(dòng)的響應(yīng)函數(shù)中,通過軌跡球計(jì)算出旋轉(zhuǎn)矩陣,當(dāng)前模型視圖矩陣乘以旋轉(zhuǎn)矩陣,實(shí)現(xiàn)旋轉(zhuǎn)操作。
(1)實(shí)例1:對(duì)布格重力網(wǎng)格數(shù)據(jù)做切割法場分離,切割出五層(一層為一個(gè)網(wǎng)格距)的區(qū)域場和剩余場,把布格重力和五層剩余異常放在一起顯示,如圖3所示。用軌跡球旋轉(zhuǎn)操作,可以輕松地旋轉(zhuǎn)到用戶想要的任意位置。
圖3 用軌跡球旋轉(zhuǎn)重力三維圖Fig.3 Rotating 3Dgraphics of gravity by using arcball
(2)實(shí)例2:在鉆孔數(shù)據(jù)上,通過平行輪廓線截面法創(chuàng)建礦體模型,用軌跡球旋轉(zhuǎn)操作可以從各個(gè)角度觀察礦體及鉆孔。如圖4所示。
作者在本文討論了軌跡球坐標(biāo)系的建立,旋轉(zhuǎn)軸及旋轉(zhuǎn)角度的計(jì)算,用四元數(shù)表達(dá)旋轉(zhuǎn)向量,多次旋轉(zhuǎn)效果的累加,以及四元數(shù)轉(zhuǎn)換成旋轉(zhuǎn)矩陣。在OpenGL環(huán)境下編程實(shí)現(xiàn)了三維地質(zhì)模型體繞任意軸旋轉(zhuǎn),并給出了兩個(gè)實(shí)例,用戶可以用二維設(shè)備(鼠標(biāo))輕松、直觀地旋轉(zhuǎn)三維場景。
圖4 用軌跡球旋轉(zhuǎn)礦體及鉆孔Fig.4 Rotating 3Dgraphics of drill hole and ore body by using arcball
[1] MICHAEL CHEN,S.JOY MOUNTFORD.A study in Interactive 3-D Rotation Using 2-D Control Devices[J].Computer Graphics,1988,22(4),121.
[2] SHOEMAKE KEN.Animating Rotation with Quaternion Curves[J].Computer Graphics,1985,19(3):245.
[3] SHOEMAKE K,DUFF T.Matrix animation and polar decomposition[C].In:Procee-dings of Graphics Interface'92,1992.
[4] 馬新武,趙國群,王廣春.用虛擬球?qū)崿F(xiàn)交互式OpengGL 3D圖形的旋轉(zhuǎn)[J].計(jì)算機(jī)應(yīng)用,2001,21(8):169.
[5] 賴朝輝,劉修國,花衛(wèi)東,等.三維數(shù)據(jù)場可視化技術(shù)在數(shù)字礦山中的應(yīng)用[J].金屬礦山,2008(12):131.
[6] 李超玲,楊東來,李豐丹,等.中國數(shù)字地質(zhì)調(diào)查系統(tǒng)的基本構(gòu)架及核心技術(shù)的實(shí)現(xiàn)[J].地質(zhì)通報(bào),2008,27(7):923.
[7] 黃杏元,馬勁松.地理信息系統(tǒng)概論(第三版)[M].北京:高等教育出版社,2008.
[8] 唐圣潔.三維數(shù)據(jù)場可視化[M].北京:清華大學(xué)出版社,2000.
[9] 屈紅剛,潘懋,王勇,等.基于含拓?fù)淦拭娴娜S地質(zhì)建模[J].北京大學(xué)學(xué)報(bào):自然科學(xué)版,2006,42(6):717.
TP 317.4
A
10.3969/j.issn.1001-1749.2012.05.22
1001—1749(2012)05—0622—03
2011-11-24 改回日期:2012-06-16
袁小龍(1982- ),男,本科,主要從事物化探軟件開發(fā)、數(shù)據(jù)處理和資料研究工作。