Unity3D離線版數字地球實現

2021-10-11 07:48:45 字數 2861 閱讀 8197

基本流程

瓦片資源包

最近因為某個專案需求,要我們這邊做乙個類似數字地球的東西出來,但是由於某些原因限制了不能連線外部網路,所以要求做乙個本地的離線版數字地球出來。因為一直在用unity3d學做遊戲開發,稍微調研了一下感覺用unity3d也應該能做出來。所以這裡先開乙個坑,寫一下實現這個離線版數字地球的學習過程(順便學習一下gis)的相關知識。

這裡簡單先展示下做出來的離線版數字地球的效果吧(上傳大小限制在5m,看著不是很清晰):

設計思路還是比較清晰的:

但是目前需求是要整乙個離線版的數字地球,所以沒辦法我們只能預先把這些瓦片地圖玩意給先下下來,然後在本地去進行載入了。至於怎麼搞到這些離線的瓦片地圖資源: 全球瓦片數量賊多,一般想要白嫖到這些資源感覺還是有點難度的,也試了一下什麼水經注,globalmap等一些gis軟體,好像不是要收費就是各種限制,軟體入門也有點難搞。所以這裡我又去某寶搜了一下,花了我幾百大洋(心痛!),找了乙個店家買了全球0-9級的瓦片,中國區域0-12級的瓦片資源。

ok,地球模型有了,離線瓦片資源也有了的情況下,我們就可以進行離線版數字地球的開發了。

簡單羅列下目前可能會用到的gis相關公式吧(注意由於使用了unity的mathf函式,這些函式的運算元都是float級別的,所以實際上可能計算出來會有一點點的偏差,如果可以的話最好還是用double的方式實現下這裡的這些函式)。

/// 

/// 根據經緯度計算球面座標

///

/// 經度

/// 緯度

///

private vector3 getsphericalcoordinates

(double longitude,

double latitude)

/// 

/// 根據三維座標計算經緯度

///

/// 目標三維座標

///

private vector2 calculatelontitudeandlatitude

(vector3 pos)

if(pos.y >

0.0f

)float latitudeangle = mathf.

asin

(pos.y / earthradius)

;float latitude = latitudeangle *

180.0f

/ mathf.pi;

float longtitudeangle = mathf.

acos

(pos.z /(-

1.0f

* earthradius * mathf.

cos(latitudeangle)))

;float longtitude = longtitudeangle *

180.0f

/ mathf.pi;

return new vector2

(s * longtitude, q * latitude)

;}

這部分稍微就有那麼一點複雜了,主要是這涉及到一些gis座標投影和瓦片之間的座標轉化與計算公式,具體公式**自國內主要地圖瓦片座標系定義及計算原理 這一篇部落格,這個部落格對gis瓦片這些計算公式寫的十分詳解了,我這裡就用**簡單的實現一下(同理精度float存在一定精度的問題)

/// 

/// 雙曲函式

///

///

private float

sinh

(float x)

/// 

/// 根據經緯度獲取目標瓦片位置

///

/// 經度

/// 緯度

///

private vector2 calculatetileindex

(double longtitude,

double latitude)

/// 

/// 根據瓦片編號獲取經緯度資訊

///

/// 瓦片x編號

/// 瓦片y編號

///

private vector2 calculatelongandla

(int xtile,

int ytile)

/// 

/// 經緯度座標轉畫素座標

///

/// 經度

/// 緯度

/// 畫素座標值

private vector2 longandlatopixel

(float longtitude,

float latitude)

/// 

/// 根據瓦片上某一點的畫素座標得到經緯度座標

///

/// 瓦片x編號

/// 瓦片y編號

/// 目標點x畫素座標

/// 目標點y畫素座標

///

private vector2 pixeltolongandla

(float tilex,

float tiley,

float pixelx,

float pixely)

然後可以簡單以0級瓦片和1級瓦片驗算下效果對不對就行了。

Unity3D開發(九) Unity3d流光效果

遊戲開 壇 hello game 遊戲開發群 201276069 之前曾經注意過material 中紋理的屬性都有 tiling 和offset 但沒有深究過其用途,今天才知道竟然可以利用 offset做uv 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...

解決Unity3D離線HTML檔案開啟緩慢問題

unity3d開發經常需要檢視離線文件,但總是開啟很慢,每個頁面都要等很久才能開啟。實際原因是頁面中訪問了某些被牆了的站點。d program files x86 unity editor data documentation en裡面任意html檔案開啟都會有一句 rel stylesheet t...

Unity3d時鐘指令碼

var tu1 texture2d var time1 float 0 function fixedupdate function ongui function gettime time float string var lasttime string var hour mathf.floortoi...