2018 年 10 月

33 卷,第 10

此文章由机器翻译

Xamarin-在 Xamarin.Forms 中的增强现实

通过Rajeev K K

增强的现实 (AR) 快速合并为用于解决日常遇到的问题非常有用的工具。AR 是交互式的、 基于现实的显示环境,融合虚拟对象货真价实创建沉浸式用户体验。它启用了高级硬件,如 Microsoft HoloLens,请使用虚拟 2-D/3d 对象、 声音、 文本、 效果和跟踪。

AR 发现准备主页中的移动设备和智能手机,得益于高分辨率的照相机、 速度快的处理器和高带宽的无线网络。对 AR 支持在 iOS 和 Android 的较低的移动操作系统中条目的屏障的体验。移动设备的广泛支持对于 Xamarin.Forms 开发人员,他们就可以充分利用代码共享框架的优点和成熟的 ar。 所有极具吸引力的优势的工具使 AR 极具吸引力的目标

企业已使用 AR 吸引客户并改善体验。Harley Davidson 已创建的 iPad 应用程序提供了虚拟的购物体验,可让客户查看正文类型、 席位、 灯和添加其自定义自行车设计的其他选项。现代的虚拟指南应用使用 AR 教授所有者其汽车的工作原理,同时 IKEA 已开发的应用程序,请参阅家具可能在其生活空间中的显示方式的购物者。

目前,AR 是需要执行的本机平台的特定于设备的功能。虽然 Android 执行此操作通过 ARCore,iOS ARKit,通过向开发人员公开 AR。ARKit 需要 iOS 11 或更高版本的 iOS 设备和至少一个 A9 处理器。ARCore 需要 Android 7.0 或更高版本和到 Google Play 商店的访问权限。您可以从 Google 参考官方文档 (bit.ly/2BY68oS) 和 Apple (apple.co/2PcSVdm) 若要了解有关硬件和软件要求的详细信息。

学习新技术,而是必须了解其背后的基本概念。让我们考虑这些概念对 ar.

跟踪在真实时间中定位您在现实世界中的设备位置。若要创建物理和虚拟空间之间的实时关系,ARKit 使用一种称为 visual 惯性 odometry (VOI),而 ARCore 使用并发 Odometry 和映射 (COM) 技术。

环境的了解是检测功能点和平面,在现实生活中的过程。ARCore 和 ARKit 是能够确定每个平面边界。这可以用于将放置在现实世界平面边界内的虚拟对象。

定位点是指位置和方向的物理空间中。我们需要查找现实世界中的实际位置放置一个场景。ARKit 和 ARCore 都无法围绕移动照相机时保持此位置是。

浅估计确定的物理环境中的光线总量,并将正确的光照量应用于虚拟对象嵌入应用程序生成更逼真的效果。ARKit 和 ARCore 使用相机传感器来估计光线。

交互式 Environmentenables ARCore 并 ARKit 映射到设备屏幕的物理环境,使用命中测试,以确定 X,Y 坐标在屏幕上的。这使用户能够与通过屏幕界面,例如,使用等 tap 和轻扫手势环境进行交互。

输入 Xamarin.Forms

Xamarin 是一个适用于企业开发移动应用程序使用最广泛的跨平台工具。使用 Xamarin.Forms 的引入,企业可以构建本机 Ui iOS 和 Android 使用单一的共享的 C# 代码库 — 克服采用关键问题并使其用于开发企业应用程序平台的魅力。通过 Xamarin,完全支持 ARKit 和 ARCore 和 Xamarin 网站提供了 ARKit 和 ARCore 的详细文档。

从移动应用程序开发中我的经验,就可以通过关注多个 Xamarin.Forms 应用程序的设计阶段中实现这两行代码和 bug 的数量相当大减少。在 Xamarin.Forms 中的正确的应用程序体系结构设计跨平台实现最大的代码可重用性。它还使开发更迅速、 轻松自动化测试,集成的更改,减少的 bug 和的详细信息。在敏捷的世界中,为了使应用程序能够成功,它应启用方便地添加最少的代码更改的功能,而不会引入新 bug。这是原因使用敏捷方法执行时,尤其是,使用 Xamarin.Forms 的移动开发的首选的方法。

Xamarin 开发人员,是很高兴地发现 C# 的强大功能和 Xamarin.Forms 的优点可以如何改进开发令人兴奋的 AR 基于应用程序。

AR 视为中处理所有用户交互的 Xamarin 的 UI 层。由于 AR 是特定于设备和硬件敏感的功能,通常可能情况下窗体 API 中不实现 AR 本机平台功能的位置。在其中,Xamarin.Forms 的真正功能很方便。

若要开发 Xamarin 应用程序,必须在计算机上安装 Visual Studio。我可以编写与 Visual Studio 中,在 Windows 计算机上的 Xamarin,但我需要一台 Mac 进行运行和调试 iOS 应用程序。在开发计算机中安装最新的 iOS 和 Android Sdk。

