基于OpenGL的瓦片地圖創(chuàng)建方法及裝置制造方法
【專利摘要】本發(fā)明公開了一種基于OpenGL的瓦片地圖創(chuàng)建方法及裝置,其中,一種基于OpenGL的瓦片地圖創(chuàng)建方法包括:獲取瓦片地圖文件;根據(jù)所述瓦片地圖文件計算各個瓦片的3D模型坐標(biāo);將所述各個瓦片的圖片轉(zhuǎn)化為紋理圖片;計算所述各個瓦片的紋理圖片的坐標(biāo);根據(jù)所述各個瓦片的3D模型坐標(biāo)、紋理圖片以及紋理圖片的坐標(biāo),調(diào)用所述OpenGL的渲染函數(shù)分別對所述各個瓦片進(jìn)行渲染,生成包含所述各個瓦片的瓦片地圖。本發(fā)明提供的技術(shù)方案能夠有效提高瓦片地圖的可移植性。
【專利說明】基于OpenGL的瓦片地圖創(chuàng)建方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及瓦片地圖【技術(shù)領(lǐng)域】,具體涉及一種基于OpenGL的瓦片地圖創(chuàng)建方法
及裝置。
【背景技術(shù)】
[0002]目前,越來越多的地圖服務(wù)用到瓦片地圖技術(shù),例如現(xiàn)在我國實行發(fā)布的天地圖服務(wù)就運用了瓦片地圖技術(shù)。
[0003]瓦片地圖技術(shù)基于瓦片地圖金字塔模型,瓦片地圖金字塔模型是一種多分辨率層次模型,從瓦片金字塔的底層到頂層,分辨率越來越低,但表示的地理范圍不變。瓦片地圖金字塔模型的構(gòu)建原理是:首先確定地圖服務(wù)平臺所要提供的縮放級別的數(shù)量N,把縮放級別最低、地圖比例尺最大的地圖圖片作為金字塔的底層,即第O層,并對其進(jìn)行切片,從地圖圖片的左上角開始,從左至右、從上到下進(jìn)行切割,分割成相同大小(比如256x256像素)的正方形地圖瓦片,形成第O層瓦片矩陣;在第O層地圖圖片的基礎(chǔ)上,按每2x2像素合成為一個像素的方法生成第I層地圖圖片,并對其進(jìn)行切片,分割成與下一層相同大小的正方形地圖瓦片,形成第I層瓦片矩陣;采用同樣的方法生成第2層瓦片矩陣;以此類推,直到第N — I層,構(gòu)成整個瓦片金字塔。
[0004]目前,利用傳統(tǒng)技術(shù)開發(fā)的瓦片地圖的移植性較差,不支持跨平臺運行,比如,例如,一些經(jīng)典的瓦片地圖游戲(例如超級瑪麗、魂斗羅等)只能運行在紅白機上,無法移植到智能設(shè)備(例如手機、平板電腦等)運行。
【發(fā)明內(nèi)容】
[0005]本發(fā)明提供一種基于OpenGL的瓦片地圖創(chuàng)建方法及裝置,用于提高瓦片地圖的可移植性。
[0006]本發(fā)明第一方面提供一種基于OpenGL的瓦片地圖創(chuàng)建方法,包括:
[0007]獲取瓦片地圖文件;
[0008]根據(jù)所述瓦片地圖文件計算各個瓦片的3D模型坐標(biāo);
[0009]將所述各個瓦片的圖片轉(zhuǎn)化為紋理圖片;
[0010]計算所述各個瓦片的紋理圖片的坐標(biāo);
[0011]根據(jù)所述各個瓦片的3D模型坐標(biāo)、紋理圖片以及紋理圖片的坐標(biāo),調(diào)用所述OpenGL的渲染函數(shù)分別對所述各個瓦片進(jìn)行渲染,生成包含所述各個瓦片的瓦片地圖。
[0012]本發(fā)明第二方面提供一種基于OpenGL的瓦片地圖創(chuàng)建裝置,包括:
[0013]獲取單元,用于獲取瓦片地圖文件;
[0014]第一計算單元,用于根據(jù)所述獲取單元獲取的瓦片地圖文件計算各個瓦片的3D模型坐標(biāo);
[0015]轉(zhuǎn)化單元,用于將所述各個瓦片的圖片轉(zhuǎn)化為紋理圖片;
[0016]第二計算單元,用于計算所述各個瓦片的紋理圖片的坐標(biāo);[0017]渲染單元,用于根據(jù)所述第一計算單元計算得到的各個瓦片的3D模型坐標(biāo)、所述轉(zhuǎn)化單元轉(zhuǎn)化得到的各個瓦片的紋理圖片以及所述第二計算單元計算得到的所述各個瓦片的紋理圖片的坐標(biāo),調(diào)用所述OpenGL的渲染函數(shù)分別對所述各個瓦片進(jìn)行渲染,生成包含所述各個瓦片的瓦片地圖。
[0018]由上可見,本發(fā)明通過獲取瓦片地圖文件,根據(jù)瓦片地圖文件生成OpenGL渲染所需要的3D模型坐標(biāo)、紋理圖片和紋理圖片坐標(biāo),最后通過OpenGL渲染接口生成包含各個瓦片的瓦片地圖,由于主流的智能設(shè)備均支持OpenGL,而OpenGL提供了跨編程語言、跨平臺的編程接口,因此,通過本發(fā)明技術(shù)方案生成的瓦片地圖能夠在支持OpenGL的所有智能設(shè)備上運行,極大提高了瓦片地圖的可移植性。
【專利附圖】
【附圖說明】
[0019]為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0020]圖Ι-a為本發(fā)明實施例提供的一種基于OpenGL的瓦片地圖創(chuàng)建方法流程示意圖;
[0021]圖Ι-b為本發(fā)明實施例提供的一種瓦片地圖文件數(shù)據(jù)結(jié)構(gòu)圖;
[0022]圖Ι-c為本發(fā)明實施例提供的一種計算瓦片3D模型坐標(biāo)方案的流程示意圖;
[0023]圖2為本發(fā)明實施例提供的一種基于OpenGL的瓦片地圖創(chuàng)建裝置結(jié)構(gòu)示意圖。
【具體實施方式】
[0024]為使得本發(fā)明的發(fā)明目的、特征、優(yōu)點能夠更加的明顯和易懂,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而非全部實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護(hù)的范圍。
[0025]本發(fā)明實施例提供了一種基于OpenGL的瓦片地圖創(chuàng)建方法,包括:獲取瓦片地圖文件;根據(jù)所述瓦片地圖文件計算各個瓦片的3D模型坐標(biāo);將所述各個瓦片的圖片轉(zhuǎn)化為紋理圖片;計算所述各個瓦片的紋理圖片的坐標(biāo);根據(jù)所述各個瓦片的3D模型坐標(biāo)、紋理圖片以及紋理圖片的坐標(biāo),調(diào)用所述OpenGL的渲染函數(shù)分別對所述各個瓦片進(jìn)行渲染,生成包含所述各個瓦片的瓦片地圖。相應(yīng)的,本發(fā)明實施例還提供了一種基于OpenGL的瓦片地圖創(chuàng)建裝置。以下分別進(jìn)行詳細(xì)說明。
[0026]如圖Ι-a所示,本發(fā)明實施例中的一種基于OpenGL的瓦片地圖創(chuàng)建方法包括:
[0027]步驟101、獲取瓦片地圖文件;
[0028]本發(fā)明實施例中,瓦片地圖文件預(yù)先通過瓦片地圖創(chuàng)建工具(例如TiledMapEdit)創(chuàng)建,具體的,瓦片地圖文件的創(chuàng)建方式可以參照現(xiàn)有的瓦片地圖文件的創(chuàng)建方案實現(xiàn),此處不再贅述。
[0029]通常情況下,瓦片地圖文件為一種針對Unicode的可變寬度字符編碼(例如UTF-8)的明碼文件,瓦片地圖文件的文件后綴為TMX,因此,瓦片地圖文件通常也被稱為TMX文件。具體的,本發(fā)明實施例中的瓦片地圖文件的數(shù)據(jù)結(jié)構(gòu)可以參照圖l_b所示,在圖Ι-b中,“Title”用于描述瓦片地圖文件的基本屬性,包括:orientation(即瓦片的朝向信息)、width(即瓦片地圖的寬度信息,用于表示瓦片地圖在寬度方向上的瓦片個數(shù),即表示瓦片地圖每行存在的瓦片個數(shù))、height (即瓦片地圖的高度信息,用于表示瓦片地圖在高度方向上的瓦片個數(shù),即表示瓦片地圖每列存在的瓦片個數(shù))、tilewidth(即相鄰?fù)咂闹行狞c在寬度方向的間距信息)、tileheight (即相鄰?fù)咂闹行狞c在高度方向的間距信息);[N] tileset用于分別描述N個瓦片集的屬性信息(其中,N大于或等于I),包括:firstgid (即瓦片集中第一個瓦片的全局標(biāo)識量)、name (即瓦片集的名稱)、tiIewidth (即瓦片集中瓦片的寬度信息)、tileheight (即瓦片集中瓦片的高度信息)、margin (即相鄰?fù)咂g的間隔信息)、image (即瓦片集的圖片信息,包括描述圖片路徑的source屬性、描述圖片原始寬度的width屬性、描述圖片原始高度的height屬性);[M] layer用于分別描述M個層的屬性信息(其中,M大于或等于1),包括:name (即層的名稱)、width (即層的寬度信息)、height (即層的高度信息)、data(即層的所有瓦片的數(shù)據(jù)信息,包括enCoding(即編碼方式)compression(即壓縮方式)、數(shù)據(jù)(主要記錄層中所有瓦片依次對應(yīng)的全局標(biāo)識量))。
[0030]下面對瓦片的全局標(biāo)識量進(jìn)行說明,瓦片的全局標(biāo)識量又稱為瓦片的GID,通常,GID的范圍從正整數(shù)I開始,到瓦片地圖中瓦片的總量,舉例說明,假設(shè)如果瓦片地圖有5個不同的瓦片,那么,瓦片O的GID為1,瓦片I的GID為2,瓦片3的GID為3,以此類推,瓦片的GID為O被用來表示此瓦片為空。
[0031]需要說明的是,圖Ι-b所示的瓦片地圖文件的數(shù)據(jù)結(jié)構(gòu)只是一種示例,本發(fā)明實施例中的瓦片地圖文件的數(shù)據(jù)結(jié)構(gòu)不限于圖l-b所示的數(shù)據(jù)結(jié)構(gòu)。
[0032]本發(fā)明實施例中,預(yù)先創(chuàng)建好的瓦片地圖文件可以存儲于服務(wù)器、個人計算機(PC,personal computer)或智能終端(如手機、智能電視、平板電腦)等設(shè)備中,瓦片地圖創(chuàng)建裝置通過有線方式或無線方式從上述設(shè)備中獲取預(yù)先創(chuàng)建好的瓦片地圖文件。
[0033]步驟102、根據(jù)上述瓦片地圖文件計算各個瓦片的3D模型坐標(biāo);
[0034]在獲取瓦片地圖文件后,瓦片地圖創(chuàng)建裝置通過對瓦片地圖文件進(jìn)行解析可以得到瓦片地圖文件的數(shù)據(jù)結(jié)構(gòu)(例如圖ι-b所示的數(shù)據(jù)結(jié)構(gòu)),之后根據(jù)上述瓦片地圖文件計算各個瓦片的3D模型坐標(biāo)(即三維“3DimenSi0nS”模型坐標(biāo))。
[0035]可選的,上述瓦片地圖文件包括如下信息:瓦片的朝向信息(如圖l-b所示的Title — orientation)、瓦片地圖的寬度信息(如圖Ι-b所示的Title — width)、瓦片地圖的高度信息(如圖l-b所示的Title — height)、瓦片地圖包含的所有瓦片集的屬性信息(如圖l-b所示的[N]tileset),瓦片地圖包含的所有層的屬性信息(如圖l_b所示的[M]tileset)。則如圖Ι-c所示,本發(fā)明實施例中根據(jù)上述瓦片地圖文件計算各個瓦片的3D模型坐標(biāo)包括以下步驟:
[0036]步驟Al、根據(jù)上述瓦片的朝向信息,確定本層的第一塊瓦片的左下角頂點坐標(biāo);
[0037]本發(fā)明實施例中,瓦片存在兩種可能朝向,一種是正交布局,一種是45度斜視角布局,結(jié)合圖ι-b所示的數(shù)據(jù)結(jié)構(gòu),上述根據(jù)上述瓦片的朝向信息,確定本層的第一塊瓦片的左上角頂點坐標(biāo)的方式如下:[0038]1、若Title — orientation為“orthogonal”,則表示瓦片的朝向為正交布局,此時將第一塊瓦片的左上角頂點坐標(biāo)設(shè)置為屏幕左上角的坐標(biāo),即(0,O),左下角頂點坐標(biāo)為(O, tileset — tileheight)。
[0039]2、若Title — orientation為“ isometric”,則表示瓦片的朝向為45度斜視角布局,此時將第一塊瓦片左上角頂點坐標(biāo)設(shè)置到屏幕頂端的中間位置,即(w/2,0),w為顯示區(qū)域的寬,左下角頂點坐標(biāo)為(w/2, tileset — tileheight)。
[0040]步驟A2、根據(jù)上述瓦片的朝向信息、上述瓦片地圖的寬度信息、上述瓦片地圖的高度信息,以及上述第一塊瓦片的左下角頂點坐標(biāo),計算本層中其它瓦片的左下角頂點坐標(biāo);
[0041]本發(fā)明實施例中,瓦片存在兩種可能朝向,一種是正交布局,一種是45度斜視角布局,結(jié)合圖ι-b所示的數(shù)據(jù)結(jié)構(gòu),上述根據(jù)上述瓦片的朝向信息、上述瓦片地圖的寬度信息、上述瓦片地圖的高度信息,以及上述第一塊瓦片的左下角頂點坐標(biāo),計算本層中其它瓦片的左下角頂點坐標(biāo)的方式如下:
[0042]1、若Title — orientation為“orthogonal”,則表示瓦片的朝向為正交布局,此時第m塊瓦片的左下角頂點坐標(biāo)為:
[0043](X1,0+ (m% TLff) *TTff, y1;0+ (m/TLff) *TTH)。
[0044]2、若Title — orientation為“ isometric”,則表示瓦片的朝向為45度斜視角布局,此時第m塊瓦片的左下角頂點坐標(biāo)為:
[0045](X1,?+ ((m% TLH ) -m/TLff) *TTW/2, y1;0+ (m% TLH) +m/TLff) *TTH/2)
[0046]其中,Xy和分別表示上述第一塊瓦片的左下角頂點橫坐標(biāo)和左下角頂點縱坐標(biāo),TLW表示上述瓦片地圖在寬度方向上的瓦片個數(shù)(即Title — width),TLH表示上述瓦片地圖在高度方向上的瓦片個數(shù)(即Title — height),TTW表示相鄰?fù)咂闹行狞c在寬度方向的間距(即Title — tilewidth),TTH表示相鄰?fù)咂闹行狞c在高度方向的間距(即Title — tileheight)。
[0047]對本層中的每塊瓦片執(zhí)行步驟A3、A4和A5,得到本層中的每塊瓦片的3D模型坐標(biāo):
[0048]步驟A3、根據(jù)確定的瓦片i的左下角頂點坐標(biāo)、上述瓦片地圖的寬度信息以及瓦片地圖的高度信息,確定上述瓦片i的左上角頂點坐標(biāo)、右上角頂點坐標(biāo)和右下角頂點坐標(biāo);
[0049]本發(fā)明實施例中,當(dāng)確定瓦片i的左下角頂點坐標(biāo),根據(jù)上述瓦片地圖的寬度信息以及瓦片地圖的高度信息,即可確定上述瓦片i的左上角頂點坐標(biāo)、右上角頂點坐標(biāo)和右下角頂點坐標(biāo)。
[0050]步驟A4、根據(jù)2D轉(zhuǎn)3D公式,計算瓦片i的4個頂點在3D環(huán)境中的絕對位置;
[0051]可選的,瓦片地圖創(chuàng)建裝置根據(jù)第一公式和第二公式,分別計算瓦片i的4個頂點在3D環(huán)境中的絕對位置;
[0052]其中,上述第一公式為:pos= ((2*Xi;a- (vx+vw))/vw, (vy+vh-2*Yi;a) /vh, Z, I);
[0053]上述第二公式為:P3(U,a= (V_1*P_1*pos).getPosition ();
[0054]式中P3d i a表示瓦片i的頂點a在3D環(huán)境中的絕對位置,vx、vy、Vw和Vh分別為視窗中瓦片地圖可繪區(qū)域的左上角頂點坐標(biāo)、寬度和高度,和\a分別為瓦片i的頂點a的橫坐標(biāo)和縱坐標(biāo),Z為預(yù)設(shè)值,P表示投影矩陣,V表示view矩陣,其中,P和V在上述OpenGL初始化時設(shè)定。
[0055]可選的,上述Z取0,當(dāng)然,上述Z也可以取其它值。需要說明的是,在計算不同瓦片的4個頂點在3D環(huán)境中的絕對位置,使用同一個Z值。
[0056]步驟A5、將瓦片i的4個頂點在3D環(huán)境中的絕對位置減去瓦片i的模型位置,得到瓦片i的3D模型坐標(biāo),其中,上述瓦片i的模型位置等于上述瓦片i的4個頂點的平均坐標(biāo),即上述瓦片i的模型位置等于上述瓦片i的4個頂點的位置之后除以4。
[0057]本發(fā)明實施例中,瓦片地圖創(chuàng)建裝置針對瓦片地圖的每層,執(zhí)行步驟Al至A5,SP可得到每層中的各個瓦片的3D模型坐標(biāo)。
[0058]步驟103、將上述各個瓦片的圖片轉(zhuǎn)化為紋理圖片;
[0059]本發(fā)明實施例中,瓦片地圖創(chuàng)建裝置根據(jù)瓦片地圖文件中獲取到圖片路徑(例如,根據(jù)圖l-b所示的[N] tileset — image — source),根據(jù)圖片路徑獲取各個瓦片的圖片后利用OpenGL接口生成與圖片對應(yīng)的紋理圖片。
[0060]步驟104、計算上述各個瓦片的紋理圖片的坐標(biāo);
[0061]可選地,瓦片地圖創(chuàng)建裝置根據(jù)上述瓦片地圖包含的所有瓦片集的屬性信息、第三公式、第四公式、第五公式和第六公式計算上述各個瓦片的紋理圖片的坐標(biāo);
[0062]其中,上述第三公式為土」,。=((n/C*Tff)/Iff, (n% C*TH)/IH);
[0063]上述第四公式為AsJ1 = ((n/C*Tff)/Iff, (n% C*TH+TH)/IH);
[0064]上述第五公式為:ts,」,2= ((n/C*Tff+Tff)/Iff, (n% C*TH)/IH);
[0065]上述第六公式為:ts,」,3= ((n/C*Tff+Tff)/Iff, (n% C*TH+TH)/IH);
[0066]其中,tyj表示s層中瓦片j的紋理圖片的左上角頂點坐標(biāo),ts,u表示s層中瓦片j的紋理圖片的左下角頂點坐標(biāo),tSj2表示s層中瓦片j的紋理圖片的右上角頂點坐標(biāo),ts,j,3表示s層中瓦片j的紋理圖片的右下角頂點坐標(biāo),TW為s層中瓦片j對應(yīng)的瓦片集的瓦片寬度,TH為s層中瓦片j對應(yīng)的瓦片集的瓦片高度,IW為s層中瓦片j對應(yīng)的瓦片集的圖片寬度,IH為s層中瓦片j對應(yīng)的瓦片集的圖片高度,η為s層中瓦片j的全局標(biāo)識量(即瓦片j的GID)減去s層中瓦片j對應(yīng)的瓦片集中第一個瓦片的全局標(biāo)識量。其中,C = IW/TW,R = IH/TH。假設(shè)s層中瓦片j對應(yīng)的瓦片集為第2個瓦片集,則參照圖l_b,s層中瓦片j對應(yīng)的瓦片集中第一個瓦片的全局標(biāo)識量可以從[2]tileset — firstgid中獲得。
[0067]步驟105、根據(jù)上述各個瓦片的3D模型坐標(biāo)、紋理圖片以及紋理圖片的坐標(biāo),調(diào)用上述OpenGL的渲染函數(shù)分別對上述各個瓦片進(jìn)行渲染,生成包含上述各個瓦片的瓦片地圖;
[0068]本發(fā)明實施例中,在通過步驟102?104得到瓦片地圖各層中各個瓦片的3D模型坐標(biāo)、紋理圖片以及紋理圖片的坐標(biāo)之后,調(diào)用上述OpenGL的渲染函數(shù)分別對上述各個瓦片進(jìn)行渲染,生成包含上述各個瓦片的瓦片地圖。
[0069]可選的,在調(diào)用上述OpenGL的渲染函數(shù)分別對上述各個瓦片進(jìn)行渲染時,將投影設(shè)置為正交投影,將混合方式設(shè)置為glBlendFunc,根據(jù)瓦片地圖各層中各個瓦片的3D模型坐標(biāo)、紋理圖片以及紋理圖片的坐標(biāo),按照層從小到大、瓦片從小到大的順序逐一進(jìn)行渲染,最終便可得到一張包含上述各個瓦片的完整的瓦片地圖。[0070]需要說明的是,在本發(fā)明實施例中,“一”用于表示子參數(shù),例如“Title — orientation”表不的是 Title 下的 orientation 參數(shù),“Title — tilewidth”表示的是Title下的tilewidth參數(shù),以此類推。
[0071]需要說明的是,本發(fā)明實施例中的“瓦片”為瓦片地圖中的最小可視單元,瓦片地圖由多個瓦片構(gòu)成。
[0072]需要說明的是,本發(fā)明實施例中的OpenGL為專業(yè)的圖形程序接口,目前,OpenGL存在多個版本,例如:0penGL3.0、0penGL3.1和OpenGL-es等,本發(fā)明實施例的技術(shù)方案適用于OpenGL的多個版本。
[0073]需要說明的是,本發(fā)明實施例通過瓦片地圖創(chuàng)建裝置執(zhí)行本發(fā)明實施例中的瓦片地圖創(chuàng)建方法,瓦片地圖創(chuàng)建裝置可以是獨立裝置,也可以集成在PC、智能設(shè)備(例如手機、智能電視、平板電腦等)中。
[0074]由上可見,本發(fā)明通過獲取瓦片地圖文件,根據(jù)瓦片地圖文件生成OpenGL渲染所需要的3D模型坐標(biāo)、紋理圖片和紋理圖片坐標(biāo),最后通過OpenGL渲染接口生成包含各個瓦片的瓦片地圖,由于主流的智能設(shè)備均支持OpenGL,而OpenGL提供了跨編程語言、跨平臺的編程接口,因此,通過本發(fā)明技術(shù)方案生成的瓦片地圖能夠在支持OpenGL的所有智能設(shè)備上運行,極大提高了瓦片地圖的可移植性。
[0075]本發(fā)明實施例還提供一種基于OpenGL的瓦片地圖創(chuàng)建裝置,如圖2所示,本發(fā)明實施例中的瓦片地圖創(chuàng)建裝置200,包括:
[0076]獲取單元201,用于獲取瓦片地圖文件;
[0077]第一計算單元202,用于根據(jù)獲取單元201獲取的瓦片地圖文件計算各個瓦片的3D模型坐標(biāo);
[0078]轉(zhuǎn)化單元203,用于將上述各個瓦片的圖片轉(zhuǎn)化為紋理圖片;
[0079]第二計算單元204,用于計算上述各個瓦片的紋理圖片的坐標(biāo);
[0080]渲染單元205,用于根據(jù)第一計算單元201計算得到的各個瓦片的3D模型坐標(biāo)、轉(zhuǎn)化單元轉(zhuǎn)化得到的各個瓦片的紋理圖片以及第二計算單元204計算得到的上述各個瓦片的紋理圖片的坐標(biāo),調(diào)用上述OpenGL的渲染函數(shù)分別對上述各個瓦片進(jìn)行渲染,生成包含上述各個瓦片的瓦片地圖。
[0081]可選的,上述瓦片地圖文件包括如下信息:瓦片的朝向信息(如圖l-b所示的Title — orientation)、瓦片地圖的寬度信息(如圖Ι-b所示的Title — width)、瓦片地圖的高度信息(如圖l-b所示的Title — height)、瓦片地圖包含的所有瓦片集的屬性信息(如圖l-b所示的[N]tileset),瓦片地圖包含的所有層的屬性信息(如圖l_b所示的[M]tileset)。
[0082]其中,第一計算單202元包括:確定單元、第一子計算單元和第二子計算單元,上述第一計算單元分別針對瓦片地圖的每層,調(diào)用上述確定單元、上述第一子計算單元和上述第二子計算單元進(jìn)行計算;上述確定單元用于:根據(jù)上述瓦片的朝向信息,確定本層的第一塊瓦片的左下角頂點坐標(biāo);上述第一子計算單元用于根據(jù)上述瓦片的朝向信息、上述瓦片地圖的寬度信息、上述瓦片地圖的高度信息,以及上述第一塊瓦片的左下角頂點坐標(biāo),計算本層中其它瓦片的左下角頂點坐標(biāo);上述第二子計算單元用于對本層中的每塊瓦片進(jìn)行如下計算,得到本層中的每塊瓦片的3D模型坐標(biāo):根據(jù)確定的瓦片i的左下角頂點坐標(biāo)、上述瓦片地圖的寬度信息以及瓦片地圖的高度信息,確定瓦片i的左上角頂點坐標(biāo)、右上角頂點坐標(biāo)和右下角頂點坐標(biāo);根據(jù)2D轉(zhuǎn)3D公式,計算上述瓦片i的4個頂點在3D環(huán)境中的絕對位置;將瓦片i的4個頂點在3D環(huán)境中的絕對位置減去瓦片i的模型位置,得到瓦片i的3D模型坐標(biāo),其中,瓦片i的模型位置等于瓦片i的4個頂點的平均坐標(biāo)。
[0083]可選的,上述第一子計算單元具體用于:
[0084]若本層中瓦片的朝向為正交布局,則通過公式(Xw+Oii^ TLW)*TTW, yw+Oii/TLW)*TTH)計算第m塊瓦片的左下角頂點坐標(biāo);
[0085]若本層中瓦片的朝向為45度斜視角布局,貝U,通過公式(X1, ο+ ((m % TLH) -m/TLff) *TTff/2,y1;0+(m% TLH) +m/TLff) *TTH/2)計算第m塊瓦片的左下角頂點坐標(biāo);
[0086]其中,Xy和分別表示上述第一塊瓦片的左下角頂點橫坐標(biāo)和左下角頂點縱坐標(biāo),TLW表示上述瓦片地圖在寬度方向上的瓦片個數(shù),TLH表示上述瓦片地圖在高度方向上的瓦片個數(shù),TTW表示相鄰?fù)咂闹行狞c在寬度方向的間距,TTH表示相鄰?fù)咂闹行狞c在高度方向的間距。
[0087]可選地,上述第二子計算單元具體用于:根據(jù)第一公式和第二公式,分別計算瓦片i的4個頂點在3D環(huán)境中的絕對位置;
[0088]其中,上述第一公式為:pos= ((2*Xi;a- (vx+vw))/vw, (vy+vh-2*Yi;a) /vh, Z, I); [0089]上述第二公式為:P3(U,a= (V_1*P_1*pos).getPosition ();
[0090]式中P3d i a表示瓦片i的頂點a在3D環(huán)境中的絕對位置,vx、vy、Vw和Vh分別為視窗中瓦片地圖可繪區(qū)域的左上角頂點坐標(biāo)、寬度和高度,和\a分別為瓦片i的頂點a的橫坐標(biāo)和縱坐標(biāo),Z為預(yù)設(shè)值,P表示投影矩陣,V表示view矩陣,其中,P和V在上述OpenGL初始化時設(shè)定。
[0091]可選的,上述Z取0,當(dāng)然,上述Z也可以取其它值。需要說明的是,在計算不同瓦片的4個頂點在3D環(huán)境中的絕對位置,使用同一個Z值。
[0092]可選的,第二計算單元204具體用于:根據(jù)上述瓦片地圖包含的所有瓦片集的屬性信息、第三公式、第四公式、第五公式和第六公式計算上述各個瓦片的紋理圖片的坐標(biāo);
[0093]其中,上述第三公式為土」,。=((n/C*Tff)/Iff, (n% C*TH)/IH);
[0094]上述第四公式為AsJ1 = ((n/C*Tff)/Iff, (n% C*TH+TH)/IH);
[0095]上述第五公式為:ts,」,2= ((n/C*Tff+Tff)/Iff, (n% C*TH)/IH);
[0096]上述第六公式為:ts』3= ((n/C*Tff+Tff)/Iff, (n% C*TH+TH)/IH);
[0097]其中,表示s層中瓦片j的紋理圖片的左上角頂點坐標(biāo),^jjl表示s層中瓦片j的紋理圖片的左下角頂點坐標(biāo),tSj2表示s層中瓦片j的紋理圖片的右上角頂點坐標(biāo),ts,j,3表示s層中瓦片j的紋理圖片的右下角頂點坐標(biāo),TW為s層中瓦片j對應(yīng)的瓦片集的瓦片寬度,TH為s層中瓦片j對應(yīng)的瓦片集的瓦片高度,IW為s層中瓦片j對應(yīng)的瓦片集的圖片寬度,IH為s層中瓦片j對應(yīng)的瓦片集的圖片高度,η為s層中瓦片j的全局標(biāo)識量減去s層中瓦片j對應(yīng)的瓦片集中第一個瓦片的全局標(biāo)識量;其中,C = IW/TW,R = IH/TH。
[0098]可選的,渲染單元205在調(diào)用上述OpenGL的渲染函數(shù)分別對上述各個瓦片進(jìn)行渲染時,將投影設(shè)置為正交投影,將混合方式設(shè)置為glBlendFunc,渲染單元205根據(jù)瓦片地圖各層中各個瓦片的3D模型坐標(biāo)、紋理圖片以及紋理圖片的坐標(biāo),按照層從小到大、瓦片從小到大的順序逐一進(jìn)行渲染,最終便可得到一張包含上述各個瓦片的完整的瓦片地圖。
[0099]需要說明的是,在本發(fā)明實施例中,“一”用于表示子參數(shù),例如“Title — orientation”表不的是 Title 下的 orientation 參數(shù),“Title — tilewidth”表示的是Title下的tilewidth參數(shù),以此類推。
[0100]需要說明的是,本發(fā)明實施例中的“瓦片”為瓦片地圖中的最小可視單元,瓦片地圖由多個瓦片構(gòu)成。
[0101]需要說明的是,本發(fā)明實施例中的OpenGL為專業(yè)的圖形程序接口,目前,OpenGL存在多個版本,例如:0penGL3.0、0penGL3.1和OpenGL-es等,本發(fā)明實施例的技術(shù)方案適用于OpenGL的多個版本。
[0102]需要說明的是,本發(fā)明實施例中的瓦片地圖創(chuàng)建裝置可以是獨立裝置,也可以集成在PC、智能設(shè)備(例如手機、智能電視、平板電腦等)中,此處不作限定。本發(fā)明實施例中的瓦片地圖創(chuàng)建裝置可以如上述方法實施例中的瓦片地圖創(chuàng)建裝置,可以用于實現(xiàn)上述方法實施例中的全部技術(shù)方案,其具體實現(xiàn)過程可參照上述方法實施例中的相關(guān)描述,此處不再贅述。
[0103]由上可見,本發(fā)明瓦片地圖創(chuàng)建裝置通過獲取瓦片地圖文件,根據(jù)瓦片地圖文件生成OpenGL渲染所需要的3D模型坐標(biāo)、紋理圖片和紋理圖片坐標(biāo),最后通過OpenGL渲染接口生成包含各個瓦片的瓦片地圖,由于主流的智能設(shè)備均支持OpenGL,而OpenGL提供了跨編程語言、跨平臺的編程接口,因此,通過本發(fā)明技術(shù)方案生成的瓦片地圖能夠在支持OpenGL的所有智能設(shè)備上運行,極大提高了瓦片地圖的可移植性。
[0104]在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的裝置和方法,可以通過其它的方式實現(xiàn)。例如,以上所描述的裝置實施例僅僅是示意性的,例如,上述單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
[0105]需要說明的是,對于前述的各方法實施例,為了簡便描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據(jù)本發(fā)明,某些步驟可以采用其它順序或者同時進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作和模塊并不一定都是本發(fā)明所必須的。
[0106]在上述實施例中,對各個實施例的描述都各有側(cè)重,某個實施例中沒有詳述的部分,可以參見其它實施例的相關(guān)描述。
[0107]以上為對本發(fā)明所提供的一種基于OpenGL的瓦片地圖創(chuàng)建方法及裝置的描述,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明實施例的思想,在【具體實施方式】及應(yīng)用范圍上均會有改變之處,綜上,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。
【權(quán)利要求】
1.一種基于OpenGL的瓦片地圖創(chuàng)建方法,其特征在于,包括: 獲取瓦片地圖文件; 根據(jù)所述瓦片地圖文件計算各個瓦片的3D模型坐標(biāo); 將所述各個瓦片的圖片轉(zhuǎn)化為紋理圖片; 計算所述各個瓦片的紋理圖片的坐標(biāo); 根據(jù)所述各個瓦片的3D模型坐標(biāo)、紋理圖片以及紋理圖片的坐標(biāo),調(diào)用所述OpenGL的渲染函數(shù)分別對所述各個瓦片進(jìn)行渲染,生成包含所述各個瓦片的瓦片地圖。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于, 所述瓦片地圖文件包括如下信息:瓦片的朝向信息、瓦片地圖的寬度信息、瓦片地圖的高度信息、瓦片地圖包含的所有瓦片集的屬性信息,瓦片地圖包含的所有層的屬性信息; 所述根據(jù)所述瓦片地圖文件計算各個瓦片的3D模型坐標(biāo)包括: 針對瓦片地圖的每層,進(jìn)行如下計算: 根據(jù)所述瓦片的 朝向信息,確定本層的第一塊瓦片的左下角頂點坐標(biāo); 根據(jù)所述瓦片的朝向 信息、所述瓦片地圖的寬度信息、所述瓦片地圖的高度信息,以及所述第一塊瓦片的左下角頂點坐標(biāo),計算本層中其它瓦片的左下角頂點坐標(biāo); 對本層中的每塊瓦片進(jìn)行如下計算,得到本層中的每塊瓦片的3D模型坐標(biāo):根據(jù)確定的瓦片i的左下角頂點坐標(biāo)、所述瓦片地圖的寬度信息以及瓦片地圖的高度信息,確定所述瓦片i的左上角頂點坐標(biāo)、右上角頂點坐標(biāo)和右下角頂點坐標(biāo);根據(jù)2D轉(zhuǎn)3D公式,計算所述瓦片i的4個頂點在3D環(huán)境中的絕對位置;將所述瓦片i的4個頂點在3D環(huán)境中的絕對位置減去所述瓦片i的模型位置,得到所述瓦片i的3D模型坐標(biāo),其中,所述瓦片i的模型位置等于所述瓦片i的4個頂點的平均坐標(biāo)。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述根據(jù)所述瓦片的朝向信息、所述瓦片地圖的寬度信息、所述瓦片地圖的高度信息,以及所述第一塊瓦片的左下角頂點坐標(biāo),計算本層中其它瓦片的左上角頂點坐標(biāo),包括: 若本層中瓦片的朝向為正交布局,則第m塊瓦片的左下角頂點坐標(biāo)為TLff) *TTff, y1; o+ (m/TLff) *TTH); 若本層中瓦片的朝向為45度斜視角布局,則第m塊瓦片的左下角頂點坐標(biāo)為(x1;0+((m% TLH) -m/TLff) *TTff/2, y1;0+ (m% TLH) +m/TLff) *TTH/2); 其中,和y1;。分別表示所述第一塊瓦片的左下角頂點橫坐標(biāo)和左下角頂點縱坐標(biāo),TLW表示所述瓦片地圖在寬度方向上的瓦片個數(shù),TLH表示所述瓦片地圖在高度方向上的瓦片個數(shù),TTW表示相鄰?fù)咂闹行狞c在寬度方向的間距,TTH表示相鄰?fù)咂闹行狞c在高度方向的間距。
4.根據(jù)權(quán)利要求2或3所述的方法,其特征在于,所述根據(jù)2D轉(zhuǎn)3D公式,計算所述瓦片i的4個頂點在3D環(huán)境中的絕對位置包括: 根據(jù)第一公式和第二公式,分別計算所述瓦片i的4個頂點在3D環(huán)境中的絕對位置; 其中,所述第一公式為:pos = ((2*Xi;a- (vx+vw)) /vw, (vy+vh-2*Yi;a) /vh, Z, I);
所述第二公式為:P3d,i,a= (V_1*P_1*pos).getPosition (); 式中P3(U,a表示瓦片i的頂點a在3D環(huán)境中的絕對位置,vx, vy, Vw和Vh分別為視窗中瓦片地圖可繪區(qū)域的左上角頂點坐標(biāo)、寬度和高度,和\a分別為所述瓦片i的頂點a的橫坐標(biāo)和縱坐標(biāo),Z為預(yù)設(shè)值,P表示投影矩陣,V表示view矩陣,其中,P和V在所述OpenGL初始化時設(shè)定。
5.根據(jù)權(quán)利要求2或3所述的方法,其特征在于,所述計算所述各個瓦片的紋理圖片的坐標(biāo)包括: 根據(jù)所述瓦片地圖包含的所有瓦片集的屬性信息、第三公式、第四公式、第五公式和第六公式計算所述各個瓦片的紋理圖片的坐標(biāo); 其中,所述第三公式為:ts,j,Q = ((n/C*Tff)/Iff, (n% C*TH)/IH); 所述第四公式為=((n/C*Tff)/Iff, (n% C*TH+TH)/IH);
所述第五公式為:ts,」,2 = ((n/C*Tff+Tff)/Iff, (n% C*TH)/IH);
所述第六公式為:ts,」,3 = ((n/C*Tff+Tff)/Iff, (n% C*TH+TH)/IH); 其中,表示s層中瓦片j的紋理圖片的左上角頂點坐標(biāo),tyy表示s層中瓦片j的紋理圖片的左下角頂點坐標(biāo),t“2表示s層中瓦片j的紋理圖片的右上角頂點坐標(biāo),表示s層中瓦片j的紋理圖片的右下角頂點坐標(biāo),TW為s層中瓦片j對應(yīng)的瓦片集的瓦片寬度,TH為s層中瓦片j對應(yīng)的瓦片集的瓦片高度,IW為s層中瓦片j對應(yīng)的瓦片集的圖片寬度,IH為s層中瓦片j對應(yīng)的瓦片集的圖片高度,η為s層中瓦片j的全局標(biāo)識量減去s層中瓦片j對應(yīng)的瓦片集中第一個瓦片的全局標(biāo)識量;
其中,C = Iff/TW, R = IH/TH。
6.一種基于OpenGL的瓦片地圖創(chuàng)建裝置,其特征在于,包括: 獲取單元,用于獲取瓦片地圖文件; 第一計算單元,用于根據(jù)所述獲取單元獲取的瓦片地圖文件計算各個瓦片的3D模型坐標(biāo); 轉(zhuǎn)化單元,用于將所述各個瓦片的圖片轉(zhuǎn)化為紋理圖片; 第二計算單元,用于計算所述各個瓦片的紋理圖片的坐標(biāo); 渲染單元,用于根據(jù)所述第一計算單元計算得到的各個瓦片的3D模型坐標(biāo)、所述轉(zhuǎn)化單元轉(zhuǎn)化得到的各個瓦片的紋理圖片以及所述第二計算單元計算得到的所述各個瓦片的紋理圖片的坐標(biāo),調(diào)用所述OpenGL的渲染函數(shù)分別對所述各個瓦片進(jìn)行渲染,生成包含所述各個瓦片的瓦片地圖。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于, 所述瓦片地圖文件包括如下信息:瓦片的朝向信息、瓦片地圖的寬度信息、瓦片地圖的高度信息、瓦片地圖包含的所有瓦片集的屬性信息,瓦片地圖包含的所有層的屬性信息;所述第一計算單元包括:確定單元、第一子計算單元和第二子計算單元,所述第一計算單元分別針對瓦片地圖的每層,調(diào)用所述確定單元、所述第一子計算單元和所述第二子計算單元進(jìn)行計算; 其中,所述確定單元用于:根據(jù)所述瓦片的朝向信息,確定本層的第一塊瓦片的左下角頂點坐標(biāo); 所述第一子計算單元用于根據(jù)所述瓦片的朝向信息、所述瓦片地圖的寬度信息、所述瓦片地圖的高度信息,以及所述第一塊瓦片的左下角頂點坐標(biāo),計算本層中其它瓦片的左下角頂點坐標(biāo); 所述第二子計算單元用于對本層中的每塊瓦片進(jìn)行如下計算,得到本層中的每塊瓦片的3D模型坐標(biāo):根據(jù)確定的瓦片i的左下角頂點坐標(biāo)、所述瓦片地圖的寬度信息以及瓦片地圖的高度信息,確定所述瓦片i的左上角頂點坐標(biāo)、右上角頂點坐標(biāo)和右下角頂點坐標(biāo);根據(jù)2D轉(zhuǎn)3D公式,計算所述瓦片i的4個頂點在3D環(huán)境中的絕對位置;將所述瓦片i的4個頂點在3D環(huán)境中的絕對位置減去所述瓦片i的模型位置,得到所述瓦片i的3D模型坐標(biāo),其中,所述瓦片i的模型位置等于所述瓦片i的4個頂點的平均坐標(biāo)。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于, 所述第一子計算單元具體用于: 若本層中瓦片的朝向為正交布局,則通過公式(X1,0+011% TLff)*TTff, y1;0+(m/TLff)*TTH)計算第m塊瓦片的左下角頂點坐標(biāo); 若本層中瓦片的朝向為45度斜視角布局,則,通過公式(Xw+Um % TLH) -m/TLff) *TTff/2,y1;0+(m% TLH) +m/TLff) *TTH/2)計算第m塊瓦片的左下角頂點坐標(biāo); 其中,和y1;。分別表示所述第一塊瓦片的左下角頂點橫坐標(biāo)和左下角頂點縱坐標(biāo),TLW表示所述瓦片地圖在寬度方向上的瓦片個數(shù),TLH表示所述瓦片地圖在高度方向上的瓦片個數(shù),TTW表示相鄰?fù)咂闹行狞c在寬度方向的間距,TTH表示相鄰?fù)咂闹行狞c在高度方向的間距。
9.根據(jù)權(quán)利要求7或8所述的裝置,其特征在于,所述第二子計算單元具體用于:根據(jù)第一公式和第二公式,分別計算所述瓦片i的4個頂點在3D環(huán)境中的絕對位置;
其中,所述第一公式為:pos = ((2*Xi;a-(vx+vw)) /vw, (vy+vh-2*Yi;a) /vh, Z, I);
所述第二公式為:P3d,i,a= (V_1*P_1*pos).getPosition (); 式中P3(U,a表示瓦片i的頂點a在3D環(huán)境中的絕對位置,vx, vy, Vw和Vh分別為視窗中瓦片地圖可繪區(qū)域的左上角頂點坐標(biāo)、寬度和高度,和\a分別為所述瓦片i的頂點a的橫坐標(biāo)和縱坐標(biāo),Z為預(yù)設(shè)值,P表示投影矩陣,V表示view矩陣,其中,P和V在所述OpenGL初始化時設(shè)定。
10.根據(jù)權(quán)利要求7或8所述的裝置,其特征在于,所述第二計算單元具體用于:根據(jù)所述瓦片地圖包含的所有瓦片集的屬性信息、第三公式、第四公式、第五公式和第六公式計算所述各個瓦片的紋理圖片的坐標(biāo); 其中,所述第三公式為:ts,j,Q = ((n/C*Tff)/Iff, (n% C*TH)/IH); 所述第四公式為=((n/C*Tff)/Iff, (n% C*TH+TH)/IH);
所述第五公式為:ts,」,2 = ((n/C*Tff+Tff)/Iff, (n% C*TH)/IH);
所述第六公式為:ts,」,3 = ((n/C*Tff+Tff)/Iff, (n% C*TH+TH)/IH); 其中,表示s層中瓦片j的紋理圖片的左上角頂點坐標(biāo),tyy表示s層中瓦片j的紋理圖片的左下角頂點坐標(biāo),t“2表示s層中瓦片j的紋理圖片的右上角頂點坐標(biāo),表示s層中瓦片j的紋理圖片的右下角頂點坐標(biāo),TW為s層中瓦片j對應(yīng)的瓦片集的瓦片寬度,TH為s層中瓦片j對應(yīng)的瓦片集的瓦片高度,IW為s層中瓦片j對應(yīng)的瓦片集的圖片寬度,IH為s層中瓦片j對應(yīng)的瓦片集的圖片高度,η為s層中瓦片j的全局標(biāo)識量減去s層中瓦片j對應(yīng)的瓦片集中第一個瓦片的全局標(biāo)識量;
其中,C = Iff/TW, R = IH/TH。
【文檔編號】G06T15/04GK103984720SQ201410201164
【公開日】2014年8月13日 申請日期:2014年5月13日 優(yōu)先權(quán)日:2014年5月13日
【發(fā)明者】秦龍龍, 盧偉超 申請人:Tcl集團(tuán)股份有限公司