AR+LBS線下社交遊戲嘗試

無懸發表於2016-10-31

一、簡介

前段時間Pokemon Go的火熱掀起了一股AR風潮,創新小組隨後在這方面進行了一些探索,基於Unity完成了一個簡單的線下社交遊戲Demo,與普通多人遊戲的區別主要在:遊戲地圖是基於真實地圖製作而成,角色的位置和移動也是基於玩家自身的LBS資料。可以看做是抽出Pokemon Go的地圖和角色部分,在上面增加社交遊戲邏輯。

遊戲截圖:(當前玩家位於黃龍時代廣場附近)

lbs

由於時間關係,玩家間的互動做的比較簡單(AR發紅包),下面介紹一下游戲地圖的生成和角色的LBS資訊關聯。

二、地圖

1、地圖切片生成

由於遊戲地圖需要基於真實地圖生成,這裡採用百度地圖SDK截圖的方式,得到小塊小塊的地圖切片,並記錄切片的序號,然後在遊戲中動態載入。

_

地圖切片在二維平面上鄰接排列,所有切片尺寸一致,給各個切片設定二維座標,以左上角為起點(座標為(0,0)),則每個切片所覆蓋的經緯度矩形區域都能通過切片座標、切片尺寸計算而得。

_

如圖是切片生成的過程,包括兩部分:地圖圖層的初始化和各切片生成。地圖圖層的初始化主要是設定地圖的整體區域、圖層的樣式(如道路的顏色、是否顯示建築物等)和地圖縮放等級,由於處於3D遊戲環境,本專案將地圖縮放等級設定為固定值,以減少不必要的繪製。

各切片的生成步驟如下:在索引確定後,根據切片尺寸計算當前切片的矩形區域,然後呼叫百度地圖SDK,渲染出該區域地圖圖片,最後儲存圖片,得到當前切片結果。

2、地圖切片的無縫拼接

如下圖,本專案在遊戲引擎中維護9張相互鄰接的地圖切片,構成切片九宮格,設中心切片的座標為(0,0),則周圍8鄰域內的切片座標分別為(-1,-1)、(0,-1)、(1,-1)、(-1,0)、(1,0)、(-1,1)、(0,1)、(1,1),在遊戲執行過程中,玩家始終保持在中心切片,玩家在當前切片區域內移動時,玩家視野未超出九宮格切片所覆蓋區域,九宮格無需更新;當玩家移動到切片邊緣,進入下一個切片時,則需要更新九宮格:

_

_

上圖示意的是玩家向右方移動,跨越切片時的情形,即玩家從(0,0)切片移動到(1,0)切片,此時(1,0)切片成為中心區域,需要在九宮格右邊新增3個切片,同時去除九宮格左邊的3個切片,新增加的3個切片需要載入對應的地圖圖片,保證地圖的正確性。

因此,當玩家在地圖上移動時,玩家始終處於九宮格的中心區域,玩家周圍始終有足夠的視野區域,當玩家跨越切片邊界時,切片九宮格即時更新,使得玩家感受不到地圖的切換過程,達到無縫漫遊的效果。

三、角色

角色的地理位置、朝向、行走狀態都來自手機的感測器,如GPS、加速度計等。對於角色的地理位置(經緯度座標),需要進行座標轉換,以對應到遊戲引擎中的座標。

如圖,將左上角第一個地圖切片的左上角與Unity中的世界原點對應,即(0,0)對應經緯度(O-lat,O-lng),設Unity中地圖切片的長寬分別為w、h,切片實際覆蓋的經緯度分別為d-lat、d-lng:

_

則若當前玩家的真實地理位置經緯度為(x,y),可得玩家所屬切片索引為:

eq1

玩家在Unity中的座標(忽略z軸)為:

eq2

相應地,也能根據玩家在Unity中的座標,計算出玩家的經緯度。


相關文章