尽管可以使用 Xamarin Live Player 来测试 Xamarin.Forms 应用程序,但它不是专业级工具并不支持自定义呈现器,效果或第三方 ModelView 视图模型 (MVVM) 产品。Microsoft 建议使用内置到 Visual Studio 来测试 Xamarin 应用程序的仿真程序。许多开发人员还使用 Genymotion。用于测试,建议在物理、 移动设备上安装 iOS 和 Android AR 基于应用程序。

创建 Xamarin.Forms AR 项目

在此示例中,我将介绍如何将三维飞机图像放在使用 Xamarin.Forms 和 ARKit 物理空间中。此外将了解如何对此三维对象进行动画处理。图 1显示最终 AR 应用在 iOS 上运行。

在 iOS 上运行应用程序
图 1 在 iOS 上运行应用程序

我将首先使用名称 ARApp 创建 Xamarin.Forms 应用程序。如中所示图 2,以及特定于平台的项目 ARApp.iOS 和 ARApp.Android 为.NET Standard,生成一个名为 ARApp 的默认 Xamarin.Forms 项目。接下来,我创建一个名为 art.scnassets 文件夹,并向 ARApp.iOS 项目添加三维文件和纹理文件。这些资产将用于加载 AR 场景。

项目结构
图 2 项目结构

现在我要创建适用于启动 AR 功能的 UI。出于演示目的,我将在 MainPage.xaml 文件中,定义一个按钮如下所示:

<Button Text="Click Me" VerticalOptions="Center" HorizontalOptions="Center"
  Clicked="OnButtonClick"></Button>

接下来,我将在代码隐藏文件,使用以下代码中实现按钮单击:

public partial class MainPage : ContentPage
{
  public MainPage()

  {
    InitializeComponent();
  }
  private void OnButtonClick(object sender, EventArgs e)
  {
    // Handle the button click from XAML UI here
  }
}

现在,我有 Xamarin.Forms UI 已准备好。现在,我将转到本机 AR 层实现。

特定于平台的 AR 实现

就可以实现 AR ARKit 或 ARCore,具体取决于该平台使用特定于平台的 Api。我将首先创建特定于平台的 UI 与 AR UI 实现,它可以使用 DependencyService,允许应用程序从共享代码调用到特定于平台的功能的依赖关系注入 (DI) 的 Xamarin 实现调用。

我将开始实现以获取 UI 在 iOS 上。首先,在 iOS 项目中创建 viewController,添加代码中所示图 3

图 3 在 ios 设备上实现 UI

public override void ViewDidLoad ()
{
  base.ViewDidLoad();
  startAR();
}
// Initialize AR scene view
public void startAR()
{
  // Create the scene view for displaying the 3-D scene
  sceneView = new ARSCNView();
  sceneView.Frame = View.Frame;
  View = sceneView;
  CreateARScene(sceneView);
  PositionScene(sceneView);
}
// Configure AR scene with 3-D object
public void CreateARScene(ARSCNView sceneView)
{
  // lLoading the 3-D asset from file
  var scene = SCNScene.FromFile("art.scnassets/ship");
  // Attaching the 3-D object to the scene
  sceneView.Scene = scene;
  // This is for debugging purposes
  sceneView.DebugOptions = ARSCNDebugOptions.ShowWorldOrigin | 
    ARSCNDebugOptions.ShowFeaturePoints;
}
// Position AR scene
public void PositionScene(ARSCNView sceneView)
{
  // ARWorldTrackingConfiguration uses the back-facing camera,
  // tracks a device's orientation and position, and detects
  // real-world surfaces, and known images or objects
  var arConfiguration = new ARWorldTrackingConfiguration
  {
    PlaneDetection = ARPlaneDetection.Horizontal,
    LightEstimationEnabled = true
  } ;
  // Run the AR session
  sceneView.Session.Run(arConfiguration, ARSessionRunOptions.ResetTracking);
  var sceneNode = sceneView.Scene.RootNode.FindChildNode("ship", true);
  sceneNode.Position = new SCNVector3(0.0f, 0.0f, -30f);
    sceneView.Scene.RootNode.AddChildNode(sceneNode);
  // Add some animation
  sceneNode.RunAction(SCNAction.RepeatActionForever(
    SCNAction.RotateBy(0f, 6f, 0, 5)));
}

现在,我将要调用从 Xamarin.Forms AR。不过,该如何查明呢?这是真正的 Xamarin.Forms 传入的位置。DI 用于调用.NET Standard 或,(可选),以可移植类库 (PCL) 中的本机平台代码。我们来看如何实现此操作。

依赖关系服务

DependencyService 功能允许应用从共享代码调用特定于平台的功能。此功能通过 Xamarin.Forms 应用,若要执行的本机应用程序可以执行任何操作。有四个组件所需使用 DependencyService:

  • 界面:作为共享代码中的接口定义的功能。
  • 每个平台的实现:添加实现对每个平台项目接口的类。
  • 注册:使用 DependencyService 注册每个实现的类,通过元数据属性。注册后,可以 DependencyService 来找到实现类并将其提供替代该接口在运行时。
  • 调用到 DependencyService:通过从代码中显式调用 DependencyService 请求接口的实现。

我将 Xamarin.Form 应用程序中使用依赖关系服务,以实现 ar。

接口必须设计一个接口以定义与 ARKit/ARCore 特定于平台的 Api 的交互。请务必多加注意到在设计中,此层作为指定它是向外部类公开的 API 层。例如,可以创建名为 IARApp 一个接口,并定义一个名为 LaunchAR 方法:

public interface IARApp{
  void LaunchAR (  ); // Note that interface members are public by default
}

AR 接口的特定于平台的实现必须为针对每个平台项目中实现该接口。因为实现发生在共享环境中,可以从所有平台都调用该接口。缺少实现任何平台会生成 NullReferenceException。

可以在 iOS 上看到 IARApp 接口实现的代码图 4。下面是用于在 Android 上实现相同接口的代码:

[assembly: Xamarin.Forms.Dependency(typeof(ARDemo.Droid.ARAppImpl))] 
namespace ARDemo.Droid
{
  public class ARAppImpl:IARApp
  {
    public void LaunchAR()
    { 
      // Launch AR in Android
    }
  }
}

图 4 在 iOS 上的 IARApp 接口实现

[assembly: Xamarin.Forms.Dependency(typeof(ARDemo.iOS.ARAppImpl))]
namespace ARDemo.iOS
{
  public class ARAppImpl:IARApp
  {
    public void LaunchAR()
    {
      // This is in native code; invoke the native UI
        ARViewController viewController = new ARViewController();
        UIApplication.SharedApplication.KeyWindow.RootViewController.
          PresentViewController(viewController, true, null);
    }
  }
}

请注意,[程序集:] 必须将属性声明在命名空间上。否则,不会调用依赖关系服务。所有此操作完成后,我可以现在调用 AR 通过 Xamarin.Forms 单击按钮,调用此代码具有的依赖关系服务:

public partial class MainPage : ContentPage
{
  public MainPage()
  {
    InitializeComponent();
  }
  private void OnButtonClick(object sender, EventArgs e)
  {
    DependencyService.Get<IARApp>().LaunchAR(); // Launch AR
  }
}

总结

图 5提供了一看示例应用的应用程序体系结构。适用于 iOS 的 AR 实现已完成,并且可以完成 Android 使用相同的方法的实现。

应用程序体系结构
图 5 应用程序体系结构

以下是对于那些想要实现这一点适用于 Android 的提示:使用通过依赖关系服务,用于在 Android 中实现 AR ARCore。HelloAR 是一个实现了 Android 平台的 Google AR 项目已移植的 Xamarin。此项目将帮助你在 Android 中启动 AR 实现。请参阅以下链接,了解详细信息: bit.ly/2ojBZq4bit.ly/2PKcomX

最后一件事:设计与 AR mobile 中的具有吸引力沉浸式体验,务必确定用户交互设计的优先顺序。ARKit 和 ARCore 文档提供了用于创建最佳的沉浸式体验,为最终用户的有用提示和指南。让我们看一下某些重要交互设计准则的占位符:

  • 交互应直观和简单。避免不必要的复杂性。
  • 使用音频和 haptic 反馈来增强沉浸式体验。
  • 使用整个屏幕空间 (显示) 来吸引用户。
  • 应为用户说服场景、 对象和动画。
  • 请考虑如何人必须使用您的应用程序时保存其设备并确保它可为他们提供最佳的沉浸式体验。
  • 提供用户需要时的直观的基于上下文的指南。

AR 了彻底的变革。它是围绕数字 twinning,利用实物资产、 流程和系统能够范围广泛的活动的数字副本的新技术的主要成分。此技术在企业中的增长将会非常快速地发生,Xamarin.Forms 代表要重要数字 twinning 今后的促成因素。请确保浏览 AR 的神奇功能在不同的平台和获取自行配备。

祝您工作愉快!


Rajeev K R是 TCS 的解决方案架构师 Tata Consultancy Services 交互。他主要关注于派生的端到端企业数字频道策略并构建移动解决方案的企业体系结构。他通过混合使用 AI/ML 和交谈 UI 平台中移动的沉浸式技术是最新的数字技术的热情和兴趣试验。

衷心感谢以下 Microsoft 技术专家对本文的审阅:Dan Hermes


在 MSDN 杂志论坛讨论这篇文章