(成都理工大學 四川 成都 610059)
ArcGIS Runtime 是ESRI公司開發(fā)的二次開發(fā)包,可構建本地應用程序并將其部署到各種流行的平臺和設備中。為原生應用添加強大的空間功能,并使應用用戶能夠執(zhí)行所有GIS。三維坐標轉(zhuǎn)換一直是測量領域的一個重要內(nèi)容[1],在圖形學中,三維建模技術提供了很多必要的方法用來將現(xiàn)實世界中的物體轉(zhuǎn)化為三維坐標系下的數(shù)學表達形式,并通過計算機程序進行渲染,從而實現(xiàn)在虛擬空間中模擬真實世界的效果[2]。三維坐標轉(zhuǎn)換中最重要是坐標轉(zhuǎn)換參數(shù)的求解。坐標轉(zhuǎn)換參數(shù)分為旋轉(zhuǎn)、平移和尺度參數(shù),其中旋轉(zhuǎn)參數(shù)的確定是坐標轉(zhuǎn)換的核心[3]。本文將通過控制變量的方法進行觀察ArcGIS Runtime的旋轉(zhuǎn)現(xiàn)象,并通過該現(xiàn)象推導出ArcGIS Runtime的旋轉(zhuǎn)機制,計算出該旋轉(zhuǎn)機制的旋轉(zhuǎn)矩陣,然后進行不同旋轉(zhuǎn)機制旋轉(zhuǎn)角的解算,最后驗證成果。
本文實例三維模型為電塔模型,該模型是由多個組件模型通過三維空間旋轉(zhuǎn)角和坐標定位定姿態(tài)組合而來,旋轉(zhuǎn)角及坐標都存儲在renderALL.db數(shù)據(jù)庫中,該模型的旋轉(zhuǎn)機制如下:
1.繞Heading軸旋轉(zhuǎn)Rotate_z,用于確定模型側身角度。
圖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)機制是Heading-Roll-Heading的不帶軸旋轉(zhuǎn)。
圖4 技術路線
首先通過對模型的轉(zhuǎn)動進行其轉(zhuǎn)動軸方向的確定,然后對是否帶動其他軸的待測軸進行轉(zhuǎn)動,轉(zhuǎn)動到適當?shù)慕嵌群?,再對其他軸進行轉(zhuǎn)動并比較觀察此時其他軸是否與模型初始的轉(zhuǎn)動軸一致。從而得出軸旋轉(zhuǎn)的帶動情況,最后分析解釋現(xiàn)象得出結論。
直接給Heading,Picth,Roll賦值,進而測試旋轉(zhuǎn)軸的帶動情況。
通過對模型進行測試轉(zhuǎn)動,得到以下成果:
圖5 ArcGIS Runtime中三個轉(zhuǎn)動軸
(其中黃色軸為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)不帶動Heading軸
圖7 Pitch軸的旋轉(zhuǎn)帶動Roll軸
圖8 Roll軸的旋轉(zhuǎn)不帶動Heading軸
圖9 Roll軸的旋轉(zhuǎn)不帶動Pitch軸
圖10 Heading軸的旋轉(zhuǎn)帶動Pitch軸
圖11 Heading軸的旋轉(zhuǎn)帶動Roll軸
圖中白線旋轉(zhuǎn)軸為被帶動后的旋轉(zhuǎn)軸,其他顏色旋轉(zhuǎn)軸與初始旋轉(zhuǎn)軸一致。利用此方法觀察ArcGIS Runtime的模型旋轉(zhuǎn),現(xiàn)象總結如下:
表一 ArcGIS Runtime中旋轉(zhuǎn)軸的帶動現(xiàn)象
但ArcGIS Runtime的模型旋轉(zhuǎn)并非如此復雜,當Pitch,Roll,Heading任意一個的值發(fā)生改變時,并不是基于上次的空間姿態(tài)改變相應的角度,而是計算機重新通過獲取到的三個旋轉(zhuǎn)角度進行計算空間姿態(tài)。通過上面的旋轉(zhuǎn)現(xiàn)象可以看出,ArcGIS Runtime的旋轉(zhuǎn)機制是帶軸旋轉(zhuǎn)的,在旋轉(zhuǎn)的順序上,后面軸的旋轉(zhuǎn)是不會影響前面的旋轉(zhuǎn)的,而現(xiàn)象中出現(xiàn)的不帶軸的情況是因為該軸在旋轉(zhuǎn)順序的后面,導致每次改變處于順序后面的旋轉(zhuǎn)角度時,計算機都會重新通過旋轉(zhuǎn)順序計算模型空間姿態(tài),處于順序前面的旋轉(zhuǎn)角度沒有改變,因此后面的旋轉(zhuǎn)軸與以前的一致,當計算到順序后面的軸旋轉(zhuǎn)時,由于順序前面的軸已經(jīng)旋轉(zhuǎn)過了,而后面也沒有該軸的旋轉(zhuǎn),因此造成了后面的旋轉(zhuǎn)沒有帶動處于旋轉(zhuǎn)順序前面的軸旋轉(zhuǎn)的假象,因此可以得出結論有不帶軸旋轉(zhuǎn)假象的旋轉(zhuǎn)處于旋轉(zhuǎn)順序的后面,由此結論及該現(xiàn)象便可以推論出ArcGIS Runtime的旋轉(zhuǎn)機制是Heading - Pitch - Roll順序的帶軸旋轉(zhuǎn)。
在旋轉(zhuǎn)順序上,順序后面的軸旋轉(zhuǎn)將不會影響順序前面軸的旋轉(zhuǎn),而順序前面的軸旋轉(zhuǎn)會帶動后面旋轉(zhuǎn)的旋轉(zhuǎn)軸。當逆順序的不帶軸旋轉(zhuǎn)時,由于是不帶軸旋轉(zhuǎn),因此順序前面的軸旋轉(zhuǎn)不會影響順序后面的軸旋轉(zhuǎn),此時討論順序后面的軸旋轉(zhuǎn)是否帶動順序前面的軸也已經(jīng)沒有意義了,因為帶不帶動都不會影響順序后面的旋轉(zhuǎn),正順序的帶軸旋轉(zhuǎn),順序后面的軸旋轉(zhuǎn)不會影響順序前面的軸旋轉(zhuǎn),因此,兩者影響順序后面旋轉(zhuǎn)的旋轉(zhuǎn)軸帶動情況是一致的,當對應軸的旋轉(zhuǎn)角度一致時,兩種旋轉(zhuǎn)方法也將會達到一樣的效果。因此可以得出結論,逆順序的不帶軸旋轉(zhuǎn)效果等同于帶軸旋轉(zhuǎn),這也為后面的旋轉(zhuǎn)角矩陣解算提供了支撐。
就以ArcGIS Runtime的旋轉(zhuǎn)機制為例,當逆順序不帶軸旋轉(zhuǎn)時,Roll軸的旋轉(zhuǎn)不帶其他軸。Pitch軸的旋轉(zhuǎn),首先不會帶動Heading軸,而Roll軸順序上在Pitch軸前面,因此Pitch軸會不會被帶動已經(jīng)沒有意義了(實際上是帶動的),因為不會影響后面的旋轉(zhuǎn),而這里為了方便比較就記為Pitch的旋轉(zhuǎn)帶動了Roll,而最后的Heading軸更是如此,會不會帶動其他軸已經(jīng)沒有意義了,為了方便比較同樣記為帶動了Pitch軸和Roll軸,由此可以看出現(xiàn)象:
表二 逆順序的不帶軸旋轉(zhuǎn)旋轉(zhuǎn)軸的帶動現(xiàn)象
該現(xiàn)象與ArcGIS Runtime的旋轉(zhuǎn)現(xiàn)象一致,當對應軸的旋轉(zhuǎn)角度一致時,兩種旋轉(zhuǎn)機制效果等同。
坐標變換,利用歐拉角描述一次平面旋轉(zhuǎn),見圖12。
圖12 坐標系間的變換關系
設坐標系繞O點旋轉(zhuǎn)θ角后得到坐標系X′ OY′,空間中有一矢量OP在坐標系XOY中的坐標為r1,在坐標系X′OY′中坐標為r2,Z坐標未變,即有[4]:
(1)
r2=R*r1
旋轉(zhuǎn)矩陣是由9個元素組成的3×3的正交矩陣[5]。假設繞著Heading,Pitch,Roll旋轉(zhuǎn)的角度為z,x,y,以此類推,則空間的三個旋轉(zhuǎn)矩陣如下:
(2)
空間的旋轉(zhuǎn)矩陣是由多個單次旋轉(zhuǎn)組成。如果第二次及以后的旋轉(zhuǎn)是相對于基礎坐標系來做的,則第二個及以后的旋轉(zhuǎn)矩陣左乘之前的旋轉(zhuǎn)矩陣。
如果第二次及以后的旋轉(zhuǎn)矩陣是相對于前一次旋轉(zhuǎn)后帶動的坐標系,則第二次及以后的旋轉(zhuǎn)矩陣右乘之前的旋轉(zhuǎn)矩陣[6]。
而ArcGIS Runtime的旋轉(zhuǎn)是帶軸旋轉(zhuǎn)的,因此旋轉(zhuǎn)矩陣的組合是矩陣的右乘,假設在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
從上列等式可以導出x,y,z的角度,公式如下:
y=arctan2(-R13,R33);
(4)
z=arctan2(-R21,R22)
這樣便可以將任意的旋轉(zhuǎn)機制的旋轉(zhuǎn)角轉(zhuǎn)換為ArcGIS Runtime旋轉(zhuǎn)機制的旋轉(zhuǎn)角了。假設電塔模型旋轉(zhuǎn)機制的旋轉(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)
兩個旋轉(zhuǎn)矩陣都是使同一個初始姿態(tài)到同一個目標姿態(tài),因此令R=P;則有:
y=arctan2(-P13,P33);
(6)
z=arctan2(-P21,P22)
由此可得由電塔的旋轉(zhuǎn)機制的旋轉(zhuǎn)角推導出ArcGIS Runtime旋轉(zhuǎn)機制的旋轉(zhuǎn)角。
通過該公式編寫程序進行成果測試。
通過測試,無論當前是怎樣的姿態(tài),當轉(zhuǎn)動三個旋轉(zhuǎn)軸來改變Rotate_z,Rotate_x,Rotate_y的值時,在ArcGIS Runtime中剛好和塔模型旋轉(zhuǎn)機制中的側身,俯仰和指向相對應,通過這樣的算法,將ArcGIS Runtime的旋轉(zhuǎn)機制轉(zhuǎn)化為了塔模型的旋轉(zhuǎn)機制。這也說明了該公式和方法的正確性。
三維模型姿態(tài)變換是三維模型應用領域的重要基礎技術,隨著三維模型在各行各業(yè)中的廣泛應用,三維模型姿態(tài)變換技術也得到了飛速的發(fā)展[7]。而對于ArcGIS Runtime而言,三維模型姿態(tài)變換也影響用戶的直觀體驗,模型的精準定位定姿態(tài)是三維應用最基本的保證。本文不僅給出了ArcGIS Runtime的旋轉(zhuǎn)機制和不同旋轉(zhuǎn)機制的旋轉(zhuǎn)角轉(zhuǎn)換,更是提供了觀察旋轉(zhuǎn)機制和不同旋轉(zhuǎn)機制的旋轉(zhuǎn)角轉(zhuǎn)換的解算方法,這為更多的三維GIS開發(fā)者提供了支撐。