使用Mapbox和Unity3d的地图上的3D路径

简介

这是关于为健身活动(如跑步,步行,慢跑或徒步旅行)采取的路线的3D视图。 我们正在使用Unity Mapbox SDK来生成由Mapbox提供的3d地图。 为了使它更加用户友好和现实的交互,我们使用了iOS ARKit,该工具可用于将地图区域放置在平面上并使轨迹更清晰。

Mapbox:

Mapbox是允许用户根据业务需求自定义地图的第三方。 它还提供了3d地图和其他各种功能,可用于iOS,Android,Unity3d和许多其他平台。

Unity3d:

众所周知,unity3d是由Unity Technologies开发的跨平台游戏引擎,主要用于开发3d和2d视频游戏以及用于计算机,控制台和移动设备的模拟。

ARKit:

在iOS 11中引入ARKit之后,已经实现了许多具有各种用例的应用程序,以使应用程序更加逼真。 在本文中,我们使用Unity ARKit sdk和Mapbox来检测平面,在该平面上可以为选定区域放置3d地图。 用户可以与放置在诸如桌子/地板等房间的检测到的平面上的3d地图进行交互。

初始设置以将Unity与Mapbox和ARKit集成

  1. 创建一个新的统一项目
  2. 保存场景Cmd + S以具有默认场景。

转到https://www.mapbox.com/install/unity/并下载Unity3d的Mapbox程序包

将包导入到创建的新unity项目中。

使用Mapbox网站上的Mapbox api密钥配置Unity3d。

完成项目设置后,Mapbox sdk将提供默认示例。 我们使用了具有2d地图以及要绘制导航方向的Drive Scene。

基本功能:

  1. 平面检测 :此功能用于在实时环境中检测水平面。 我们使用Apple提供的ARKit进行飞机检测。 转到Unity3d IDE中的资产商店并搜索Unity ARKit插件并安装软件包

2. 从MapBox生成3d地图: Mapbox为Unity3d提供sdk,用于自定义地图以及渲染3d地图和路线。 我们使用mapbox-unity-sdk_v1.4.2.unitypackage渲染3D地图

3. 在地图上绘制路线:我们正在通过本机iOS代码在用户活动(如跑步,步行或徒步旅行)期间跟踪和保存坐标,然后将用于特定活动的那些坐标集传递给unity3d以在3d地图上进行绘制。 从坐标中可以获得纬度和对数数据,但是对于海拔高度,我们使用地图框提供的实用程序使用地图缩放级别和其他属性将坐标转换为现实世界的位置数据,然后获取海拔高度以在地图上绘制路径。

用作构建块的组件:

UnityTile :这是C#类,它是地图的基本构建块。 整个地图分为UnityTile块。 每个UnityTile都包含组成该UnityTile的地图数据的详细信息。 UnityTile具有tileId,它充当获取任何感兴趣的图块的主键。

RangeTileProvider:这是c#类,我们可以在其中设置要在地图中心坐标周围加载的图块数量。 它采用东,西,北和南四个值,并且每个值取一个整数值,并基于设置的整数值,将在该方向上加载图块数。

AbstractMap :这是根类,它包含要加载的地图的所有基本详细信息,并且是Map初始化的起点。 它具有诸如缩放级别,中心坐标,Meshmodifiers,Mapbox访问,平铺提供程序等详细信息。

UnityARCameraManager-这是UnityARKit sdk提供的类,它用作检测ARSession,Planes和Anchor点的平面和初始化的主要摄像机。

DirectionFactory:这是我们用于在3d地图上绘制路线的c#类。 此类负责绘制坐标并获取特定坐标的地形高度,并使用传递给该类的坐标列表绘制跟踪。 该类还将热点/兴趣点作为坐标,并放置一些指示对象来指示POI。 使用坐标创建3d网格,该网格形成路线并将其放置在地图上。

与iOS Native和Unity3d混合

完成上述任务(如添加3d地图,在Unity3d中绘制路线和位置并生成代码)后,将为您提供多个OS选项,如iOS,Android等。您可以根据所支持的OS选择选项。 选择iOS将为您的Xcode项目提供用于通信的目标c类。 但是要添加更多本机特定的自定义或其他功能,您需要将通过Unity3D和本机代码生成的Xcode项目混合在一起。

  1. 创建AppDelegate:Unity3D生成UnityAppController类,这是应用程序的起点。 创建继承UnityAppController的AppDelegate类,以添加以本机代码创建的自定义视图控制器,使其成为第一个视图控制器
  2. 在UnityAppController中导入UIKit
  3. 为了在本机代码和统一的c#类之间进行通信,我们需要创建一些桥接类和声明函数,通过它们您可以调用c#函数,反之亦然。
  4. 它基本上看起来像这样。
  5. void sendUnityMessage(const char * gameObject,const char * unityMethod,const char * unityMessage){
  6. UnitySendMessage(gameObject,unityMethod,unityMessage);
  7. }

我引用了下面的链接,其中有详细说明。

缩小差距– Unity和iOS的插件

适用于iOS的App42 Unity3d插件可让您实现iOS本机代码。通过这种方式,您可以添加目标c边代码…

blogs.shephertz.com

最终产品看起来像这样: