(成都理工大學(xué) 四川 成都 610059)
ArcGIS Runtime 是ESRI公司開(kāi)發(fā)的二次開(kāi)發(fā)包,可構(gòu)建本地應(yīng)用程序并將其部署到各種流行的平臺(tái)和設(shè)備中。為原生應(yīng)用添加強(qiáng)大的空間功能,并使應(yīng)用用戶能夠執(zhí)行所有GIS。三維坐標(biāo)轉(zhuǎn)換一直是測(cè)量領(lǐng)域的一個(gè)重要內(nèi)容[1],在圖形學(xué)中,三維建模技術(shù)提供了很多必要的方法用來(lái)將現(xiàn)實(shí)世界中的物體轉(zhuǎn)化為三維坐標(biāo)系下的數(shù)學(xué)表達(dá)形式,并通過(guò)計(jì)算機(jī)程序進(jìn)行渲染,從而實(shí)現(xiàn)在虛擬空間中模擬真實(shí)世界的效果[2]。三維坐標(biāo)轉(zhuǎn)換中最重要是坐標(biāo)轉(zhuǎn)換參數(shù)的求解。坐標(biāo)轉(zhuǎn)換參數(shù)分為旋轉(zhuǎn)、平移和尺度參數(shù),其中旋轉(zhuǎn)參數(shù)的確定是坐標(biāo)轉(zhuǎn)換的核心[3]。本文將通過(guò)控制變量的方法進(jìn)行觀察ArcGIS Runtime的旋轉(zhuǎn)現(xiàn)象,并通過(guò)該現(xiàn)象推導(dǎo)出ArcGIS Runtime的旋轉(zhuǎn)機(jī)制,計(jì)算出該旋轉(zhuǎn)機(jī)制的旋轉(zhuǎn)矩陣,然后進(jìn)行不同旋轉(zhuǎn)機(jī)制旋轉(zhuǎn)角的解算,最后驗(yàn)證成果。
本文實(shí)例三維模型為電塔模型,該模型是由多個(gè)組件模型通過(guò)三維空間旋轉(zhuǎn)角和坐標(biāo)定位定姿態(tài)組合而來(lái),旋轉(zhuǎn)角及坐標(biāo)都存儲(chǔ)在renderALL.db數(shù)據(jù)庫(kù)中,該模型的旋轉(zhuǎn)機(jī)制如下:
1.繞Heading軸旋轉(zhuǎn)Rotate_z,用于確定模型側(cè)身角度。

圖1 繞Heading軸旋轉(zhuǎn)Rotate_z
2.繞Roll軸旋轉(zhuǎn)Rotate_x,用于確定模型俯仰角度。

圖2 繞Roll軸旋轉(zhuǎn)Rotate_x
3.繞Heading軸旋轉(zhuǎn)Rotate_y,第二次繞Heading軸旋轉(zhuǎn)弧度值,用于確定模型的指向方向。

圖3 繞Heading軸旋轉(zhuǎn)Rotate_y
4.從以上描述可以看出該模型的旋轉(zhuǎn)機(jī)制是Heading-Roll-Heading的不帶軸旋轉(zhuǎn)。

圖4 技術(shù)路線
首先通過(guò)對(duì)模型的轉(zhuǎn)動(dòng)進(jìn)行其轉(zhuǎn)動(dòng)軸方向的確定,然后對(duì)是否帶動(dòng)其他軸的待測(cè)軸進(jìn)行轉(zhuǎn)動(dòng),轉(zhuǎn)動(dòng)到適當(dāng)?shù)慕嵌群?,再?duì)其他軸進(jìn)行轉(zhuǎn)動(dòng)并比較觀察此時(shí)其他軸是否與模型初始的轉(zhuǎn)動(dòng)軸一致。從而得出軸旋轉(zhuǎn)的帶動(dòng)情況,最后分析解釋現(xiàn)象得出結(jié)論。
直接給Heading,Picth,Roll賦值,進(jìn)而測(cè)試旋轉(zhuǎn)軸的帶動(dòng)情況。
通過(guò)對(duì)模型進(jìn)行測(cè)試轉(zhuǎn)動(dòng),得到以下成果:

圖5 ArcGIS Runtime中三個(gè)轉(zhuǎn)動(dòng)軸
(其中黃色軸為Heading軸,紅色軸為Pitch軸,橙色軸為Roll軸)
Figure5ThreeRotatingaxesinArcGISRuntime
(The yellow axis is the Heading axis,the red axis is the Pitch axis,and the orange axis is the Roll axis)

圖6 Pitch軸的旋轉(zhuǎn)不帶動(dòng)Heading軸

圖7 Pitch軸的旋轉(zhuǎn)帶動(dòng)Roll軸

圖8 Roll軸的旋轉(zhuǎn)不帶動(dòng)Heading軸

圖9 Roll軸的旋轉(zhuǎn)不帶動(dòng)Pitch軸

圖10 Heading軸的旋轉(zhuǎn)帶動(dòng)Pitch軸

圖11 Heading軸的旋轉(zhuǎn)帶動(dòng)Roll軸
圖中白線旋轉(zhuǎn)軸為被帶動(dòng)后的旋轉(zhuǎn)軸,其他顏色旋轉(zhuǎn)軸與初始旋轉(zhuǎn)軸一致。利用此方法觀察ArcGIS Runtime的模型旋轉(zhuǎn),現(xiàn)象總結(jié)如下:

表一 ArcGIS Runtime中旋轉(zhuǎn)軸的帶動(dòng)現(xiàn)象
但ArcGIS Runtime的模型旋轉(zhuǎn)并非如此復(fù)雜,當(dāng)Pitch,Roll,Heading任意一個(gè)的值發(fā)生改變時(shí),并不是基于上次的空間姿態(tài)改變相應(yīng)的角度,而是計(jì)算機(jī)重新通過(guò)獲取到的三個(gè)旋轉(zhuǎn)角度進(jìn)行計(jì)算空間姿態(tài)。通過(guò)上面的旋轉(zhuǎn)現(xiàn)象可以看出,ArcGIS Runtime的旋轉(zhuǎn)機(jī)制是帶軸旋轉(zhuǎn)的,在旋轉(zhuǎn)的順序上,后面軸的旋轉(zhuǎn)是不會(huì)影響前面的旋轉(zhuǎn)的,而現(xiàn)象中出現(xiàn)的不帶軸的情況是因?yàn)樵撦S在旋轉(zhuǎn)順序的后面,導(dǎo)致每次改變處于順序后面的旋轉(zhuǎn)角度時(shí),計(jì)算機(jī)都會(huì)重新通過(guò)旋轉(zhuǎn)順序計(jì)算模型空間姿態(tài),處于順序前面的旋轉(zhuǎn)角度沒(méi)有改變,因此后面的旋轉(zhuǎn)軸與以前的一致,當(dāng)計(jì)算到順序后面的軸旋轉(zhuǎn)時(shí),由于順序前面的軸已經(jīng)旋轉(zhuǎn)過(guò)了,而后面也沒(méi)有該軸的旋轉(zhuǎn),因此造成了后面的旋轉(zhuǎn)沒(méi)有帶動(dòng)處于旋轉(zhuǎn)順序前面的軸旋轉(zhuǎn)的假象,因此可以得出結(jié)論有不帶軸旋轉(zhuǎn)假象的旋轉(zhuǎn)處于旋轉(zhuǎn)順序的后面,由此結(jié)論及該現(xiàn)象便可以推論出ArcGIS Runtime的旋轉(zhuǎn)機(jī)制是Heading - Pitch - Roll順序的帶軸旋轉(zhuǎn)。
在旋轉(zhuǎn)順序上,順序后面的軸旋轉(zhuǎn)將不會(huì)影響順序前面軸的旋轉(zhuǎn),而順序前面的軸旋轉(zhuǎn)會(huì)帶動(dòng)后面旋轉(zhuǎn)的旋轉(zhuǎn)軸。當(dāng)逆順序的不帶軸旋轉(zhuǎn)時(shí),由于是不帶軸旋轉(zhuǎn),因此順序前面的軸旋轉(zhuǎn)不會(huì)影響順序后面的軸旋轉(zhuǎn),此時(shí)討論順序后面的軸旋轉(zhuǎn)是否帶動(dòng)順序前面的軸也已經(jīng)沒(méi)有意義了,因?yàn)閹Р粠?dòng)都不會(huì)影響順序后面的旋轉(zhuǎn),正順序的帶軸旋轉(zhuǎn),順序后面的軸旋轉(zhuǎn)不會(huì)影響順序前面的軸旋轉(zhuǎn),因此,兩者影響順序后面旋轉(zhuǎn)的旋轉(zhuǎn)軸帶動(dòng)情況是一致的,當(dāng)對(duì)應(yīng)軸的旋轉(zhuǎn)角度一致時(shí),兩種旋轉(zhuǎn)方法也將會(huì)達(dá)到一樣的效果。因此可以得出結(jié)論,逆順序的不帶軸旋轉(zhuǎn)效果等同于帶軸旋轉(zhuǎn),這也為后面的旋轉(zhuǎn)角矩陣解算提供了支撐。
就以ArcGIS Runtime的旋轉(zhuǎn)機(jī)制為例,當(dāng)逆順序不帶軸旋轉(zhuǎn)時(shí),Roll軸的旋轉(zhuǎn)不帶其他軸。Pitch軸的旋轉(zhuǎn),首先不會(huì)帶動(dòng)Heading軸,而Roll軸順序上在Pitch軸前面,因此Pitch軸會(huì)不會(huì)被帶動(dòng)已經(jīng)沒(méi)有意義了(實(shí)際上是帶動(dòng)的),因?yàn)椴粫?huì)影響后面的旋轉(zhuǎn),而這里為了方便比較就記為Pitch的旋轉(zhuǎn)帶動(dòng)了Roll,而最后的Heading軸更是如此,會(huì)不會(huì)帶動(dòng)其他軸已經(jīng)沒(méi)有意義了,為了方便比較同樣記為帶動(dòng)了Pitch軸和Roll軸,由此可以看出現(xiàn)象:

