Project Tango应该说是Google一试水AR的设备,其中Project Tango主要二个功能,一个是获取深度信息,如MS的Kinect,有相当多的设备都有这个功能,二是第一人称相对定位,这个就没那么常见了,如果对这个设备有更深的兴趣,可以看知乎上的这二个链接。
Google Project Tango获取深度信息的原理是什么?
Project tango是如何仅凭自身摄像头实现位置追踪的?
在这就不仔细来说这个东东了,上面二个链接比我自己再来说篇好多了,Project Tango本身有Unity3D的包(googlesamples/tango-examples-unity)如果在Unity3D下开发,相应的东东都已经提供,还有一些实例,能够很容易就开发基于Project Tango的功能出来。
UE4下就比较麻烦了,google没有针对UE4做相应的包,不过,google提供针对安卓开发的项目,一种是Android Studio项目,一个是供JNI调用的C语言项目。
googlesamples/tango-examples-java
googlesamples/tango-examples-c
UE4针对移动平台感觉还是不那么友好,如Unity调用Android项目,大家顺便一搜,都能搞定,而在UE4下引用安卓项目,如下是一个添加针对Android支持Google Play功能的committed。
UE4 Google Play support on Android
可以看到,有些复杂,特别针对我这种UE4与Android都不熟的人,只有想别办法,首先我的需求并不复杂,只是在一个模型与现实重叠的空间利用Project Tango的Motion tracking功能行走,旋转等,简单来说,我现在的办公室环境,利用3D建模做一个和办公室一样的模型,长宽都要对上,这样利用Project Tango 的Tracking,我能只看屏幕也知道我在办公室的那个位置,前面是否有障碍物,就如HTV vive的那二个像个小音箱的东东来检测可活动区域一样。
UE4本身的脚本就是C++语言,自然我就想到利用上面的tango c来做开发,如下主要记录本文实践这种方法遇到的一些问题。
首先安装UE4的安卓开发相关所有软件,UE4已经帮你差不多都搞好。安装安卓软件开发工具包(SDK) ,然后对照这个链接下的UE4安卓快速入门自己测试,一个简单的UE4 安卓程序发出来就没问题了。
tango-examples-c里很简单,一个so文件,相当于win平台中的动态链接库文件,二是一个头文件tango_client_api.h.现在就很简单了,相当于平常我们写C++程序一样,引入动态链接库,然后添加头文件就可,但是UE4中,编译都是靠对应目录下的cs文件编译,我们需要让UE4的规则来引入库与头文件。
按照UE4大家默认的一些目录位置与命名,先把相应头文件与库放入一个ThirdParth文件夹,然后放入UE4工程文件件,与Source,Binaries等目录平行,如下:
然后打开工程名.Build.cs文件,告诉编译器我们需要引入的库与文件。
public class Office_05 : ModuleRules { public Office_05(TargetInfo Target) { PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Launch", "UMG" }); //PrivateDependencyModuleNames.AddRange(new string[] { "" }); //PublicIncludePaths.Add("Runtime/Launch/Public"); //PrivateIncludePaths.Add("Runtime/Launch/Private/Android"); if (Target.Platform == UnrealTargetPlatform.Android) { PublicIncludePaths.AddRange(new string[] { "Core" }); PublicIncludePaths.Add("C:/NVPACK/android-ndk-r10e/platforms/android-19/arch-arm/usr/include"); LoadBobsMagic(Target); } } private string ModulePath { get { return Path.GetDirectoryName(RulesCompiler.GetModuleFilename(this.GetType().Name)); } } private string ThirdPartyPath { get { return Path.GetFullPath(Path.Combine(ModulePath, "../../ThirdParty/")); } } public bool LoadBobsMagic(TargetInfo Target) { bool isLibrarySupported = false; if (Target.Platform == UnrealTargetPlatform.Android) { isLibrarySupported = true; string LibrariesPath = Path.Combine(ThirdPartyPath, "tango_client_api", "lib"); PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath, "libtango_client_api.so")); } if (isLibrarySupported) { // Include path PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "tango_client_api", "include")); } //Definitions.Add(string.Format("WITH_LIBZPLAY_BINDING={0}", isLibrarySupported ? 1 : 0)); return isLibrarySupported; } }