表二 逆順序的不帶軸旋轉(zhuǎn)旋轉(zhuǎn)軸的帶動(dòng)現(xiàn)象
該現(xiàn)象與ArcGIS Runtime的旋轉(zhuǎn)現(xiàn)象一致,當(dāng)對(duì)應(yīng)軸的旋轉(zhuǎn)角度一致時(shí),兩種旋轉(zhuǎn)機(jī)制效果等同。
坐標(biāo)變換,利用歐拉角描述一次平面旋轉(zhuǎn),見(jiàn)圖12。

圖12 坐標(biāo)系間的變換關(guān)系
設(shè)坐標(biāo)系繞O點(diǎn)旋轉(zhuǎn)θ角后得到坐標(biāo)系X′ OY′,空間中有一矢量OP在坐標(biāo)系XOY中的坐標(biāo)為r1,在坐標(biāo)系X′OY′中坐標(biāo)為r2,Z坐標(biāo)未變,即有[4]:

(1)
r2=R*r1
旋轉(zhuǎn)矩陣是由9個(gè)元素組成的3×3的正交矩陣[5]。假設(shè)繞著Heading,Pitch,Roll旋轉(zhuǎn)的角度為z,x,y,以此類(lèi)推,則空間的三個(gè)旋轉(zhuǎn)矩陣如下:
(2)
空間的旋轉(zhuǎn)矩陣是由多個(gè)單次旋轉(zhuǎn)組成。如果第二次及以后的旋轉(zhuǎn)是相對(duì)于基礎(chǔ)坐標(biāo)系來(lái)做的,則第二個(gè)及以后的旋轉(zhuǎn)矩陣左乘之前的旋轉(zhuǎn)矩陣。
如果第二次及以后的旋轉(zhuǎn)矩陣是相對(duì)于前一次旋轉(zhuǎn)后帶動(dòng)的坐標(biāo)系,則第二次及以后的旋轉(zhuǎn)矩陣右乘之前的旋轉(zhuǎn)矩陣[6]。
而ArcGIS Runtime的旋轉(zhuǎn)是帶軸旋轉(zhuǎn)的,因此旋轉(zhuǎn)矩陣的組合是矩陣的右乘,假設(shè)在ArcGIS Runtime中繞著Heading,Pitch,Roll旋轉(zhuǎn)的角度為z,x,y,則ArcGIS Runtime旋轉(zhuǎn)矩陣為RHeading(z)RPitch(x)RRoll(y)。
ArcGIS Runtime的旋轉(zhuǎn)矩陣是:

R11=cos y cos z-sin y sin x sin z
R12=-sin z cos x
R13=sin y cos z+cos y sin z sin x
R21=cos y sin z+sin y sin x cos z
R22=cos x cos z
(3)
R23=sin z sin y-sin x cos z cos y
R31=-sin y cos z
R32=sin x
R33=cos y cos x
從上列等式可以導(dǎo)出x,y,z的角度,公式如下:
y=arctan2(-R13,R33);
(4)
z=arctan2(-R21,R22)
這樣便可以將任意的旋轉(zhuǎn)機(jī)制的旋轉(zhuǎn)角轉(zhuǎn)換為ArcGIS Runtime旋轉(zhuǎn)機(jī)制的旋轉(zhuǎn)角了。假設(shè)電塔模型旋轉(zhuǎn)機(jī)制的旋轉(zhuǎn)角分別為Rotate_z,Rotate_x,Rotate_y,由于是不帶軸旋轉(zhuǎn),旋轉(zhuǎn)矩陣的組合是矩陣的左乘,而帶軸旋轉(zhuǎn)與不帶軸旋轉(zhuǎn)的相互轉(zhuǎn)換是逆順序旋轉(zhuǎn)即可,因此該旋轉(zhuǎn)矩陣如下:
P11=cos(Rotate_z)cos(Rotate_x)cos(Rotate_y)-sin(Rotate_z)sin(Rotate_y)
P12=-cos(Rotate_z)cos(Rotate_x)sin(Rotate_y)-sin(Rotate_z)cos(Rotate_y)
P13=cos(Rotate_z)cos(Rotate_x)
(5)
P21=sin(Rotate_z)cos(Rotate_x)cos(Rotate_y)+cos(Rotate_z)sin(Rotate_y)
P22=-sin(Rotate_z)cos(Rotate_x)sin(Rotate_y)+cos(Rotate_z)cos(Rotate_y)
P23=sin(Rotate_z)sin(Rotate_x)
P31=-sin(Rotate_x)cos(Rotate_y)
P32=sin(Rotate_x)sin(Rotate_y)
P33=cos(Rotate_x)
兩個(gè)旋轉(zhuǎn)矩陣都是使同一個(gè)初始姿態(tài)到同一個(gè)目標(biāo)姿態(tài),因此令R=P;則有:
y=arctan2(-P13,P33);
(6)
z=arctan2(-P21,P22)
由此可得由電塔的旋轉(zhuǎn)機(jī)制的旋轉(zhuǎn)角推導(dǎo)出ArcGIS Runtime旋轉(zhuǎn)機(jī)制的旋轉(zhuǎn)角。
通過(guò)該公式編寫(xiě)程序進(jìn)行成果測(cè)試。
通過(guò)測(cè)試,無(wú)論當(dāng)前是怎樣的姿態(tài),當(dāng)轉(zhuǎn)動(dòng)三個(gè)旋轉(zhuǎn)軸來(lái)改變Rotate_z,Rotate_x,Rotate_y的值時(shí),在ArcGIS Runtime中剛好和塔模型旋轉(zhuǎn)機(jī)制中的側(cè)身,俯仰和指向相對(duì)應(yīng),通過(guò)這樣的算法,將ArcGIS Runtime的旋轉(zhuǎn)機(jī)制轉(zhuǎn)化為了塔模型的旋轉(zhuǎn)機(jī)制。這也說(shuō)明了該公式和方法的正確性。
三維模型姿態(tài)變換是三維模型應(yīng)用領(lǐng)域的重要基礎(chǔ)技術(shù),隨著三維模型在各行各業(yè)中的廣泛應(yīng)用,三維模型姿態(tài)變換技術(shù)也得到了飛速的發(fā)展[7]。而對(duì)于ArcGIS Runtime而言,三維模型姿態(tài)變換也影響用戶的直觀體驗(yàn),模型的精準(zhǔn)定位定姿態(tài)是三維應(yīng)用最基本的保證。本文不僅給出了ArcGIS Runtime的旋轉(zhuǎn)機(jī)制和不同旋轉(zhuǎn)機(jī)制的旋轉(zhuǎn)角轉(zhuǎn)換,更是提供了觀察旋轉(zhuǎn)機(jī)制和不同旋轉(zhuǎn)機(jī)制的旋轉(zhuǎn)角轉(zhuǎn)換的解算方法,這為更多的三維GIS開(kāi)發(fā)者提供了支撐。