增强现实企业级项目(一)

​Vuzix智能眼镜:企业级AR解决方案的领航者与行业实践​ 凭借其企业级智能眼镜解决方案,已成为医疗、工业和军事等垂直市场的标杆品牌。本文将从核心技术、行业案例和开发实践三个维度,全面解析Vuzix如何推动AR技术落地。推动AR技术从"概念验证"走向"规模商用"。对于开发者而言,现在正是切入企业AR赛道的最佳时机。随着工业4.0和数字化转型加速,增强现实(AR)技术正重塑人机交互方式。​:Vuzix, AR智能眼镜, 工业4.0, 远程协助, 增强现实开发。​:#AR开发 #人机交互 #工业元宇宙 #智能硬件 #数字化转型。 阅读详情

原文:zh.annas-archive.org/md5/ef99724ddd4d350ed6a2857c854fa264

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

增强现实(AR)是一项令人惊叹的技术,其历史可以追溯到 20 世纪 90 年代,直到谷歌眼镜的出现和基于 AR 的游戏《精灵宝可梦 GO》的发布,才为公众所熟知。尽管最初它主要用于营销以获得“哇”的效果,但它后来被证明是许多其他领域(如旅游、工业、医学和教育)中用户的自然界面。其功能的多功能性(基于图像或物理世界识别、GPS 定位等)和目标设备(Android/iOS 移动设备、计算机、网络和头戴式显示器(HMD))使其成为不同领域和实施(如工业指南、现场艺术体验和培训工具)的完美补充。

《企业增强现实项目》旨在带您踏上使用市场上最知名的框架开发并构建增强现实(AR)应用的旅程。在这本书中,我们将详细探讨为六个不同的企业领域(制造、培训、营销、零售、自动化和旅游)开发基于 AR 的应用程序,从市场需求出发,并在每种情况下选择最合适的工具。每一章都将通过使用不同的框架或目标设备来介绍 AR 的新用途。

第一章将介绍 AR,以便您在开始编码之前对其用途和潜力有一个良好的理解。接下来,我们将向您介绍 Unity,这是一个惊人的 3D 工具,它将在许多章节中简化集成 AR 框架和操作 3D 对象和场景的任务。然后,我们将使用 Android Studio 和 ARCore 来创建我们的第一个用于原型设计的增强现实项目。之后,我们将探索使用 Google Web Component <model-viewer>的 WebAR,以及新兴的 AR 创作工具 Augmented Class!,用于教育。接下来,我们将开始使用 Unity 来集成 AR 框架 EasyAR,创建一个用于营销体验的 AR 目录。然后,我们将继续使用 Vuforia 框架,并在零售中使用它。此外,我们将使用 Vuforia 结合 AR 眼镜来创建自动化过程的逐步指南。然后,我们将以在 Xcode 中开发的 ARKit 结束本书,以实现一个用于旅游的增强现实维度门户。

本书面向对象

《企业增强现实项目》面向对新兴和交互式技术感兴趣的爱好者,他们希望逐步构建任何领域的 AR 应用程序,并了解开发它们的最新工具。无需具备 AR 经验。一些面向对象的编程技能将有所帮助。

本书涵盖内容

第一章,《AR 简介及其在企业中的应用》,本书首先介绍了 AR 及其应用。它涵盖了技术的起源、可开发的 AR 类型、本书中将要使用的框架,以及 AR 在不同企业领域的应用。

第二章,《Unity AR 开发的简介》,是 Unity 实时 3D 开发平台的介绍,您将学习主要元素的名词和用法。您还将学习如何使用 C#创建第一个脚本,以了解这个工具的潜力。

第三章,《使用 ARCore 进行制造业的 AR》,介绍了 ARCore 技术及其表面检测功能。您将使用 Android Studio 和 Sceneform 插件创建一个 Android 原型查看器,这将帮助我们轻松地将 3D 模型集成到我们的项目中。

第四章,《使用 WebAR 和增强课堂进行培训的 AR》,在共同的项目中探索两种不同的工具。使用 WebAR,您将学习如何开发一个简单的 Web 应用,该应用包含<model-viewer> Web 组件,该组件将用于从支持 ARCore 的移动设备启动 AR。增强课堂!是一个用于 Android 的作者工具,用于轻松创建交互式教育 AR 项目。

第五章,《使用 EasyAR 进行营销的 AR》,为您介绍如何使用 Unity 结合 EasyAR 框架开发 AR 项目。您将学习如何基于图像跟踪开发增强型目录,以及如何在 Unity 中创建界面并将它们链接到场景中的脚本和对象。

第六章,《使用 Vuforia 进行零售的 AR》,教您如何在 Unity 中使用 Vuforia 的地形检测功能将 3D 对象放置在平坦表面上,并对其进行移动/旋转/缩放,同时还有在 Vuforia 之上添加 ARCore 的可能性。在此过程中,您将继续使用 Unity 及其组件来巩固之前的概念。

第七章,《使用 Vuforia 和 AR 眼镜进行自动化 AR》,继续使用 Vuforia 框架进行开发,但在此案例中侧重于 AR 眼镜。在创建自动化过程的增强型指南时,您将了解移动和眼镜导向型应用之间的相似之处和不同之处。

第八章,《使用 ARKit 进行旅游的 AR》,在 Xcode 上开发,针对 iOS 设备。在本章中,您将创建一个锚定在现实世界中的增强型门户,将用户带到隐藏的虚拟世界。为此,您还将学习如何使用 SceneKit 框架创建 3D 场景并显示 3D 模型。

为了充分利用本书

为了充分利用本书,不需要任何先前的 AR 或 Unity 经验,因为它们将在本书中详细讲解。同样,对 Android Studio 和 Xcode 的先了解会有所帮助,但不是必需的。面向对象编程技能会有所帮助,因为我们将使用 Java、C# 和 Swift 来进行我们的项目。然而,如果您遵循书中的步骤并复制粘贴代码,您将能够从头开始构建所有项目。

每一章都将包含安装说明和您实现每个项目所需的信息。

VS: 虽然 VS2019 已经发布,但我们使用 2017 版本,因为它与 Unity 集成,这将确保它可以直接工作而无需进一步配置。

JDK: 任何版本高于 JDK 8 的新 OpenJDK 都应该能够正常工作,但为了避免错误,建议使用版本 8。

下载示例代码文件

您可以从 www.packt.com 的账户下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问 www.packtpub.com/support 并注册,以便将文件直接通过电子邮件发送给您。

您可以通过以下步骤下载代码文件:

  1. 在 www.packt.com 上登录或注册。

  2. 选择支持选项卡。

  3. 点击代码下载。

  4. 在搜索框中输入书籍名称,并按照屏幕上的说明操作。

文件下载完成后,请确保使用最新版本解压或提取文件夹:

  • WinRAR/7-Zip for Windows

  • Zipeg/iZip/UnRarX for Mac

  • 7-Zip/PeaZip for Linux

本书代码包也托管在 GitHub 上,地址为 github.com/PacktPublishing/Enterprise-Augmented-Reality-Projects。如果代码有更新,它将在现有的 GitHub 仓库中更新。

我们还有来自我们丰富的图书和视频目录的其他代码包,可在 github.com/PacktPublishing/ 上找到。查看它们吧!

下载彩色图像

我们还提供了一份包含本书中使用的截图/图表彩色图像的 PDF 文件。您可以从这里下载:static.packt-cdn.com/downloads/9781789807400_ColorImages.pdf。

使用的约定

本书使用了多种文本约定。

CodeInText: 表示文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 账号。以下是一个示例:“从它中删除文本,并将按钮名称更改为 Home_button。”

代码块设置如下:

h1 {
  text-align: center;
  color: #000000;
  font-style: bold;
}

粗体: 表示新术语、重要词汇或您在屏幕上看到的词汇。例如,菜单或对话框中的文字会像这样显示。以下是一个示例:“选择 ARCamera,然后在检查器窗口中点击打开 Vuforia 引擎配置。”

警告或重要提示看起来像这样。

小贴士和技巧看起来像这样。

联系我们

我们欢迎读者的反馈。

一般反馈: 如果你对此书任何方面有疑问,请在邮件主题中提及书名,并通过customercare@packtpub.com给我们发送邮件。

勘误: 尽管我们已经尽一切努力确保内容的准确性,但错误仍然可能发生。如果您在这本书中发现了错误,我们将不胜感激,如果您能向我们报告这一点。请访问 www.packtpub.com/support/errata,选择您的书籍,点击勘误提交表单链接,并输入详细信息。

盗版: 如果你在互联网上以任何形式遇到我们作品的非法副本,如果你能提供位置地址或网站名称,我们将不胜感激。请通过copyright@packt.com与我们联系,并附上材料的链接。

如果您有兴趣成为作者: 如果您在某个领域有专业知识,并且您有兴趣撰写或为书籍做出贡献,请访问 authors.packtpub.com.

评论

请留下评论。一旦您阅读并使用过这本书,为什么不在此购买它的网站上留下评论呢?潜在读者可以看到并使用您的客观意见来做出购买决定,Packt 公司可以了解您对我们产品的看法,我们的作者也可以看到他们对书籍的反馈。谢谢!

如需了解 Packt 的更多信息,请访问 packt.com.

第一章:AR 简介及其在企业中的应用

本书是为对新兴和交互式技术感兴趣的爱好者所写,他们从一开始就希望为任何市场领域构建 AR 应用,并了解开发它们的最新工具。不需要先前的 AR 经验。

本书的主旨是通过在不同企业环境中完成一系列项目,向您介绍不同的 AR 框架。虽然不需要特定的编程技能,但希望您具备一定的知识,以便理解每个示例中的代码。一些面向对象的编程技能会有所帮助,但不是必需的。本书是从零开始编写的,因此您将能够逐步跟随任何编码需求。

在本章中,我们将学习什么是增强现实(AR),并简要介绍其历史、类型以及工作原理。我们还将介绍本书中将使用的软件开发工具包(SDKs)。最后,我们将探讨 AR 的应用实例,特别是其在企业内部的应用。本章的主要目标是理解 AR 当前的应用情况,包括市场、技术、设备以及具有多种 AR 识别模式(如目标图像、云标记、基于 GPS、物体或人脸追踪和空间映射)的开发工具。你还将了解本书中将使用的主要 AR 工具及其主要功能的简要介绍。

到本章结束时,您将基本了解 AR 的工作原理及其不同的用途,以便更容易地跟随后续的技术章节。

本章将涵盖以下主题:

  • 理解 AR

  • 与 AR 协作

  • 在企业中使用 AR

理解 AR

AR 是用来描述允许用户通过技术设备(智能手机、平板电脑或 AR 眼镜)的摄像头,通过该设备添加的虚拟图形信息来可视化部分真实世界的技术术语。该设备将虚拟信息添加到现有的物理信息中。通过这种方式,有形的物理元素与虚拟元素相结合,从而在实时中创建增强现实。以下图像显示了 AR 的工作原理:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/388f8dce-038f-4050-8014-9b8cda967b73.png

一个用户在平板电脑上看到 AR 中的 3D 苹果

现在,我们将探讨 AR 的起点,并了解 AR 可以根据其功能如何划分。

简短历史——新现实的起点

AR 不是一项新技术。AR 的起点可以追溯到哲学家、愿景家和电影制作人 Morton Heilig 发明的机器,他在 1957 年开始构建一个原型,其外观类似于 90 年代非常流行的街机视频游戏机。以下图像显示了该原型的示意图:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/3172ab3a-a07b-4b23-89a9-9a966a9535e1.png

发明工作原理的图示(此图像由 Morton Heilig 创作)

Morton 将他的发明命名为Sensorama,这是一种投影 3D 图像、添加环绕声、使座椅振动并创造向观众投掷空气的体验。我们今天可以感受到的最相似的经验是在 4D 电影院看电影,但这些体验是在 60 多年前创造的。

1968 年,哈佛电气工程教授 Ivan Sutherland 创造了一种将成为 AR 技术未来关键设备的装置,称为人机载显示(HMD)。与今天我们所知的 AR 眼镜截然不同,这个被称为达摩克利斯之剑的 HMD 是一个巨大的机器,悬挂在实验室的天花板上,当用户被放置在正确的位置时才会工作。在下面的图像中,你可以看到这个发明的外观:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/7a4e8a66-3086-4453-8cfa-8238973f0421.png

达摩克利斯之剑(此图像由 OyundariZorigtbaatar 创作) 

1992 年,波音研究员 Tom Caudell 发明了 AR 这个术语,同时,AR 技术从另外两个作品中得到了推动。第一个 AR 系统来自美国空军工作的 L.B. Rosenberg,这是一个为用户提供如何执行某些任务的建议的设备,类似于虚拟向导。这可以在下面的图像中看到:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/35bc11ba-d0bf-4780-9f9c-52f6865556d0.png

左侧的虚拟设备 AR 系统和其右侧的视图(此图像由 AR Trends 创作)

在这个领域的其他研究由哥伦比亚大学领导,那里的一组科学家发明了一种与打印机交互的 HMD。这个设备被命名为Karma(基于知识的维护辅助 AR),它投射一个 3D 图像来告诉用户如何为打印机充电,而不是查阅用户手册。

下面的图表是基于 Milgram 和 Kishino(1994 年)的连续高级计算机界面表示,其中我们可以看到从现实环境到虚拟现实的混合现实(MR)的不同子类别。位于现实环境附近的 AR 分为空间 AR 和透视 AR。然而,21 世纪移动设备的出现允许了一种不同的 AR 版本,我们可以通过设备屏幕和摄像头来显示它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/0c6db9df-cb12-4fde-9292-ddd6d56019d0.png

混合现实及其子类别

现在我们已经介绍了增强现实(AR)的初步概念,接下来让我们学习如何根据用于在现实世界中显示虚拟元素所使用的触发器来对这项技术进行分类。

AR 背后的魔法

AR 可以通过多种方式创建;主要挑战是如何使现实世界与虚拟世界的结合尽可能无缝。根据用于触发虚拟元素在现实世界中出现的触发器,AR 可以分为以下几种:

  • GPS 坐标:我们使用 GPS 坐标、指南针和加速度计来确定用户的精确位置,包括他们正在看的方位点。根据用户指向的位置,他们将看到一些虚拟对象或从同一位置看到的其他对象。

  • 黑白标记器:我们使用非常简单的图像,类似于黑白二维码,以在上面投影虚拟对象。这是最早的 AR 示例之一,尽管如今由于有更真实的方式来创建 AR 体验,它们的使用频率较低。

  • 图像标记器:我们使用移动设备的摄像头定位预定义的图像(也称为目标或标记),然后在它们上方投影虚拟对象。这种类型的 AR 已经取代了黑白标记。

  • 实时标记器:用户使用移动摄像头创建并定义自己的图像,以在其中投影任何虚拟对象。

  • 面部识别:通过摄像头,我们捕捉面部运动以执行请求中的某些动作,例如,向虚拟头像做出面部表情。

  • SLAM:即同时定位与地图构建,这项技术通过特征点理解物理世界,从而使 AR 应用能够识别 3D 对象和场景,并即时跟踪世界,叠加数字交互增强。

  • 信标:eBeacons、RFID 和 NFC 是使用无线电频率或蓝牙的识别系统,类似于 GPS 坐标,以触发 AR 元素。

现在,你对 AR 是什么以及它的来源有了更好的理解。我们通过查看第一代原型来介绍 AR 的基础知识,并根据触发虚拟图像的元素对不同的 AR 类型进行分类,以便它们出现在屏幕上。下一步是了解与之合作所需的内容。

与 AR 合作

AR 项目需要一些基本元素来履行其功能:

  • 数字支持,主要是平板电脑、手机或眼镜。这些将是我们将用来识别我们所看到的内容并将信息融入 AR 的设备。

  • 传感器,如摄像头、GPS、3D 扫描仪等,以感知现实。它们通常集成到移动设备中。

  • 一种算法或应用程序,用于理解正在观察的现实,并使用相关信息进行解释和显示。

  • 数字内容以丰富现实。这是你融入 AR 的所有信息。

结果是一个界面,其中现实通过位于所需空间中的附加信息进行观察。以下小节将介绍不同的 AR 库和 SDK,以及它们的工作原理。

ARToolKit – 第一个 AR 库

ARToolKit 是世界上第一个开源软件库,它允许创建增强现实(AR)应用,在这些应用中,虚拟图像会与现实世界中的物体重叠。它利用视频跟踪功能来实时计算摄像机的位置以及相对于物理标记的朝向。一旦确定了真实摄像机的位置,虚拟摄像机就被放置在相同的位置,并在真实标记上叠加一个虚拟信息层,例如一个 3D 对象。ARToolKit 最初由加藤宏和华盛顿大学 HIT 实验室开发,并于 1999 年首次发布。它目前作为一个开源项目托管在 SourceForge 上,同时 ARToolworks 提供商业许可证:www.artoolkitx.org/。

AR SDK 简介

现在,我们将介绍本书中将使用的 AR SDK。从 ARToolKit 的首次出现以来,AR SDK 已经发生了很大的变化。让我们介绍并描述本书中将使用的不同 SDK,以创建我们自己的 AR 体验:

  • Vuforia

  • EasyAR

  • ARCore

  • ARKit

让我们简要介绍一下它们。

Vuforia

最初由高通开发,目前由 PTC 运营,Vuforia 是最古老且最知名的 AR SDK 之一,也是市场上最稳定和性能最好的软件之一。Vuforia 提供了各种功能,包括 2D 和 3D 跟踪、无标记 AR 以及称为 Vumarks 的标记。它提供了多个示例和额外功能,例如虚拟按钮、运行时图像目标创建和背景视频纹理操作。

EasyAR

一个 AR 引擎,使我们能够以简单的方式创建 AR 解决方案,并提供多种 AR 功能,包括识别和跟踪在现实世界中先前选定的图像(如封面、照片或名片)的位置、旋转和缩放的技术。它允许我们映射真实地点并跟踪其中的物体,并包含定位和跟踪真实 3D 物体的位置和朝向的技术,而不是平面图像和功能,这允许我们在播放 AR 场景时拍摄视频。

ARCore

第一个版本于 2018 年 2 月发布,是 Google 为 Android 和 iOS 创建 AR 应用的平台。它利用不同的功能,如运动跟踪,来估计移动设备相对于真实世界的位置和朝向;环境定位,以找到和跟踪水平表面,如地面、平板电脑或墙壁;以及光估计,将 3D 元素以逼真的方式放置到真实世界中。针对 Android 7.0 及以上版本,市场上并非所有设备都支持这项技术,尽管自第一个 SDK 版本以来,支持该技术的设备数量已大幅增加。

ARKit

苹果公司在 2017 年发布了 ARKit 的第一个版本,与 Xcode 9 和 iOS 11 一起推出,将 AR 引入 iOS 设备。该框架包含在 Xcode 中,使用户能够在现实世界中放置虚拟内容。在官方发布几个月后,它增加了新的功能,如 2D 图像检测和面部检测。2018 年,随着 iOS 12 的发布,ARKit 2 推出,新增了 3D 对象跟踪、为场景添加逼真纹理以及创建多用户 AR 体验等功能。在撰写本书时,最新版本是 iOS 13,ARKit 3 承诺在当前状态下实现巨大改进,因为它将添加一种与虚拟元素交互的新方式,例如在检测到人站在虚拟对象前面时隐藏虚拟对象。它还允许用户通过手势与 3D 对象交互,并不仅捕捉面部表情,还能捕捉人的身体动作。

既然我们已经熟悉了本书中将使用的 AR 工具,让我们看看我们将如何将这些软件应用于不同的企业领域。

在企业中使用 AR

AR 可以在多个领域成为有价值的资产和技术。在本节中,我们将学习它在工业、营销、零售和旅游等领域的应用。在第一种情况下,我们将了解工业 4.0 如何将 AR 置于聚光灯下,因为它是生产、维护、培训等领域人机交互的自然界面。

本节的主要目标是让您在开始编码之前更好地了解如何在自己的项目中应用 AR。这样,您将能够根据自身需求调整本书中的示例。

让我们开始介绍 AR 在工业领域的应用。

在工业 4.0 中使用 AR

这种技术在工业领域的应用正在增长。其应用重点之一是能够为机器的故障做好准备,从而知道哪个部件已经损坏以及如何进行维修。这种 AR 的应用可以显著降低成本,因为它有利于在故障发生之前迅速采取行动。您还可以使用 AR 在实施之前可视化工厂或产品。这意味着您可以在将其变为实体之前完善要构建的内容。AR 在工业领域的应用有利于工业 4.0 的使能技术之一的应用,这些技术有助于提高公司的竞争力和生产力。

以下是一些示例:

  • 智能助手

  • 虚拟原型

  • 物流与仓储管理

  • 数字孪生

让我们更详细地看看这些示例。

智能助手

使用 AR 与维护过程管理平台结合,可以为工业机器的操作提供直接支持,从而缩短操作或维修任务的时间并提高准确性。以下是一些在这种情况下可以执行的任务:

  • 跟随指导说明和工作流程

  • 实时分配活动

  • 检查清单和分配任务列表

  • 创建干预的数字报告

  • 自动检测 3D 对象

  • 实时查看 3D 手册和工作单

  • 通过视频通话拥有专家远程协作者

  • 从机器中提取和显示实时数据

在这种情况下,使用增强现实(AR)技术通过降低成本和错误的可能性来提高商业生产力。

虚拟原型

AR 可以应用于实时可视化和配置 3D 工业工厂和设备。3D 模型可以在进行验证的工业环境中显示,也可以在展览会和活动等展览空间中展示。通过 AR,您可以在设备安装的位置可视化工业机械的全息图,以评估其尺寸、逃生空间和安全边缘。通过这样做,您可以优化生产流程。此外,将重型工业机械从世界的一个部分运送到另一个部分以在展览会上展示,成本非常高。使用 AR,您可以在展位中心看到您的产品就像它是真实的一样。

物流和仓库管理

通过连接到仓库管理系统的 3D 查看器或眼镜,仓库操作员可以直接在设备上接收商品存储的信息,这使得他们能够提高工作效率和质量,最终提高生产率。

数字孪生

多亏了 AR 技术,您可以为真实系统、产品或服务创建一个虚拟和动态的复制品,通过从传感器或自动化中获得的信息,模拟其行为。这样,它允许智能监控和分析,以及在复制品中实现模拟和实验,没有风险或成本,目的是提高真实系统的性能和有效性。

在这本书中,我们将学习如何通过创建一个带有 AR 引导和培训的原型自动化来使用 AR 进行制造。

在其他企业领域使用 AR

行业并不是 AR 技术唯一有价值的领域。这种技术的多功能性使其成为用户与最终产品或过程之间完美的沟通工具,并为它们添加了一个视觉和交互层,以吸引他们的注意力。无论是用来使产品更具吸引力,还是帮助用户通过附加信息理解一个过程,AR 在许多领域都可以成为一项宝贵的资产。让我们看看本书后面将要涵盖的其他企业领域,在这些领域中 AR 增加了价值。

制造业中的 AR

在这个领域,AR 有许多用途,如原型设计、生产和培训。在这些领域,AR 可以通过在现实世界之上可视化设计来帮助加快原型设计并降低成本,允许设计师、工人和潜在客户在模型周围和内部走动,并操纵其三维结构。

AR 用于培训

AR 已成为教育和培训中的一个宝贵资产。它使我们能够在图像上或直接在房间内以三维形式可视化概念,这样我们可以更快、更动态地获取信息(只需用摄像头指向而不是翻阅书籍或在网上搜索信息),或者创建更深入的个人项目(使画作栩栩如生、在手工艺品上添加说明或额外信息、创建动画演示等)。

AR 在营销中的应用

使用 AR,用户负责他们的体验并可以与之互动。现在,品牌已经超越了“哇”的效果,创造了功能性的体验来推广和销售他们的产品。这包括增强型目录,它在其平面图像上以 3D 形式展示产品;虚拟镜子,你可以在 AR 中试戴眼镜或配件;包装变得生动起来,解释制造过程中的元素;等等。

AR 在零售中的应用

零售是 AR(增强现实)提供更广泛可能性之一的领域,从满足和吸引消费者以减少退货产品,到将产品与社交媒体或个性化购物体验相连接。这方面的例子包括在购买前尝试产品,以便用户可以在实际购买产品之前,将衣服、鞋子、眼镜甚至化妆品可视化到自己身上。通过这样做,他们可以借助 AR 看到家具、艺术品甚至墙面涂料在自己家中呈现的效果。

其他例子包括在购买产品之前查看有关产品的额外信息,如评论和评价,从商店接收地理位置信息及折扣,以及在超市或大型商店中,通过区域引导顾客到他们想要的产品。

AR 在自动化中的应用

AR 是自然的人机界面和连接到**物联网(IoT)**和大数据的桥梁。它允许工人以简单和吸引人的方式可视化并交互工厂机器和传感器的数据,无论是使用移动设备还是 AR 头戴设备。

AR 在自动化中的应用可以从员工的面部识别到访问具体机器,到通过 AR 眼镜进行现场生产过程的实时监控或远程访问和控制。

AR 在旅游中的应用

增强现实吸引人的地方在于它在现实世界之上显示的视觉内容。这使得这项技术非常适合增强旅行体验,从展示天际线信息到让博物馆中的动物栩栩如生,甚至实时翻译标志和指南。在旅游业中,AR 的一些最常见用途包括在陌生城市的街道上充当现场导游,用户可以在 AR 应用显示他们最感兴趣的景点的同时在城市中四处走动;当用户用摄像头指向地图时,在地图上显示景点和兴趣点(POIs);在画作、雕塑或纪念碑上提供各种额外信息,以便当用户指向一幅画时,它可以显示关于作者、画作创作地点和时间或甚至通过 3D 模拟使其栩栩如生的视频。除了所有这些体验之外,当 AR 与其他沉浸式技术(如虚拟世界或 360 度视频)结合时,体验又向前迈出一步,使用户能够同时访问多个地方(例如,在博物馆网络中,在访问其中一个的同时,能够虚拟访问其他地方)。

在本节中,我们探讨了如何在不同领域使用增强现实(AR)的几个示例,从在建造之前可视化原型,到吸引客户或为艺术品增值。现在,你对 AR 在商业世界中的可能性以及如何根据每个行业的需要应用它有了更好的理解。

摘要

在本章中,我们通过学习什么是 AR、它的起源以及我们需要哪些软件和元素来创建它,首次了解了 AR。我们了解了本书中将使用的 SDK 的名称和主要功能,现在我们准备开始创建自己的 AR 项目。

在下一章中,我们将介绍 Unity 3D,这是一个 3D 工具,可以作为几乎所有 AR 项目的基础,因为大多数 AR SDK 都与它兼容。你将了解它是如何工作的,并创建一个简单的示例,这将是后续 AR 项目的基础。

第二章:Unity AR 开发入门

本章将向您介绍 Unity,这是一个实时 3D 开发平台,已成为多平台增强现实(AR)开发的主要工具之一。其多功能性、广泛的文档和活跃的论坛使得学习曲线快速,并且其 Asset Store 中已创建的场景、示例和多样化的资源将帮助您以快速简单的方式创建令人惊叹的 AR 体验。

本章的主要目标是让您在使用 AR 项目之前对 Unity 感到舒适。您将学习如何安装和使用 Unity,了解用户界面的分布,以及主要组件的名称和用途。然后,您将创建一个简单的 C#脚本,以了解脚本编写的强大功能,以便能够自定义 3D 场景。到本章结束时,您将掌握基本知识,以便可以通过集成和与以下章节中将要介绍的 AR软件开发工具包(SDKs)一起工作来进一步探索 Unity。

Unity 是 AR 开发中最强大的工具之一;它是跨平台的,大多数 AR SDKs 都有与 Unity 兼容的特定包。在本书中,第五章,使用 EasyAR 进行营销的 AR,第六章,使用 Vuforia 进行零售的 AR,和第七章,使用 Vuforia 和 Epson 眼镜进行自动化的 AR,将使用 Unity 开发,尽管它们的示例项目是在 Android 设备上实现的,但它们也可以构建(Epson 眼镜除外,它只能在 Android 操作系统上运行)为 iOS 设备,几乎不需要代码更改。此外,第三章,使用 ARCore 进行制造的 AR,和第八章,使用 ARKit 进行旅游的 AR,也可以在 Unity 中实现。

因此,本章的重要性在于,您将学习如何创建 Unity 3D 项目并为特定平台构建它,这将为更复杂的项目奠定基础。

在本章中,我们将涵盖以下主题:

  • 介绍 Unity

  • 为 Unity 准备您的系统

  • 理解 Unity 界面

  • Unity 主要组件

  • 脚本编写 – 第一个 C#示例

技术要求

本章的技术要求如下:

硬件(从docs.unity3d.com/2019.1/Documentation/Manual/system-requirements.html):

  • CPU:支持 SSE2 指令集

  • GPU:具有 DX10(着色器模型 4.0)功能的显卡

操作系统:

  • Windows: 7 SP1+,8,10,仅限 64 位版本

  • macOS: 10.12+

  • Linux: 固定在 Ubuntu 16.04,18.04 和 CentOS 7

Android 开发软件:

  • Java 开发工具包(本书中为 1.8.0)

  • Unity 3D(本书中为 2019.1.2f1)

  • Android SDK(包含在 Unity 安装中)

  • Microsoft Visual Studio Community 2017(包含在 Unity 安装中)

本章的资源和相关代码文件可以在以下链接找到:github.com/PacktPublishing/Enterprise-Augmented-Reality-Projects/tree/master/Chapter02。

虽然我们将为 Android 设备开发 Unity 项目,但你也可以为 iOS 构建它们。在这种情况下,要求是 macOS 和 Xcode 9.4 或更高版本。

介绍 Unity

当我们想到近年来对游戏开发产生重大影响的工具时,一个名字脱颖而出:Unity。Unity 是一个图形引擎,帮助我们开发视频游戏、交互式项目、可视化以及在不同平台上进行实时 2D 和 3D 动画。Unity 提供了一个完整的可视化编辑器和脚本,使我们能够创建具有专业完成度的应用程序。

为了这个目的,Unity 由一系列旨在简化设计游戏的不同方面的任务(包括图形、物理、动画和人工智能)的工具包组成。Unity 是一个独特的开发系统,它专注于资产而不是像其他类似的 3D 建模应用程序那样关注代码。游戏内容是从编辑器构建的,游戏则是使用 C# 脚本语言编写的。

Unity 还包括一个地形编辑器,你可以在这里使用可视化工具、绘画或纹理创建地形(例如空白纸张),还可以添加从 3D 应用程序(如 Blender、3ds Max 和 Maya)导入的其他元素。

Unity 在市场上迅速增长,并因其某些特性而被公司和专业人士采用,这些特性使 Unity 在其他游戏引擎中脱颖而出:

  • Unity 是一个多平台工具,允许我们为多个平台发布 2D 和 3D 内容,例如 Windows、OS X、GNU/Linux、Flash、Xbox One、PS4、Nintendo Switch、Android 和 iOS,包括基于 Web 图形库(WebGL)技术的网络游戏(这是一个在任何网络浏览器中渲染 3D 图形的标准规范)。

  • Unity 为学习和独立开发者提供了一套完整的免费许可证,以及根据开发者公司业务量不同而具有不同可扩展定价计划的许可证。

  • Unity 是最受欢迎的 AR 和 虚拟现实(VR)开发引擎之一,从早期就支持行业发展。市场上三分之二以上的 AR 和 VR 应用都是使用 Unity 开发的。

  • Unity 是一个可扩展的环境,可以通过我们自己的或第三方插件进行扩展,并且以可扩展的方式随着新元素和功能的发展而增长,这些元素和功能并非它最初创建时设计的。

  • Unity 提供了一个门户,我们可以用它来购买和销售各种免费和付费的扩展和资源,称为 Asset Store。这个门户不仅对开发者有用,还让商业市场能够创建特定的公司,这些公司的商业模式是创建工具和内容,以便他们可以在这个在线商店中销售自己的资源。

  • Unity 集成了额外的服务,其中大部分是免费的,使我们能够在不同的视频游戏世界的商业模式中产生利润。例如,这些服务包括 Unity Ads,允许您添加广告;Unity Analytics,提供有关用户互动的信息;以及 Unity Networking,为在线游戏开发提供基础设施。

现在我们已经了解了 Unity 是什么以及它的众多特性,我们可以开始准备我们的系统,以便安装必要的软件。

为 Unity 准备您的系统

在这本书中,我们将使用 Unity 来开发 Android 移动应用程序。为了创建 Android 应用程序,我们需要安装Java 开发工具包(JDK)和 Android软件开发工具包(SDK)。

正如我们在技术要求部分提到的,如果我们在一个运行 macOS 计算机上的 Xcode 上运行 Unity,我们可以轻松地运行相同的项目用于 iOS。

由于 Unity 直接提供 Android SDK 安装,我们将首先安装 JDK,然后继续在我们的计算机上安装 Unity。

安装 Java 开发工具包(JDK)

要安装 JDK,请按照以下步骤操作:

  1. 访问 Oracle 的下载页面www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/2c0b5b86-d70d-4629-93ae-76dac2503b66.png

  1. 确保您接受 Java SE 的二进制代码许可协议。

  2. 选择最新的 Java SE 开发工具包(在我们的例子中,这是 Java SE 开发工具包 8u201)。

  3. 下载后,运行安装文件,并让它将 JDK 和 JRE 安装到默认文件夹中。

从 Unity 2019.2 版本开始,Unity 安装允许您在 Android 构建支持选项中安装 OpenJDK(请参阅安装 Unity部分)。

现在您已经安装了 JDK,让我们安装 Unity。

安装 Unity

我们将使用 Unity Hub 安装 Unity,这是一个允许我们在计算机上安装和管理不同版本的 Unity 的工具。您可以从unity3d.com/get-unity/download下载 Unity Hub。

按照以下步骤安装 Unity:

  1. 下载并安装 Unity Hub。

  2. 运行 Unity Hub。第一次运行时,它会通知您缺少许可证,如下面的截图所示。点击管理许可证:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/38999e46-c876-4c95-8cc5-ccfdce0dcd6e.png

无有效许可证信息

  1. 在许可窗口中,将出现另一条消息,要求你登录以添加许可。点击登录:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/2b7fe249-3f43-4c01-82b5-a67705c331b9.png

许可窗口中的登录消息

  1. 将会出现一个弹出窗口,要求你输入电子邮件和密码。如果你没有账户,你可以通过点击创建一个账户来创建一个账户。你也可以使用谷歌或 Facebook 登录:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/529e6efd-efbf-4785-ad5f-913d535fb3e7.png

登录 Unity

  1. 现在,选择一个许可选项,然后点击完成。(如果你符合要求,可以使用个人许可免费使用 Unity。如果不满足条件,你必须在他们的网页上购买 Unity Plus 或 Pro (store.unity.com)。)

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/4d4fc4ce-c83b-48f0-afec-ac75b66b88fc.png

选择产品的许可

  1. 现在,返回,点击安装选项卡,然后点击添加以添加新的 Unity 安装:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/05740b8d-08c1-4d17-9eeb-f139fb051600.png

添加新的 Unity 版本

  1. 在出现的弹出窗口中,选择你想要安装的 Unity 版本和要添加的模块。在我们的例子中,我们使用的是 2019.1.2f1 版本,我们将安装 Microsoft Visual Studio Community 2017 进行编码和 Android 构建支持,以及 Android SDK & NDK Tools 进行 Android 开发,如下面的截图所示:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/804e5691-6344-424b-b310-0f0929ca8004.png

选择 Unity 版本和模块

Unity Hub 总是显示每个版本的最新编译版本。如果你想安装特定版本,例如我们在这里使用的版本,你可以在 Unity 存档中找到它并通过 Hub 安装:unity3d.com/es/get-unity/download/archive。

从 Unity 2019.2 版本开始,在 Android 构建支持下出现了一个新选项,可以直接安装 OpenJDK。

  1. 如果你计划使用 Vuforia 进行开发,正如我们在第六章 AR for Retail with Vuforia 和第七章 AR for Automation with Vuforia and Epson Glasses 中将要做的,请检查以下截图中的 Vuforia 增强现实支持选项。然后,点击下一步并完成安装:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/016351da-2e4f-4e6d-8c47-02ad079a30f0.png

选择 Vuforia 增强现实支持

Unity 的最新版本可能并不总是支持 Vuforia。如果你在列表中没有看到 Vuforia,不要慌张!这是因为最新的 Unity 版本还没有支持它,你应该安装一个支持 Vuforia 的旧版本。

  1. 安装完成后,你将被送回到安装窗口,在那里你会看到新版本和已安装的模块,如下面的截图所示:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/1795e381-3742-4536-9c47-c9be6a3779df.png

新 Unity 版本的安装窗口

  1. 如果在安装过程中你忘记添加一个模块或者你想稍后添加,你只需点击右上角的三点按钮,然后选择添加模块,如下所示:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/17152331-a8b5-4f1a-bccd-8387531d06e2.png

安装完成后添加新模块

  1. 现在,点击“项目”标签页。在这里,我们将通过点击 NEW 按钮来创建一个新的项目,如下所示:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/4ac2cd94-5b5f-4b96-8087-df4b029b3a06.png

创建新项目

  1. 我们将创建一个 3D 项目(已经选中)。在设置面板中,给项目命名并设置位置,如下面的截图所示。然后,点击 CREATE:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/a19d7f32-8410-4ada-99f8-ff6ba7684f1d.png

设置新的 Unity 项目

  1. 现在,Unity 将打开新项目,你可以开始使用它。如果你关闭 Unity 窗口,你可以通过从 Unity Hub 的项目窗口中选择它来重新打开项目,如下面的截图所示:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/896665ec-471a-4323-ba47-ff2a87680448.png

新项目出现在项目窗口中

就这样。现在,你已经将 Unity 安装到你的电脑上,你的第一个项目已经打开,你可以开始使用它了。在下一节中,我们将提供 Unity 界面的导游,以便了解 Unity 提供的可能性以及如何使用每个工具。

理解 Unity 界面

第一次打开 Unity 编辑器时,你会看到一个带有不同栏和窗口的布局,类似于以下截图所示:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/861f49c8-a515-45ea-969e-b45f38304c1a.png

初始 Unity 布局

初看之下,Unity 的配置略带 3D 建模工具的感觉,中间是 3D 场景,尽管它比建模工具多了几个面板。如果你不熟悉 3D 工具,可能会觉得理解所有内容有些令人畏惧,但 Unity 的界面相当直观,并且在 Unity 各个版本中保持得很一致。前一个截图中所看到的主要组件如下(从左上角到右下角):

  • 工具栏:在这里,我们有主要的按钮,以便我们可以在场景视图中操作对象以测试场景。

  • 层次结构窗口:层次结构窗口按层次顺序显示场景视图中的元素。

  • 场景视图、游戏视图和资产商店窗口:这三个标签页有不同的用途。场景视图显示 3D 场景中的所有元素。游戏视图从摄像机的视角显示场景构建后的样子。资产商店窗口可以用来从 Unity 商店下载包和资产,以便我们可以将它们包含在我们的项目中。

  • 检查器窗口:当在层次结构窗口或场景视图中选择一个元素时,其特性和组件将显示在这个窗口中。

  • 项目窗口和控制台窗口:前者显示项目中所有目录和文件,我们可以(或不能)在场景中使用,而后者显示日志消息。

现在,我们将详细探讨每个组件,并学习如何根据我们的需求和喜好更改此布局。

工具栏

此工具栏固定在屏幕上,使我们能够访问 Unity 的主要功能。它分为三个部分:用于操作场景中对象的工具、游戏视图控件以及一组按钮,用于访问 Unity 服务和管理图层和 UI 布局:

在左侧,我们可以看到我们可以用来操作场景视图及其上对象的工具。以下是这些工具:

  • 手动工具

  • 移动工具

  • 旋转工具

  • 缩放工具

  • 矩形工具

  • 组合工具

  • 中心/旋转点按钮

  • 本地/全局按钮:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/003cf082-0bae-4a75-ab1d-d516b35cb702.png

工具栏左侧的按钮

让我们逐一查看这些工具:

您可以通过按鼠标滚轮并拖动来随时使用移动功能。您还可以使用鼠标滚轮进行缩放和缩小。

  • 移动工具:当选择此按钮时,您可以通过拖动相应的箭头将场景中的对象移动到三个轴上。您还可以拖动出现在箭头交点上的小正方形,将对象移动到平面(两个轴)而不是单个轴上:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/f7ad758b-282f-447d-92a6-37e2b06f3ae6.png

移动 3D 元素

  • 旋转工具:当选择此按钮时,您可以通过拖动相应的圆圈在三个轴上旋转场景中的对象:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/d967dfeb-1ddf-470d-8db8-9ab9f4917f3d.png

旋转 3D 元素

  • 缩放工具:当选择此按钮时,您可以通过拖动相应的箭头(以小立方体结束)在三个轴上缩放场景中的对象。您还可以拖动中心立方体以在三个轴上均匀缩放对象:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/37445d6f-a285-4edf-8410-1973145fb90f.png

缩放 3D 元素

  • 矩形工具:我们之前看到的工具被认为是用来操作 3D 模型的。然而,矩形工具专门用于场景中的用户界面(UI)元素,并且它在二维空间中工作。在以下屏幕截图中,我们正在操作一个按钮:

    • 您可以通过拖动来移动 UI 元素:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/bb2b80cd-6b3d-4096-9ea7-09a683413f48.png

移动 UI 元素

    • 要旋转一个元素,将鼠标悬停在角落直到出现旋转图标。然后,点击并拖动:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/682b7ef5-d76b-4dcb-a9ba-d09ae27b57fc.png

旋转 UI 元素

    • 您可以通过从角落拖动来缩放元素:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/ef910298-671b-4204-ba52-1693b78692b8.png

缩放 UI 元素

  • 组合移动、旋转和缩放工具:此按钮组合了移动、旋转和缩放选项:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/6a69bd42-6ffb-4a68-b509-ed59d1ccb653.png

所有引导线一起出现以操纵对象

  • 中心/轴点按钮:当选择中心时,平移、旋转和缩放操作将从对象的中心点执行。在以下截图中,相机和方向光被选中,引导线出现在结果组的中心点。在这种情况下,相机和灯光将围绕该中心点旋转:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/eaab95bf-7fe9-45ce-a2e6-b402c3e551b6.png

中心选项已激活

当选择轴点时,操作将从每个轴点执行。在这种情况下,相机和灯光将围绕各自的轴点旋转:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/2d6f798a-0705-4f1d-818b-b8235fec4481.png

轴点选项已激活

  • 本地/全局按钮:当选择本地时,平移、旋转和缩放操作将相对于所选对象的起点执行。在以下截图中,灯光被旋转,其坐标系也相应旋转:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/6c32b3e7-e18a-4dc1-af9b-edae04f4537c.png

本地选项已选择

当选择全局时,操作将相对于世界原点执行:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/25f29a57-118c-4e71-8010-51a308df3348.png

全局选项已选择

在工具栏的中心,我们有播放、暂停和步进按钮,我们可以使用它们来控制游戏视图:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/3e017b64-7603-4ff4-8ea8-c112f3fe726c.png

中心位置的按钮

在右侧,我们有几个按钮,我们可以使用它们来访问 Unity 协作服务、Unity 云服务(云图标)、我们的 Unity 账户、图层可见性菜单和布局菜单。我们将在本节后面使用布局菜单来为我们的项目创建自定义布局:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/898876aa-bde3-4081-a956-4a34caa7b5f8.png

右侧的按钮

现在我们已经看到了工具栏的功能,让我们看看场景视图。

场景视图

场景视图是您将与当前场景以及您在上面创建的 3D 世界交互的窗口。在这里,您将拥有构成场景的所有内容,您将能够使用工具栏上的命令直观地操纵它们。使用此视图,我们可以导航整个场景,从所有角度查看它,以便我们可以放置 3D 对象并确保它们处于正确的位置。在此视图中,我们还可以操纵 UI 元素。在这个窗口中,我们想要讨论的主要元素是 Gizmo,它位于窗口的右上角。

Gizmo:您可以使用 Gizmo 快速更改视图(顶部、底部、右侧、左侧、前视图、后视图)并在透视和等距(正交)模式之间切换。在更改视图时,Gizmo 中的x、y和z箭头将指向每个轴的方向:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/0f4cb8dc-8d77-486c-8262-ec1c7894f848.png

前视图、顶视图和右视图上具有不同箭头的 Gizmo

视图名称左侧的小图标显示它是一个透视或等距(正交)视图,如下面的屏幕截图所示。您可以通过单击小图标在它们之间切换:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/9fbe05e7-32e2-4cd3-8a97-0b3f445af330.png

透视和等距(正交)视图允许我们调整场景中的对象

现在,让我们来看看层级窗口以及它是如何工作的。

层级窗口

这个窗口是场景视图中元素的分层视图,这些元素通过它们的名称来表示。在顶部,我们始终会有场景,并且我们添加到场景中的所有对象都将悬挂在它上面。在下面的屏幕截图中,我们有不同的元素,其中一些元素(立方体、画布)包含更多的元素。

分层视图使我们能够轻松找到元素及其之间的关系(父子关系),这些关系会影响它们的行为方式。例如,如果我们移动立方体元素,它的子对象 ChildOfCube 将随之一同移动。然而,如果我们只想移动 ChildOfCube 元素,我们会在层级窗口中选择它并移动它,而不会影响其父对象立方体。在上一节中我们解释的局部/全局定位方面,子对象的局部位置、旋转和缩放将相对于父对象:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/627652ab-0521-45f1-a404-a432533525cb.png

在层级窗口和场景视图中选中的立方体对象

我们还将使用此窗口通过右键单击并选择我们想要添加到场景中的元素来快速添加新元素。

另一方面,可以通过在场景视图中或层级窗口中单击对象来选择场景中的对象。当对象有多个子对象时,后者非常有用,因为我们可以确保我们选择了正确的元素。在场景视图中,它们可能会重叠。

一个小技巧:在层级窗口中双击对象的名称可以使场景缩放到该对象。

场景视图和层级窗口是我们可以使用来操作场景中元素的两个窗口,即我们将构建到我们的设备中的元素。现在,我们将学习当场景中的一个元素被选中时,检查器窗口是如何工作的。

检查器窗口

此窗口显示当前选中对象的属性和组件。从这里,你可以编辑、删除和向对象添加新组件。由于场景中的不同对象将具有不同的属性,检查器窗口将相应地改变,以在每个时刻显示对应的信息。此窗口可以在以下屏幕截图中看到:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/7ce79143-5eca-4f7f-ae2f-0e7ffd5a95d3.png

主摄像机和立方体的两个不同的检查器窗口

如前一个屏幕截图所示,场景中的每个元素都将有一个变换组件,以便它可以移动、旋转和缩放场景中的该元素。然而,除了这个之外,图像中的主摄像机和立方体元素没有更多共同的组件。对于摄像机来说,它有一个预期的摄像机组件,而立方体有一个网格、一个渲染器(用于可视化对象)和一个标记该对象物理边界的碰撞器。

检查器窗口中的组件可以被最大化或最小化,这样我们就可以组织视图。这样,如果我们有一个 GameObject 中有许多组件,我们只看到在每一时刻所需的那些。为此,我们可以使用每个组件旁边的小箭头,如以下屏幕截图所示,其中相同的 Main Camera 已将其组件折叠:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/bee35c56-559e-40e8-92fb-e8d3f2a7c2d2.png

主摄像机及其组件已折叠

现在,让我们看看项目窗口是如何工作的。

项目窗口

此窗口显示了项目中所有可用的资产。当你将新资产导入到项目中时,它将出现在此窗口上,从这里,你可以将其拖动到你的场景中。这是一个层次视图,文件按文件夹组织:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/5187e2f4-64ce-4ba5-b9eb-1a45def43d17.png

显示资产文件夹中主要文件夹的项目窗口

重要! 在构建应用程序时,并非项目窗口中出现的每个资产都会被构建进去。除了一些特殊文件夹,可以在以下位置找到:docs.unity3d.com/Manual/SpecialFolders.html。只有当资产与场景连接时(直接出现在场景上、通过脚本调用等),它们才会被包含在最终的包中。

现在,我们将看看游戏视图,正如我们在本节开头提到的,它位于场景视图旁边的标签中。

游戏视图

此窗口显示了场景是如何由你世界中的摄像机(们)渲染的。你可以使用工具栏中的播放、暂停和步进按钮来播放你的场景,并查看发布后的外观:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/df18ffee-8f46-4628-97d1-b1a10968b72a.png

从主摄像机对象的视角看,按钮和立方体对象

**重要!**在播放模式下所做的任何更改都是临时的,并且将在您再次点击播放按钮退出此模式时消失。当您想尝试不同的方法(例如,对象旋转或颜色)以选择适合您的方法时,这很有用,但请确保您没有丢失重要的工作,因为您忘记关闭播放模式了!

此窗口旁边的标签是资产商店窗口。让我们看看。

资产商店窗口

此窗口连接到 Unity 资产商店,这是开发者和设计师上传他们的资产的地方。您可以从此窗口下载并导入资产商店中的任何资产到您的项目中:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/e3362a62-1296-4456-a567-4d743168d462.png

Unity 中的资产商店窗口

资产商店提供免费和付费内容,如 2D 和 3D 模型和场景、音频文件、模板、完整项目等,您可以直接将这些资产下载并导入到您的项目中。所有这些资产都使创建项目的过程更加容易和快速。

最后但同样重要的是,让我们学习控制台窗口的工作原理及其用途。

控制台窗口

在这里,您可以找到您项目的日志。此窗口显示有关项目的警告、错误和信息日志,如下面的截图所示。如果您在调试错误代码时遇到困难,Unity 论坛([forum.unity.com/](https://forum.unity.com/))是一个非常有用的工具,您可以搜索类似案例并寻求帮助:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/26802d2a-1fef-41bb-883f-b848e9e39816.png

显示不同类型信息、警告消息和错误的控制台窗口

本窗口的主要元素及其功能如下:

  • 清除按钮移除所有消息(除了编译错误)。您必须在更改当前场景或播放它之前纠正这些错误。

  • 您可以使用折叠功能将相同的消息合并成一条消息行。

  • 使用“在播放时清除”来删除您在工具栏上点击播放按钮时产生的所有消息。

  • 错误暂停允许在发生错误时暂停场景的执行。

  • 使用右侧的三个按钮来显示/隐藏不同类型的消息(信息、警告和错误)。

到目前为止,你应该已经对 Unity 界面的工作方式有了相当的了解。然而,在继续之前,我们将学习如何更改布局配置。根据我们的需求和喜好自定义各种窗口既简单又实用。

更改布局

现在我们已经了解了主要窗口及其功能,我们将首先做的是调整这些窗口在屏幕上的布局,以便它们符合我们项目的需求。对于这本书,我们将使用 2 比 3 布局的修改版,这将允许我们同时看到 AR 场景和游戏。然而,一旦你熟悉了 Unity 的使用,你可以自由选择最适合你的布局。

对于修改后的版本,请按照以下步骤操作:

  1. 首先,在工具栏右上角的下拉菜单中选择 2 比 3 布局,就在检查器窗口上方:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/4e2df74b-4596-4827-bc5e-92b3b3627aa7.png

在布局下拉菜单中选择 2 比 3

  1. 然后,拖动项目窗口,使其位于层次窗口下方:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/a5a3fa37-2de5-426b-b679-d28b9bd3bcfe.png

将项目窗口拖动到层次窗口下方

  1. 通过将底部的滚动条拖到最左边来选择项目窗口上的列表视图:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/d8059468-7320-4650-95d0-aaf9d96b71c2.png

将水平滚动条移到左边

  1. 创建一个名为 1280 x 720 的新游戏视图纵横比,并插入以下值:宽度:1280,高度:720:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/0c5cf391-80ea-4266-813f-b40ddf7492ba.png

创建新的纵横比

  1. 打开控制台窗口,按 Ctrl + Shift + C 或 Window|General|Console,并将其拖动到游戏视图旁边的标签页:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/f688d09d-bff7-47e4-b8cd-ee459a985d90.png

将控制台窗口拖到游戏视图旁边

  1. 最后,为了确保每次打开 Unity 时此布局都可用,请转到布局,选择保存布局…,并给它命名:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/c3654394-5e84-4152-a814-13cb3d7a7221.png

保存创建的布局

现在,我们已经准备好了布局,可以在我们的 AR 项目中使用。到目前为止,你应该已经熟悉了 Unity 提供的不同窗口和工具以及它们的工作方式。在下一节中,我们将查看在 Unity 项目中可以找到的主要元素。

Unity 的主要元素

在 Unity 中构建的应用程序将由一个项目组成。该项目将包含我们开发应用程序所需的所有必要元素,例如模型、脚本、计划、菜单等等。当你启动 Unity 时,你可以通过指向其根文件夹来打开一个项目。

每个项目包含一个或多个文档,称为场景。在 Unity 中创建的项目被组织成场景,其中场景可以是项目的任何部分。当我们谈论应用程序时,场景可以是开始菜单到任何级别或区域。单个场景将包含许多元素,例如用户界面、3D 对象、脚本等。

你可以在 Unity 项目中找到的一些主要元素如下:

  • 资产

  • 游戏对象

  • 组件

  • 脚本

  • 预制体

首先,我们将查看资产。

资产

Unity 将用于创建项目的文件称为资产。它们是 Unity 项目中的构建块,可以是图像文件、3D 模型、声音文件、代码文件等形式。Unity 中的资产,如材质、纹理、动画或脚本,可以通过在顶部菜单栏中点击 Assets|Create,或者在项目窗口中的文件夹上右键单击并选择 Create 来在项目中创建。

当我们处理外部资产时,例如从互联网下载的图像或我们设计的 3D 模型,我们可以通过将它们从外部文件夹(例如,从 Windows 资源管理器中的一个文件夹)拖动到项目窗口中的一个文件夹,或者在项目窗口中的文件夹上右键单击并选择 Import New Asset…,将它们添加到项目中。

使用以下方法之一将来自您计算机相册的两个图像添加到项目的Assets文件夹中(我们现在将使用一个,稍后使用另一个),如图所示:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/09079c31-f747-4b0f-84d1-d678f03e7200.png

向项目中添加图像

另一种导入资产的方法是通过 Import-Package 导入包含多个资产的整个包。这个选项可以在菜单栏的 Assets 菜单中找到,或者在项目视图中右键单击。

要从项目中删除资产,右键单击它并按 Delete。重要的是要注意,一旦从项目中删除了资产,就无法再恢复它。

现在,让我们看看什么是 GameObject。

GameObjects

当一个资产在场景中使用时,它就变成了一个 GameObject。可以通过在顶部菜单栏中点击 GameObject,或者在场景视图或层次结构窗口中右键单击来将 GameObject 添加到场景中。

使用以下方法之一将 3D Object|Cube 添加到场景中,并将其移动到主摄像机前面,在游戏视图中可见:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/27af82d7-569c-42a4-80c4-59fb49476a1a.png

在层次结构窗口中创建一个立方体

现在,让我们谈谈组件。

组件

组件有不同的形式,它们负责为 GameObject 添加功能。它们可以用来创建行为(例如,脚本),定义 GameObject 的外观(例如,渲染器),并影响项目中对象功能的其他方面。

所有的 GameObject 都至少包含一个组件。我们从 Transform 组件开始。这个组件负责告诉 Unity 引擎一个对象的位置、旋转和缩放。其他常见的组件元素包括 Renderer 和 Collider。我们将在本书接下来的章节中探讨它们的使用。

通过选择对象然后点击菜单栏上的 Component 菜单,或者在检查器窗口上点击 Add Component 按钮,将组件添加到 GameObject 中。

组件也可以从项目窗口拖动到游戏对象(例如,您可以从项目窗口将脚本拖动到场景视图中的立方体上,脚本将自动出现在检查器窗口中)。

将之前添加到项目窗口中的其中一个图像拖动到场景视图的立方体中,将其转换为纹理:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/951ea1fb-f939-45c9-b9f0-d32882129ca6.png

以图像作为纹理的场景中的立方体

现在我们已经了解了项目中的可见元素,让我们来谈谈不可见的元素:脚本。

预制体

预制体是具有自定义属性和组件的游戏对象(例如,添加了脚本来使其闪烁的光源),您可以将它们存储在项目窗口中,以便在不同的场景/时刻中重复使用。它们可以在任何时间(包括运行时)创建或复制,并且每当您更改原始预制体的属性时,除非另有定义,否则所有实例都将自动更新。

脚本

脚本,实际上是一种组件,是 Unity 不可或缺的一部分,因为它们定义了项目中不同元素的行为。您可以像操作其他组件一样操作(添加/编辑/删除)脚本。

右键单击项目窗口,然后按 Create|C# Script 创建一个新的脚本并给它命名(例如,CubeHandler.cs):

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/2f324d1b-bc14-4717-bbab-9dfc83992cb4.png

创建一个新的脚本

在检查器窗口中,您会看到新创建的脚本中包含一些默认代码。我们将在下一节中讨论此代码。现在我们已经了解了 Unity 的不同元素,让我们在下一节学习如何编写脚本。

脚本编写 – C#中的第一个示例

为了了解 Unity 中脚本的所有潜力,我们将查看上一节中创建的脚本CubeHandler.cs。正如其名称所暗示的,我们将向其中添加一些代码来操作场景中的立方体。

双击项目窗口中脚本的名称,在 Visual Studio 中打开它。

如果您在安装 Unity 之前已经在计算机上安装了 Visual Studio,那么在双击脚本时,Unity 可能不会自动检测它。如果是这样,您将不得不转到 Edit|Preferences 并转到外部工具。从那里,选择 Visual Studio .exe 文件的路径:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/3be1bccb-d3e3-45ea-9049-e150c29f6fb8.png

已将 Visual Studio 分配为外部脚本编辑器的首选项窗口

打开脚本后,您将看到以下自动生成的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeHandler : MonoBehaviour
{
 // Start is called before the first frame update
 void Start()
 {

 }

 // Update is called once per frame
 void Update()
 {

 }
}

前三行是调用三个引用。前两个是常用集合,而第三个是我们需要的工作与 Unity 引擎的引用。

然后,你有类声明。类的名称必须与.cs脚本相同。默认情况下,通过 Unity 生成的类将继承自MonoBehaviour,这允许我们使用以下两个方法:

  • Start方法会在 Unity 场景生成后立即自动调用,并在第一帧更新之前。因此,当初始化变量时,这个方法很有用。

  • Update方法在每个帧上被调用一次,这意味着该方法内的代码将被重复执行。

让我们尝试添加一些代码来控制场景中的立方体:

  1. 首先,我们将在类声明之后、Start方法之前声明一个名为speed的变量:
private float speed;
  1. 然后,我们将在Start方法中初始化speed的值:
void Start()
{
    speed = 0.5f;
}
  1. 最后,我们将在Update方法中使用这个变量来告诉立方体以一定的速度旋转:
void Update()
{
     transform.Rotate(Vector3.up * speed);
}

这最后一行访问当前 GameObject 元素的transform组件,该组件负责其位置、旋转和缩放。我们告诉transform组件,我们想要以我们之前设置的速度在垂直轴(Vector3.up)上旋转对象。

  1. 仅凭脚本本身不会做任何事情,因为它不知道我们指的是哪个对象的transform。为了告诉脚本我们想要操作场景中的哪些对象,请回到 Unity 编辑器并将脚本拖放到立方体上。确保它在检查器窗口中作为其组件之一出现。这样,我们就告诉脚本我们想要旋转的是立方体。完整的代码应该如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeHandler : MonoBehaviour
{
    private float speed;
    public Texture2D texture;

    // Start is called before the first frame update
    void Start()
    {
        speed = 0.5f;
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(Vector3.up * speed);
    }
}
  1. 现在,如果你在工具栏上按下播放按钮,游戏视图将显示立方体旋转:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/b2a5ce0d-b383-4aa4-ae77-66004f4d0ea1.png

当播放场景时,立方体将开始旋转

  1. 再次按播放按钮以停止模拟。尝试更改speed的值,看看它如何影响立方体的旋转速度。

transform组件有点特殊,因为它有自己的名称。要访问任何其他组件,我们需要使用GetComponent<ComponentName>()函数。例如,如果我们想更改立方体的纹理(我们之前拖入的图像),我们可以使用这个函数。负责材质和纹理的组件是Renderer。让我们将以下代码包含到我们的脚本中:

  1. 首先,在速度定义下方添加以下代码行,它声明了一个Texture2D类型的变量:
public Texture2D texture;
  1. 现在,将以下两行代码添加到Update方法中,该方法位于转换行下方:
if (Input.GetKeyDown(KeyCode.A))
 GetComponent<Renderer>().material.mainTexture = texture; 

在这里,我们说的是,如果系统检测到A键被按下,对象的Renderer组件的纹理将更改为新的纹理。正如你所见,在这种情况下,我们并没有在Start方法中初始化纹理。相反,我们将其设置为public,并将在 Unity 内部对其进行赋值。

  1. 返回 Unity 编辑器。你将看到在检查器窗口中脚本组件中已添加了一条新行。要将其他图像分配给它,你可以从项目窗口拖动它,或者点击右侧的圆圈并从项目中选择它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/454f3260-a5d7-4e4c-bbcc-9619e2d1dc4d.png

立方体的最后一个组件是带有新行以选择纹理的脚本

  1. 现在,再次按下播放。当立方体旋转时,按下A键。你将看到立方体的纹理如何变化:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/dbb0a14f-e843-4c88-98be-63dad572bd49.png

按下键盘上的 A 键以查看立方体的纹理变化

现在,你已经了解了 Unity 项目背后的所有逻辑,并具备了创建更复杂脚本的基礎。在接下来的章节中,我们将使用脚本来实现诸如在 AR 中显示元素或通过用户界面与用户交互等目的。

摘要

在本章中,我们学习了如何安装 Unity 以及使其工作的必要模块,以便我们可以构建移动应用程序。我们还介绍了 Unity 界面的设计,其主要窗口,以及如何根据我们的需求自定义它们的组成。我们查看了一些主要窗口、它们的工具以及如何使用它们。然后,我们学习了在 Unity 项目中可以找到的主要元素以及如何创建/导入它们。最后,我们通过几行代码创建了我们第一个脚本,以了解我们如何轻松地控制和更改场景中的对象。

在下一章及随后的章节中,我们将使用本章所学的所有元素来生成功能齐全的 AR 项目。

第三章:使用 ARCore 进行 AR 制造

在本章中,我们将使用 Google 的 ARCore 工具创建我们的第一个 AR 项目。本章的主要目标是向您介绍最新且增长最快的 AR 工具之一,ARCore。到本章结束时,您将掌握在 Android Studio 中轻松创建自己的 ARCore 项目的必要技能。同时,我们展示了 AR 在制造中的一个应用,即原型设计。

到本章结束时,您将创建一个原型查看器应用程序,用户可以在平面上放置工业部件、机器等 3D 设计,在它们周围和内部导航,并使用手指进行操作(移动、旋转和缩放)。有了这些知识,您还将能够改进当前项目,并适应该领域的需求。

本章将涵盖以下主题:

  • 使用 AR 进行制造

  • 探索 ARCore

  • 创建原型 AR 查看器

技术要求

本章的技术要求如下:

  • Android Studio(本书中为 Windows 的 3.5.2 版本)。

  • Java 开发工具包(本书中为 1.8.0 版本)。

  • Sceneform 插件(从 Android Studio 内部安装。本书中为 1.13.0 版本)。

  • 支持 ARCore 的移动设备(请参阅此处列表:developers.google.com/ar/discover/supported-devices)。该项目已在三星 Galaxy A5(2017)和 Pocophone F1 上进行了测试。

要安装 Android Studio,Windows 的系统要求如下:

  • 最小 RAM 4 GB,建议 8 GB

  • 最小可用磁盘空间 2 GB,建议 4 GB

  • 最小屏幕分辨率 1280x800

关于其他操作系统的更多详细信息,您可以在本页末尾找到官方要求:developer.android.com/studio。

本章的代码文件可以在此处找到:github.com/PacktPublishing/Enterprise-Augmented-Reality-Projects/tree/master/Chapter03。

使用 AR 进行制造

工业 4.0,也称为第四次工业革命,指的是在工厂内包含数字化和互联工具,涵盖生产过程到维护和培训。尽管这个术语已经存在多年,但在过去几年里,由于增强现实(AR)、虚拟现实(VR)、物联网(IoT)、大数据分析(BDA)、增材制造(AM)、网络物理系统(CPS)和人工智能(AI)等技术的指数级增长(在质量和数量上),这个工业 4.0 概念已经获得了新的维度。

AR 的视觉组件使其成为用户自然的接口,用户可以通过移动设备或智能眼镜接收有关流程的实时信息,访问远程系统以获取额外数据,并控制流程和机器。

在制造业中,AR 有许多用途,例如原型设计、生产和培训。在本章中,我们将介绍原型设计,特别是 AR 如何通过在真实世界中可视化设计来帮助减少原型设计成本。这允许设计师、工人和潜在客户在三维空间中操纵模型,对其进行缩放,与单个部件交互,甚至一起穿越它们。ARCore 是我们可以用作该目的的 AR 工具之一。

探索 ARCore

自 2017 年开始预览,ARCore 的第一个版本于 2018 年 2 月发布,它是谷歌为 Android 和 iOS 创建增强现实应用程序的平台。它利用不同的功能,如运动跟踪,来估计移动设备相对于真实世界的位置和方向,以及环境定位,以找到和跟踪水平表面,如地面、平板电脑或墙壁,以及光估计,以将 3D 元素真实地放置到真实世界中。这些功能的更详细解释可以在developers.google.com/ar/discover/concepts找到。针对 Android 7.0 及以上版本,市场上并非所有设备都支持这项技术,尽管自第一个 SDK 版本以来,支持的数量已经大幅增加。您可以通过此处查看当前支持的设备列表:developers.google.com/ar/discover/supported-devices。

ARCore 应用程序可以在不同的平台上开发,例如 Android Studio、iOS 的 Xcode、Unity3D 和 Unreal Engine。当使用 Android Studio 时,开发者可以将 Sceneform 集成,这是一个 3D 引擎,它可以帮助以比 OpenGL 库更简单的方式集成 3D 环境和模型。我们将在项目中使用这个插件来显示 3D 模型。

当使用 ARCore 开发应用程序时,请确保在您的应用程序中披露:developers.google.com/ar/distribute/privacy-requirements。

对于这个项目,我们将开发一个原型查看应用程序,该应用程序将展示三种不同的引擎模型。我们将在项目中使用的引擎模型是从sketchfab.com/3d-models/rocket-engines-6fba4dbbb9444e99ba68425bcb3a7f70获取的。

既然我们已经了解了 ARCore 的基础知识,让我们开始开发应用程序。

创建原型 AR 查看器

在本节中,我们将开发我们的 AR 查看器以进行原型设计。首先,我们将安装所有必需的软件工具——JDK 和 Android Studio——然后我们将创建我们的 Android 应用程序,学习如何在其中启用和使用 ARCore,以及如何使用 Sceneform 插件来显示 3D 元素。

安装 Java 开发工具包 (JDK)

Android Studio 需要我们安装 JDK。它通常位于 C:\Program Files\Java\jdk_version。如果您还没有安装,请按照以下步骤操作:

  1. 访问 www.oracle.com 并下载最新的 Java SE 开发工具包。

  2. 下载完成后,运行安装文件,并让它在其默认文件夹中安装 JDK 和 JRE。

如果在 Android Studio 安装过程中它抱怨找不到 JDK,您可以通过转到开始菜单|计算机|系统属性|高级系统属性,打开高级|环境变量选项卡,并创建一个指向 JDK 文件的 JAVA_HOME 系统变量来解决此问题。

安装 Android Studio

一旦 JDK 安装完成,我们也将对 Android Studio 进行相同的操作,因为它是我们开发 AR 应用的主要平台:

  1. 从 Android 开发者页面下载 Android Studio:developer.android.com/studio。

  2. 使用默认值安装工作室,完成后运行它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/dccd2716-4de1-42c2-a482-5fc641eb5408.png

安装完成后启动 Android Studio

  1. 安装后首次打开它时,Android Studio 设置向导将启动,以帮助您配置工作室的最后几步并下载 Android SDK 组件:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/a9aeb208-996e-44bd-999b-8c1e8a1abaf0.png

安装 Android Studio 首次运行时会出现设置向导

  1. 一旦完成,欢迎窗口将会启动:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/e3b800d1-fcdb-4c3e-a672-d6d70ad8843e.png

Android Studio 欢迎窗口

现在我们已经准备好了软件,我们可以开始开发我们的应用程序。

创建应用程序

现在我们已经安装了软件,我们将开始创建我们的 AR 应用。我们首先要做的是启动一个新的 Android Studio 项目,并向其中添加所需的库。按照以下步骤操作:

  1. 点击“开始一个新的 Android Studio 项目”。

  2. 选择创建一个空活动:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/7388c166-3608-46fc-8db5-514f5c76921e.png

选择活动类型

  1. 给项目命名、包名和位置。将最小 API 级别设置为至少 API 24:Android 7.0 (Nougat),因为它是第一个支持 ARCore 的版本。点击完成按钮以启动项目:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/b0db9ea2-4afd-4e9e-a30f-5e44b9530eae.png

新项目的配置参数

下一步我们需要做的是在我们的项目中启用 ARCore。

启用 ARCore

在 AR 项目中,ARCore 可以设置为可选或必需。前者可以在不支持 ARCore 的设备上作为普通应用运行,而后者将只出现在支持 ARCore 的设备的 Google Play 商店中。我们的应用是一个完整的 AR 应用,因此我们将选择第二个选项。为了实现这一点,我们需要修改一些项目文件。让我们开始吧:

  1. 在项目窗口中,展开 app,然后在 manifests 文件夹内部打开 AndroidManifest.xml 文件,如下面的截图所示。如果你想在外部打开清单文件,你可以在 app/src/main 文件夹中找到该文件:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/b89406c3-d05e-495e-985b-c7b44a6cdcd8.png

项目中的 AndroidManifest.xml

  1. 在 <application> 标签之前添加以下行:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.ar" /> 

在这两种情况下(ARCore 可选和必需)第一行都是必要的,因为它提供了打开摄像头的权限。第二行指示了 ARCore 的使用,并确保只有支持 ARCore 的设备才能访问应用。

  1. 现在,在 <application> 内部添加以下行:
<application
    ...
    <meta-data android:name="com.google.ar.core" android:value="required" />
</application>

这行代码将 ARCore 设置为必需,并在应用安装时(如果尚未安装)从 Google Play 商店下载和安装 ARCore。

  1. 打开你的项目 build.gradle 文件:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/8a447dba-b8ea-48b6-b835-237a067a6f82.png

在项目窗口中,找到项目的 build.gradle 文件

  1. 确保它包括 Google 的 Maven 仓库(它应该在那里;如果不是,请添加它):
allprojects {
    repositories {
        google()
  1. 打开你的应用 build.gradle 文件:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/7edbb9cd-aa8a-48af-9952-a804e085db24.png

在项目窗口中,找到应用的 build.gradle 文件

  1. 现在,将最新的 ARCore 库作为依赖项添加(本书中为 1.13.0):
dependencies {
    ...
    implementation 'com.google.ar:core:1.13.0'
    ...
}
  1. 通过点击屏幕右上角的“立即同步”来同步 Gradle,以便使这些更改生效:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/24125073-9e11-45de-91c4-3ed7d109c492.png

同步项目选项以同步项目

如果你打算创建一个既支持又不需要 AR 的应用,启用 ARCore 的步骤将与这里展示的不同。请参阅 developers.google.com/ar/develop/java/enable-arcore 了解你需要做出哪些更改。此外,请注意,你将需要检查运行应用的移动设备是否支持 ARCore。你可以通过查看你的代码来完成这项工作。

现在我们已经启用了 ARCore,让我们介绍 Sceneform。

将 Sceneform 添加到项目

如本章开头所述,Sceneform 是一个 Android Studio 插件,它将帮助我们以比 OpenGL 更简单、更快捷的方式显示 3D 模型。

Sceneform 还提供了 ARFragment 和其他 UX 资源,这些资源在请求摄像头权限并检查 ARCore 是否已安装和更新后,将自动处理 AR 会话,而无需我们在代码中包含这些验证。

在撰写这本书的时候,Sceneform 工具仍然处于测试版阶段。如果您在按照这些步骤操作时遇到任何问题,请访问他们的 GitHub 页面(github.com/google-ar/sceneform-android-sdk)获取更多信息。

要将 Sceneform 导入到您的项目中,请按照以下步骤操作:

  1. 打开文件|设置。

  2. 在插件选项卡中,搜索 Google Sceneform Tools (Beta)。在撰写这本书的时候,当前版本是 v1.13.0:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/3abcc81e-c5ce-4d32-b22c-a0d1f10a5573.png

Google Sceneform Tools 插件

  1. 安装它,然后点击右上角的“重启 IDE”以激活更改:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/97935c7d-81a0-4f0b-b0c8-b2da612c421b.png

重启 IDE 按钮

  1. 安装完成后,打开您的应用程序的 build.gradle 文件,并在 android 部分内添加以下编译选项。如果我们不这样做,当构建我们的 ModelRenderable 时,将出现错误。这仅在 minSdkVersion < 26 且我们在创建项目时将最小值设置为 24(Android 7.0)时才是必要的:
android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
  1. 在同一文件中,在 dependencies 括号内,我们将添加以下 implementation 行以将 Sceneform 包含到我们的项目中:
dependencies {
    ...
    implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.13.0'
    ...
}
  1. 您的应用程序的 build.gradle 文件现在应该看起来像这样:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/fcc17b1f-d0f4-4132-ac62-174b5937f5b4.png

添加了新行的应用程序的 build.gradle 文件

  1. 现在,为了在您的应用程序中使用 ARFragment,请打开 res/layout 文件夹中的 activity_main.xml 文件,并在视图底部的选项卡中选择文本模式。通过这样做,您可以修改文本中的元素:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/74f58d58-f2a9-4e2d-bfd3-93701e610be5.png

activity_main.xml 文件中的文本视图和视觉预览

  1. 删除 TextView 块并添加以下内容:
<fragment android:name="com.google.ar.sceneform.ux.ArFragment"
    android:id="@+id/ux_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Sceneform 现在已准备好使用。让我们将我们的 3D 模型导入到项目中。

将 3D 模型添加到项目中

3D 模型,也称为可渲染对象,可以通过不同的方式添加:

  • 通过基本形状(球体、立方体等)和材料创建,并通过编程组合以生成更复杂的对象。

  • 通过标准 Android 小部件(ViewRenderable)创建。它们在场景中以交互式平面卡片的形式渲染。

  • 从其他程序作为 3D 资产导入。支持的格式包括 OBJ、FBX 和 glTF(以及 glb)。动画仅在 FBX 中受支持。

我们将使用第一个选项,并使用 Sceneform 导入一个 .obj 文件。

要将模型导入到我们的项目中,我们必须创建一个外部文件夹来包含模型(这个文件夹不会被编译到最终应用程序中),然后使用 Sceneform 将模型导入到项目中。按照以下步骤操作:

  1. 通过在项目的 app 文件夹上右键单击并选择 New|Sample Data Directory 创建一个 sampledata 文件夹。

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/2d173a00-28b2-4826-aca6-6763150e94b2.png

将样本数据目录添加到项目中

如果sampledata文件夹没有自动出现在您的项目中,您也可以从文件资源管理器中手动创建它,在项目的app文件夹内。命名为sampledata,它将在 Android Studio 中显示。

  1. 从为该项目提供的资源包中,将engine文件夹复制到sampledata文件夹中:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/2c973174-7c2b-4bab-97b1-8162f71ff8f0.png

包含模型及其资源的新的引擎文件夹

现在,我们将通过 Sceneform 导入.obj 文件,将 3D 模型作为资产包含进来。

  1. 右键点击engine.obj文件并选择导入 Sceneform 资产:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/d6d187b6-0635-4ecd-8508-b68e111d9264.png

为我们的.obj 文件选择导入 Sceneform 资产

  1. 保持默认值不变。这将创建一个位于sampledata中的 Sceneform 资产(.sfa)文件和一个位于assets文件夹中的 Sceneform 二进制资产(.sfb):

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/fae1677b-446e-4c9c-8a96-3f81e7973398.png

模型的默认导入值

在导入过程中,以下行将自动添加到您的应用build.gradle文件的末尾,由 Sceneform 完成:

sceneform.asset('sampledata/engine/engine.obj',
        'default',
        'sampledata/engine/engine.sfa',
        'src/main/assets/engine')
  1. 保持 Gradle 同步。当它完成后,将打开两个窗口:一个包含模型描述和 3D 预览的文本文件:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/1205c2d5-e07d-43a0-8da5-bb01ca037249.png

我们新导入的模型的文本视图和预览

最后一步是将所有元素合并到 AR 场景中。

构建 AR 场景

现在我们已经启用了 ARCore 和 Sceneform,并将 3D 模型包含在项目中,让我们添加代码,当检测到平面表面并且用户点击屏幕时,模型将出现在屏幕上。让我们开始吧:

  1. 从app/java/com.banana.arprototype打开您的MainActivity.java文件并添加以下导入:
import android.net.Uri;
import android.view.Gravity;
import android.view.MotionEvent;
import android.widget.Toast;
import com.google.ar.core.Anchor;
import com.google.ar.core.HitResult;
import com.google.ar.core.Plane;
import com.google.ar.sceneform.AnchorNode;
import com.google.ar.sceneform.rendering.ModelRenderable;
import com.google.ar.sceneform.ux.ArFragment;
import com.google.ar.sceneform.ux.TransformableNode;
  1. 在我们的类中,创建以下变量以控制 AR 场景和 3D 模型:
private ArFragment arFragment;
private ModelRenderable modelRenderable;
  1. 现在,在OnCreate()方法中,添加ARFragment的初始化:
protected void onCreate(Bundle savedInstanceState) {
    ...
    arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
  1. 仍然在OnCreate()方法中,使用ModelRenderable在场景中构建模型,如下代码所示:
ModelRenderable.builder()
        .setSource(this, Uri.parse("engine.sfb"))
        .build()
        .thenAccept(renderable -> modelRenderable = renderable)
        .exceptionally(
                throwable -> {
                    Toast toast = Toast.makeText(this, "Unable to 
                    load the model", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                    return null;
                });

在这里,我们使用Uri.parse从assets文件夹中调用模型。如果无法加载它,将会显示错误信息。

  1. 最后,仍然在OnCreate()方法中,当检测到平面表面后用户点击屏幕时,我们将放置模型:
arFragment.setOnTapArPlaneListener(
 (HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {
 if (modelRenderable == null) 
 return;

 Anchor anchor = hitResult.createAnchor();
 AnchorNode anchorNode = new AnchorNode(anchor);
 anchorNode.setParent(arFragment.getArSceneView().getScene());

 TransformableNode model = new TransformableNode(arFragment.getTransformationSystem());
 model.setParent(anchorNode);
 model.setRenderable(modelRenderable);
 model.select();
 });

在这里,当用户点击一个平面并且模型可渲染已成功加载时,将创建一个锚点以保持模型的位置。然后,创建一个新的模型节点并将其附加到它上。

  1. 现在,您可以在 Android 模拟器或实际设备上运行该应用。要在模拟器中运行它,设备必须满足一些要求,并且您必须手动从 Play Store 在该设备上下载 ARCore(请参阅developers.google.com/ar/develop/java/quickstart中的“准备您的设备或模拟器”部分)。在这里,我们将通过点击播放图标并选择我们的连接设备来直接在我们的设备上运行该应用:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/682f9f26-75a7-4c5e-a687-fb679e564bf6.png

在物理设备上运行应用

  1. 这样,应用就会安装在移动设备上。正如我们之前提到的,第一次运行应用时,它会检查是否已安装最新的 ARCore 版本:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/e62dc7fa-a0e8-462d-89d2-a42e8e146783.png

ARCore 正在检查 ARCore 的最新版本

  1. 您必须通过 Google Play 安装它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/b57b02ba-80b0-45be-b266-13a8fc0db1d4.png

安装 ARCore 应用

  1. 一旦完成这个初始步骤,您将能够完成应用的启动。移动手机/平板电脑,直到检测到平坦表面:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/0a2e5991-d2bf-49e6-8763-ad40600294ba.png

白色圆点形成我们可以放置 3D 对象的平面表面

  1. 在屏幕上轻触以锚定您的模型:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/58d69432-1376-41f7-b26a-8b9ee96c9116.png

引擎将出现在相机前方

  1. 您还可以在移动模型的同时用手指调整模型的大小、旋转和移动,以便从不同的角度观察它。如果您再次点击,将出现一个新的引擎:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/b51e550a-f4c0-4bdf-bb3f-20f96c1c3f0e.png

多次点击会导致多个实例

在应用中玩耍并熟悉使用它。您会看到,根据设备的容量,平面表面的识别速度会更快或更慢。您还会看到,如果您旋转设备(纵向/横向),模型将消失,因为锚点丢失。因此,现在我们已经有了基本设置,我们将对应用进行一些更改以改进整体性能,并给用户添加更多模型到当前场景的选项。

改进基本应用

一旦我们准备好了基本应用,我们可以做一些事情来改进应用的整体工作:

  • 将屏幕方向设置为固定。如果我们将其留在自动旋转模式下,旋转屏幕将导致手机丢失锚点,模型将从屏幕上消失。

  • 到目前为止,我们已经看到,对于每一次屏幕点击,都会出现一个新的模型。由于我们使用该应用进行原型设计,我们的想法是只显示一个模型。

  • 我们还将更改模型的旋转和大小,以便它在场景中显示得更好。

让我们修改代码以添加这些功能。为此,请按照以下步骤操作:

  1. 通过在AndroidManifest.xml中的<application>和<activity>内添加代码来强制屏幕方向为纵向模式:
<activity android:name=".MainActivity" android:screenOrientation="portrait">

这样,屏幕将始终保持在纵向模式,不会自动旋转并丢失锚点,即使用户不小心旋转了手机。

  1. 如果你使用平板电脑或更喜欢在横幅模式下查看场景,将其更改为以下内容:
<activity android:name=".MainActivity" android:screenOrientation="landscape">
  1. 为了在屏幕上每次点击只显示一个模型,打开 MainActivity.java 并在 ArFragment 和 ModelRenderable 变量之后创建以下变量:
private Anchor anchor;
private AnchorNode anchorNode;
private TransformableNode model;
  1. 然后,在 setOnTapArPlaneListener() 内部,在 modelRenderable = null 检查之后和创建新锚点之前添加以下行,以便释放上一个锚点:
protected void onCreate(Bundle savedInstanceState) {
    ...
    arFragment.setOnTapArPlaneListener(
            (HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {
                if (modelRenderable == null)
                    return;

                //Remove previous anchor
                if (anchor != null)
                {
                    arFragment.getArSceneView().getScene().removeChild(anchorNode);
                    anchor.detach();
                    anchorNode.setParent(null);
                    anchorNode = null;
                }

这样,当用户在屏幕的不同位置点击时,模型将 移动 到下一个位置,而不是在每个位置都重复出现。

  1. 现在,从下面的行中删除 Anchor、AnchorNode 和 TransformableNode 的定义部分,以便它们引用全局变量:
anchor = hitResult.createAnchor();
anchorNode = new AnchorNode(anchor);
...
model = new TransformableNode(arFragment.getTransformationSystem());
  1. 最后,为了旋转和缩放模型,首先将以下导入添加到 MainActivity.java 文件中:
import com.google.ar.sceneform.math.Quaternion;
import com.google.ar.sceneform.math.Vector3;
  1. 在 arFragment.setOnTapArPlaneListener() 方法内部,在 setParent() 之前添加以下代码:
model.setLocalScale(new Vector3(0.55f, 0.55f, 0.55f));
model.setLocalRotation(Quaternion.eulerAngles(new Vector3(-90,45,0)));

这样,模型将出现在一侧,以便我们可以看到其内部。这可以在以下图片中看到:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/80820c00-bd54-4bbf-9372-534ba7bdd36e.png

旋转状态的引擎

现在我们已经改进了基础知识,让我们添加两个更多原型和一个简单的用户界面,这样我们就可以在它们之间切换。按照以下步骤操作:

  1. 从本项目的 resources 文件夹中,将 engine2 和 engine3 文件夹复制到 sampledata 文件夹中。

  2. 右键单击每个 .obj 文件,并选择导入 Sceneform 资产以创建 .sfa 和 .sfb 文件。现在,你的 sampledata 文件夹应该看起来像这样:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/ea6e7892-2f95-4e26-a83c-e8b67e00882a.png

包含新模型的 sampledata 文件夹

你的 assets 文件夹应该包含模型的三个二进制文件:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/8fc0368c-684f-466e-960a-0616fd143a9b.png

包含三个二进制文件的资源文件夹

  1. 从本项目的 resources 文件夹中,将每个引擎对应的三个图像复制到 res|drawable 文件夹中:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/08d372a7-7f26-4007-98e4-0768928cf26b.png

包含新图像的 res|drawable 文件夹

  1. 以文本模式打开位于 res|layout 的 activity_main.xml 文件,并添加以下代码:
<LinearLayout
    android:orientation="horizontal"
    android:paddingLeft="4dp"
    android:paddingTop="15dp"
    android:paddingRight="4dp"
    android:paddingBottom="1dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="@+id/ux_fragment">

在这里,我们使用 layout_constraintBottom_toBottomOf 将其锚定到屏幕底部。

  1. 如果你处于横幅模式,你可能希望将按钮定位在屏幕的右侧,以便有更多空间进行操作。对前面的代码进行以下更改:
<LinearLayout
    android:orientation="vertical"
    ...
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    app:layout_constraintRight_toRightOf="@+id/ux_fragment">
  1. 现在,添加三个按钮:
<ImageButton
    android:id="@+id/engine1_button"
    android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_margin="10dp"
    android:src="img/engine1"
    android:background="#7cc53a"
    android:layout_weight="1.0"/>

<ImageButton
    android:id="@+id/engine2_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:src="img/engine2"
    android:background="#40000000"
    android:layout_weight="1.0" />

<ImageButton
    android:id="@+id/engine3_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:src="img/engine3"
    android:background="#40000000"
    android:layout_weight="1.0" />

第一个按钮有绿色背景(选中),而其他两个有半透明背景。每个按钮都有其对应的 res|drawable 中的图片。

  1. 最后,添加 LinearLayout 的关闭标签:
</LinearLayout>
  1. 预览应该看起来类似于以下:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/736db7c1-8415-4c63-90c8-ae8fa9fdc617.png

竖屏模式下,左侧是 activity_main.xml 文件的代码,右侧是预览

  1. 默认情况下,预览处于竖屏模式。要将其更改为横屏,请点击旋转的手机图标并选择横屏:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/2f6f608d-a904-4bd1-94c8-ea6a3a7f5953.png

竖屏模式下,左侧是 activity_main.xml 文件的代码,右侧是预览

  1. 再次打开MainActivity.java文件并添加以下库:
import android.widget.ImageButton;
import android.view.View;
  1. 在前面的代码下方添加三个新的modelRenderables:
private ModelRenderable modelRenderable2;
private ModelRenderable modelRenderable3;
private ModelRenderable currentRenderable;

我们将使用currentRenderable来找出每一刻哪个可渲染对象是活动的。

  1. 现在,在变量的末尾添加三个新的图像按钮:
private ImageButton button1;
private ImageButton button2;
private ImageButton button3;
  1. 将ModelRenderable.builder()复制并粘贴两次以构建两个新的模型。

  2. 将它们的Uri.parse调用分别更改为engine2.sfb和engine3.sfb。

  3. 在.thenAccept调用中,将renderables的名称更改为相应的名称。生成的代码应如下所示:

ModelRenderable.builder()
        .setSource(this, Uri.parse("engine2.sfb"))
        .build()
        .thenAccept(renderable -> modelRenderable2 = renderable)
        .exceptionally(
                throwable -> {
                    Toast toast = Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                    return null;
                });

ModelRenderable.builder()
        .setSource(this, Uri.parse("engine3.sfb"))
        .build()
        .thenAccept(renderable -> modelRenderable3 = renderable)
        .exceptionally(
                throwable -> {
                    Toast toast = Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                    return null;
                });
  1. 在第一个ModelRenderable.builder()中,修改.thenAccept调用:
.thenAccept(renderable -> currentRenderable = modelRenderable = renderable)

在这里,我们将currentRenderable赋值给第一个renderable。这样,屏幕上最初出现的模型将是第一个引擎(记住我们已将第一个按钮突出显示为选中的按钮)。

  1. 最后,在setOnTapArListener()方法中,将modelRenderable更改为currentRenderable:
if (currentRenderable == null)
    return;
...
model.setRenderable(currentRenderable);
  1. 要添加按钮的活动,我们将使我们的MainActivity实现OnClickListener:
public class MainActivity extends AppCompatActivity implements View.OnClickListener
  1. 这样,我们可以在onCreate()方法的底部简化按钮的初始化,如下所示:
button1 = findViewById(R.id.engine1_button);
button2 = findViewById(R.id.engine2_button);
button3 = findViewById(R.id.engine3_button);

button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);

前三条线初始化我们的按钮,接下来的三条线在用户点击时进行调用(所有三个情况下的调用相同)。

  1. 要接收这些点击,创建onClick()方法:
@Override
public void onClick(View view)
{
    switch (view.getId()) {
        case R.id.engine1_button:
            currentRenderable = modelRenderable;
            button1.setBackgroundColor(0xFFA4FF50);
            button2.setBackgroundColor(0x40000000);
            button3.setBackgroundColor(0x40000000);
            break;
        case R.id.engine2_button:
            currentRenderable = modelRenderable2;
            button1.setBackgroundColor(0x40000000);
            button2.setBackgroundColor(0xFFA4FF50);
            button3.setBackgroundColor(0x40000000);
            break;
        case R.id.engine3_button:
            currentRenderable = modelRenderable3;
            button1.setBackgroundColor(0x40000000);
            button2.setBackgroundColor(0x40000000);
            button3.setBackgroundColor(0xFFA4FF50);
            break;
    }
    model.setRenderable(currentRenderable);
}

此方法将在onCreate()之后根据哪个按钮被按下,将不同的modelRenderable分配给currentRenderable并突出显示其对应的按钮。最后一行将当前可见的模型切换到新选中的模型。

  1. 运行应用并尝试三个不同的引擎。只需选择一个引擎并将其放置在地板或桌子上。以下图片显示了地板上的黄色引擎:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/fca9bca2-f08a-4ff0-9df2-198ac0192f22.png

场景中显示引擎 2

  1. 要更改引擎,只需按下另一个按钮,当前模型将更改。您还可以找到另一个位置并点击它以使其出现:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/71b4f55c-cbd9-49e5-9071-7b3df104781e.png

引擎 3 出现在表面

在本节中,您已经学习了如何创建一个简单的界面来更改 AR 中出现的模型。有了这个,您现在有了进一步发展并构建更复杂应用的基本技能,以便您可以展示和操作自己的原型。

摘要

在本章中,我们介绍了如何使用 Google 的 ARCore 创建原型查看器应用程序来使用 AR。我们学习了如何集成 ARCore 和 Sceneform 库的功能,使生成 AR 场景的任务变得更容易,并且我们包含了我们自己的外部 3D 模型。我们还创建了一个基本的用户界面,使我们能够在不同模型之间切换。

现在,您已经拥有了使用 ARCore 创建自己应用程序的技能。您可以通过添加自己的原型或原型部件来改进当前项目,例如,当用户按下按钮时使模型分解成更小的部件,或者通过另一个按钮改变模型的颜色。这一章节为您探索在平坦表面上显示的 AR 可能性奠定了基础。

您还更了解 AR 在制造领域的应用,并且可以探索它提供的进一步可能性,而不仅仅是这里提供的示例。

在接下来的章节中,我们将探索其他 AR 工具和技术。其中一些将与 ARCore 相关,如 WebAR,而其他则完全不同,如 Augmented Class!、EasyAR 和 Vuforia。

进一步阅读

如果您想进一步探索本章中完成的项目,我们建议您探索以下选项:

第四章:使用 WebAR 和增强类!进行 AR 培训

在本章中,我们将探讨两种适用于 Android 设备的工具,这些工具可以应用于培训领域。第一个工具将基于 WebAR,具体来说,是 Google Web 组件<model-viewer>,它将允许我们通过网页使用 ARCore 在真实环境中可视化 3D 模型。我们将能够在网页上从一系列模型中选择一个,将其放置在现实世界中,并对其进行操作(移动、旋转和缩放)。

第二个工具将是增强类!,这是一个以教育为导向的创建工具,它将允许我们创建 AR 培训项目,在图像或真实生活中的图片上展示不同的元素(图像、音频文件、视频和 3D 模型等),为我们的项目添加交互性,并在用户之间交换它们。

本章的主要目标是介绍两种 AR 工具,其应用场景与本书其他章节略有不同。本章的主要思想是让你发现与我们已覆盖或将要覆盖的其他 SDK 不同的 AR 形式,以及它们在如此跨领域的培训领域中的价值。到本章结束时,你将能够通过 Web 使用 ARCore 创建自己的 AR 查看器,但你也将发现使用增强类!工具丰富 AR 应用程序用户体验的交互性可能性。

在撰写本书时,这两个工具都在持续开发和改进中,不断添加新的功能和集成。目前,它们仅适用于 Android 设备,但预计它们很快也将支持 iOS。

在本章中,我们将涵盖以下主题:

  • 使用 AR 进行培训

  • 探索使用 Google 组件<model-viewer>的 WebAR

  • 探索增强类!

技术要求

本章的技术要求如下。

对于<model-viewer>项目,你需要以下内容:

对于增强类!项目,你需要以下内容:

  • 安装有 Android 5.0 或更高版本的 Android 设备

本章的资源和相关代码文件可以在这里找到:github.com/PacktPublishing/Enterprise-Augmented-Reality-Projects/tree/master/Chapter04。

使用 AR 进行培训

增强现实在教育领域已经存在了 20 多年,尤其是在大学范围内,尽管其增长速度比在更商业化的领域如市场营销或旅游要慢得多,也较少受到关注。

随着支持硬件(如手机、平板电脑和数字白板)的演变,AR 已经成为教育和培训中的一个宝贵资产。它允许学生通过图像或直接在房间内以三维形式可视化概念,以便他们能够更快、更动态地获取信息(只需用摄像头指向而不是在书本或互联网上搜索信息),或者创建更深入的个人项目(使一幅画栩栩如生,在手工项目上添加说明或额外信息,创建动画演示等)。

一个重要的考虑因素是,在教育/培训中,AR 技术适用于所有年龄段和学科:一个孩子可以在课堂上用它来学习形状和颜色,而一家公司可以用它来培训员工关于其职业风险预防计划——这完全取决于工具和 AR 内容的目标。

在本章中,我们将学习如何使用两种不同且易于使用的工具,这些工具将帮助我们快速创建两个不同的教育项目。为此,我们将使用以下 3D 模型:

让我们从学习 Google Web Component <model-viewer>是什么以及它是如何工作的开始,来了解 WebAR。

使用 Google Web Component <model-viewer> 探索 WebAR

在智能手机进入市场之前,增强现实(AR)技术仅在计算机上开发。后来,出现了网络应用程序,最初是用 Flash 编写的,然后是 HTML5,但始终需要计算机的摄像头。自从 ARCore(谷歌)和 ARKit(苹果)工具包出现以来,AR 技术也通过网络进入了智能手机。

WebXR 设备 API 是当前正在努力提供从网络访问 VR 和 AR 的规范之一,包括使用设备的传感器或头戴式显示器(HMDs)。这个标准规范是由万维网联盟(W3C)编写的,目前正处于开发中。在撰写本文时,AR 在 WebXR 规范中的集成仍然不稳定,因此没有在本章中介绍。预计在接下来的几个月里,这一功能将得到进一步开发。有关标准和其进展的更多信息,您可以查看他们的网站(www.w3.org/TR/webxr)和 GitHub(github.com/immersive-web/webxr/)。

在本节中,为了开发 WebAR 应用程序,我们将使用 Google 的<model-viewer>网络组件,它允许我们轻松地将 3D 模型嵌入到网页中,并使用智能手机或平板电脑在 AR 中可视化它们。

Web 组件是一个基于现有网络标准的自定义 HTML 元素,它可以在现代浏览器中工作。

Google 的<model-viewer>组件首次于 2019 年 2 月推出,允许用户在网页中显示 3D 模型。2019 年 5 月,他们宣布通过ar属性实现 AR 兼容性。它基于 ARCore 功能场景查看器,目前仅适用于支持此技术的 Android 设备。我们将看到它的使用非常简单,并且可以在任何浏览器上工作。在第三章,“使用 ARCore 的 AR 制造”,我们学习了如何实现一个完整的 AR 移动项目。在这种情况下,我们只需使用提到的<model-viewer>组件来使用其网络功能。我们将看到我们可以使用哪种类型的模型,如何创建一个包含组件的网页,以及如何实际上添加组件并在移动设备上使其工作。

现在我们已经了解了我们将要使用的工具,在下一节中,我们将介绍此组件接受的 3D 模型(截至编写时)。

与 3D 模型一起工作

由于我们在浏览器中显示模型,支持的格式是GL 传输格式(glTF)2.0/glb,这是一种旨在最小化大小和运行时处理的格式,使其成为网络传输的最佳选择。如今,许多 3D 设计程序,如 Blender、3ds Max 和 Maya,以及一些 3D 模型平台,如 Sketchfab,都提供了导出此格式的工具。

你可以在www.khronos.org/gltf/和github.com/KhronosGroup/glTF/blob/master/README.md上找到有关 glTF 功能及其可能性的更多信息。

3D 模型的纹理可以是.jpg或.png格式,该工具支持动画,并且由于模型将通过网络浏览器显示,它们不应太重,以保持 AR 体验流畅。

更多关于这些要求的信息可以在developers.google.com/ar/develop/java/scene-viewer找到。

对于这个项目,我们将使用三个静态模型,分别是gearbox_conical.glb、gearbox_planetary.glb和gearbox_worm.glb。这些模型提供了良好的细节,以实现更真实的 AR 体验,我们将在下一节中使用增强类来使用它们!

现在我们已经了解了<model-viewer>组件的基本工作原理,让我们开始创建一个网页。

创建简单的网页

我们将要做的第一件事是创建一个网页,其中将显示 3D 模型,并准备好在 AR 中启动。为此,我们也将使用 Glitch,这是一个在线工具,将帮助我们创建此项目。

首先,我们将学习如何在编写样式表和 HTML 页面之前如何准备 Glitch 项目。

使用 Glitch 进行编码

Glitch 是一个用于创建具有强大协作组件的 Web 应用的简单工具。它允许我们混搭现有应用或从 GitHub 或 GitLab 等服务克隆项目。在我们的情况下,因为我们只想创建一个简单的演示网页,我们将使用 Glitch 来存储 HTML 页面和 3D 模型。要创建一个新的 Glitch 项目,请按照以下步骤操作:

  1. 首先,前往glitch.com并点击登录按钮。它将自动创建一个账户。

  2. 在页面右上角,点击新建项目以开始新项目。然后,点击第一个选项,hello-webpage:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/35886204-c874-4130-9e0d-0613c0886623.png

选择我们的项目模板

  1. 你将被导向一个看起来类似的板:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/10a2eb29-89f2-48a8-906f-f6a9bf69cca0.png

Gitch 板

查看 README 文件,因为它解释了页面的主要功能。

  1. 下一步将是更改 Glitch 为我们提供的项目名称。点击页面左上角的名称并提供名称和描述:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/e1bf670f-d670-4e47-a468-d0e9e939414b.png

修改项目的默认名称

  1. 现在,从下拉按钮“显示”中选择“紧邻代码”:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/84fea2be-a229-4c45-9bbd-0206f74a2940.png

选择如何查看最终网页

  1. 这将把我们的窗口分割,以显示我们正在编写的代码的结果:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/ecd11b24-5802-4203-89b2-5dce2e193537.png

窗口显示左侧的代码和右侧的结果

  1. 让我们上传我们的模型。点击左侧栏上的资产,并将此项目的三个模型(即gearbox_planetary.glb、gearbox_worm.glb和gearbox_conical.glb)拖放到方块上:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/452758c2-c778-46c4-b608-527114b5b1ae.png

资产窗口

  1. 一旦模型已上传,它们将出现在仪表板上:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/099e9a52-b0b7-4709-a32f-c89931dd67db.png

资产窗口中列出的资产

  1. 选择每个模型将允许你复制资产的链接或删除它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/231a763e-7128-4327-b887-c719e1447659.png

链接到资产和删除按钮

Glitch 保存我们按下的每个键,因此我们不需要手动保存代码。

在准备好基本元素后,让我们编写网页代码,从样式表开始,然后是 HTML 页面。

编写样式表

在样式表中,我们将决定我们网页的外观。由于我们的主要目标是展示 AR,所以我们现在会保持简单。Glitch 的style.css文件中已经有一些代码。让我们修改这个文件并适应我们的需求。按照以下步骤进行操作:

  1. 我们将保持body括号不变:
body {
  font-family: "Benton Sans", "Helvetica Neue", helvetica, arial, sans-serif;
  margin: 2em;
}

在这里,我们指定了网页将使用的字体和body元素的边距。

  1. 接下来,我们将修改h1标题元素:
h1 {
 text-align: center;
 color: #000000;
 font-style: bold;
}

现在,标题将居中、黑色和粗体。

  1. 让我们添加一些类元素:
.box{
  max-width: 600px;
  margin: 4em auto;
  border-radius: 8px;
  box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.7);
  text-align: center;
  overflow: hidden;
}

这个类将封装在网页上显示的 3D 模型(不在 AR 中)。它们将出现在一个盒子里,带有圆角边框和柔和的阴影。我们将添加的文本将居中在盒子内,并且overflow: hidden参数将防止内容从盒子溢出。

  1. 现在,我们将为模型的 CC BY 信息添加另一个类,这对于这些类型的模型是必需的:
.cc{
  display: flex;
  justify-content: flex-start;
  margin: 0.5em;
  font-style: italic;
}

在这里,我们将内容定位在左侧,并使用斜体文本。

  1. 我们还将更改cc类图像的外观:
.cc img{
 height: 1em;
 opacity: 0.6;
}

这两条线将选择这个类中图像的height并使它们略微透明。

  1. 最后,我们将修改<model-viewer>组件的样式:
model-viewer {
  width: 100%;
  height: 580px;
}

通过这种方式,我们将使模型查看器占据容器盒子的width并设置其height。

现在样式表已经准备好了,我们可以创建我们的页面。

编码 index.html 页面

现在,打开index.html文件,在文档的开头将网页标题从Hello!改为AR Training Web App。你可以保留<head> <head>标签之间的其余代码不变。现在,删除<body> <body>标签之间的所有内容(如果你愿意,可以保留带有 Glitch 按钮的最后两行)。

现在,让我们在<body>标签内添加标题和三个模型盒子:

  1. 在<h1>标签之间添加标题,使其使用我们的.css文件中的样式:
<h1>Select a gearbox to display in AR</h1>
  1. 现在,在标题之后,添加第一个带有顶部标题和底部 CC BY 信息的盒子:
<div class="box">
   <h2>Planetary Gearbox</h2>
   <div class="cc"> 
     <a href="https://creativecommons.org/licenses/by/2.0/" target="_blank">
         <img src="img/cc.svg">
         <img src="img/by.svg">
     </a> 
     &nbsp;&nbsp; 
     <a href="https://sketchfab.com/3d-models/gearbox-planetary-2bee7992d266456aaef1f1394b0ebb98" target="_blank">T-FLEX CAD ST (Free)</a>
   </div>
</div>

主要组件是box类。在里面,我们有<h2>格式的标题和带有指向许可证的cc类,以及两个来自creativecommons的图像来标识 CC BY 许可证类型,还有指向模型来源的 Sketchfab 页面的作者链接。

  1. 对其他两个模型也做同样的处理:
<div class="box"> 
      <h2>Worm Gearbox</h2>
      <div class="cc"> 
        <a href="https://creativecommons.org/licenses/by/2.0/" target="_blank">
          <img src="img/cc.svg">
          <img src="img/by.svg">
        </a> 
        &nbsp; &nbsp;
        <a href="https://sketchfab.com/3d-models/warm-gearbox-e7fedd86a90b4c46a53fe88882e66aa3" target="_blank">T-FLEX CAD ST (Free)</a>
      </div>
    </div>
    <div class="box"> 
      <h2>Conical Gearbox</h2>
      <div class="cc"> 
        <a href="https://creativecommons.org/licenses/by/2.0/" target="_blank">
          <img src="img/cc.svg">
          <img src="img/by.svg">
        </a> 
        &nbsp; &nbsp;
        <a href="https://sketchfab.com/3d-models/gearbox-conical-60f023924ee0456daa758eb590b6064b" target="_blank">T-FLEX CAD ST (Free)</a>
      </div>
</div>

目前,你的项目应该看起来像这样:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/ac063760-5f8a-45fb-92cd-2001da70f4e9.png

带有三个盒子的网页

现在,我们必须包含<model-viewer>组件的 3D 模型。

将组件添加到我们的页面

添加<model-viewer>组件相当简单。按照以下步骤进行操作:

  1. 首先,我们不得不在<body>元素末尾添加以下两行:
<script type="module" src="img/model-viewer.js"></script>
<script nomodule src="img/model-viewer-legacy.js"></script>

通过这些行,我们将模块添加到我们的页面,并使其在新旧浏览器中工作。

如果您想使用模块的特定版本,请在 model-viewer 后的 URL 中添加版本号,例如:/model-viewer@0.3.1/.

  1. 然后,我们可以在 box 类内部调用它,在 h2 标题之后和 cc 类之前,引用模型的 URL(在 src 属性中放入您自己的模型 URL):
<model-viewer src="img/6f8eb042-0e74-4182-9d39-4f877746edb1%2Fgerabox_planetary.glb?v=1566506940560" alt="Planetary Gearbox" background-color="#42697b" auto-rotate camera-controls ar></model-viewer> 

以下截图显示了代码界面:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/50393a44-4b8d-4d5b-ae13-926e3ae598b4.png

<model-viewer> 的最终代码

如您所见,<model-viewer> 标签支持多个属性:

  • src、background-color 和 alt 属性分别定义了源 URL、背景颜色和描述。

  • auto-rotate 属性将使模型在网页上默认旋转(平面视图,不是 AR 视图)。

  • 使用 camera-controls,我们可以在模型处于平面视图时旋转/缩放模型。

  • 对于我们来说,这里最重要的属性是 ar;没有它,查看模型在 AR 中的选项将不可用。

  1. 对其他两个模型做同样的操作:
...
<model-viewer src="img/6f8eb042-0e74-4182-9d39-4f877746edb1%2Fgearbox_worm.glb?v=1566506941410" alt="Worm Gearbox" background-color="#42697b" auto-rotate camera-controls ar></model-viewer>

...

<model-viewer src="img/6f8eb042-0e74-4182-9d39-4f877746edb1%2Fgearbox_conical.glb?v=1566506963689" alt="Conical Gearbox" background-color="#42697b" auto-rotate camera-controls ar></model-viewer>
  1. 这样,您应该会看到网页上加载并旋转的三个模型:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/00de810c-5f91-45cd-b407-4b27285aeed6.png

显示 3D 模型的网页

我们已经完成了编码。现在,让我们拿出我们的手机或平板电脑,查看 AR 中的模型。

在 AR 中可视化 3D 模型

要在 AR 中查看模型,您需要使用支持 ARCore 的设备打开网页。一旦您有了这样的设备,可视化模型的步骤如下:

  1. 通过点击 Glitch 网页左上角的分享按钮并选择 Live App 来获取您最终页面的 URL。

  2. 现在,复制 URL 并将其粘贴到您的移动设备上。您应该看到 3D 模型正在加载(由于它们是详细的模型,可能需要比在电脑上更多的时间):

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/ea44a044-896f-4568-8cfb-0c2fdf3f9d0e.png

显示在手机上的网页

  1. 在每个模型的右下角,您会看到一个在电脑浏览器中不会出现的方块。点击它。

  2. 第一次这样做时,会出现一条消息,询问页面是否可以打开 Google Play 服务 AR,如果您还没有安装,它会要求您安装它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/3ef307b0-1949-4243-9b65-b196ec49d48d.png

Google Play 商店中的 AR Google Play 服务

  1. 现在,您将看到全屏的 3D 模型,底部有一个按钮可以查看您的空间中的 AR 版本。点击它以启动相机并将其指向一个平坦的表面:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/9912b89e-b83b-4d04-862b-0c880ab86492.png

全屏显示的模型,下面有按钮可以查看 AR 版本

  1. 一旦模型被固定到表面上,我们就可以在它周围移动。通过触摸屏幕,您可以移动、旋转和缩放它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/0c54e02a-e42b-4c49-920e-267d947930df.png

在真实地板上方的 AR 模型

  1. 现在,您可以调整模型的大小和位置,从不同的角度查看它,并在其中移动。

重要!3D 模型必须通过 HTTPS 连接访问。否则,当点击右下角的小方块时,模型中的“在您的空间中查看”按钮将不会出现。如果您在未来应用程序中使用自己的服务器而不是 Glitch,请记住这一点。

就这样。现在,您知道了如何使用 Web 组件<model-viewer>和 ARCore 在 AR 中显示模型。

如我们之前提到的,组件相当新,并且一直在不断变化。要查看最新功能和接受属性,您可以查看googlewebcomponents.github.io/model-viewer/和github.com/GoogleWebComponents/model-viewer。

在下一节中,我们将使用相同的 3D 模型创建另一个培训项目,但使用 Augmented Class!工具。我们将使用图像标记并向我们的最终项目添加交互。

探索 Augmented Class!

Augmented Class!是一个由一群开发者和教师/教授的动机产生的教育内容创作工具,它提供了一个完整的解决方案,允许教育社区的全体成员(教师、学生和家长)无需技术知识,无需这些工具通常的约束(如内容有限和功能有限),创建和共享交互式 AR 项目。

目前,在 3.0.30 版本中,它可以在 Google Play Store 中免费获取,并且为 PC 提供私人测试版。该应用程序使用图像标记,在其他工具中称为目标。这意味着它会在真实图像上显示虚拟内容,例如图片、书封面等,而不是像 ARCore 那样在平坦表面上显示。Augmented Class!允许广泛的内容(图像、音频文件、视频、3D 模型和文本),我们还可以添加交互(触摸屏幕、与相机和标记之间的距离互动,以及两个标记之间的距离互动),并在用户之间共享我们的项目。在这个版本中它是免费的,预计他们将在接下来的几个月内推出更多免费和专业的功能。更多信息,请访问www.augmentedclass.com。

在这一章中,我们将使用 Android 应用程序创建一个简单的项目来显示变速箱的 3D 模型。然后,我们将添加用户交互以显示更多信息。最后,我们将创建另一个标记并在它们之间创建交互。为此,我们将在移动设备上准备我们的材料(图像和 3D 模型),创建一个简单的项目,向其中添加一些用户交互,并创建两个不同标记之间的交互。

要做到这一点,我们需要为我们的移动设备准备所有材料。

准备材料

在开始项目之前,我们必须在我们的移动设备上准备材料,以便我们可以快速访问它:

  1. 我们首先需要做的是在他们网页上注册([creativitic.es/augmentedclass/beta/](http://creativitic.es/augmentedclass/beta/))并下载 Android 应用(https://play.google.com/store/apps/details?id=com.AugmentedClass.AClass&hl=es_419)。该应用允许我们进行演示访问,而无需登录,但对于项目来说,它比注册访问有更多的限制。

  2. 现在,在您的手机或平板电脑上,在root文件夹中创建一个名为AClass的文件夹,并将模型文件gearbox_worm.glb以及标记gearbox_worm.jpg和component_desc.jpg复制到其中。创建文件夹不是必需的,但它会使使用和搜索应用中的内容更容易。

现在,我们已经准备好开始使用应用了。

创建一个简单项目

我们将首先创建一个简单项目,看看如何使用基于图像的标记在培训项目中使用 AR。让我们开始吧:

  1. 打开应用,授予所需的权限,并在登录页面输入您之前提供的电子邮件地址收到的用户名和密码:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/176b10c4-dace-42e6-82dc-07ea605a653e.png

Augmented Class! 应用登录窗口

  1. 第一次打开应用时,您将需要完成一个简单的教程,其中您需要遵循一些基本步骤来使用一些给定资源创建一个非常简单的项目:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/0aa109d2-76c9-41e5-a5ab-e4486885ee0c.png

初始教程

  1. 完成教程后,从主菜单中,按“进入发明者”。

  2. 在发明者窗口中,点击创建的新项目以选择它,然后通过按删除图标来删除它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/477c957e-61dd-4cb9-9e60-003382ecf632.png

创建了项目并删除了教程的发明者窗口

  1. 现在,点击创建新项目以进入黑板窗口。

  2. 在做任何事情之前,给项目命名,这样您以后就可以识别它了。

  3. 在这里,我们可以选择我们的标记类型。它们如下所示:

  • 简单标记:在所选图像上显示 AR 内容

  • 摄像头交互:当摄像头远离标记时显示一些 AR 内容,当摄像头靠近标记时显示另一种不同的 AR 内容

  • 标记交互:当标记分离时在每个标记上显示 AR 内容,当它们靠近时在每个标记上显示其他内容

选择 简单标记:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/1b1a8a31-4df0-4ce9-8671-9001952fee98.png

从顶部栏给项目命名

  1. 我们首先需要做的是选择一个标记。我们可以选择一个之前的标记,用我们的相机拍摄一个图像,或者上传一个标记。将“加载标记”的方形拖动到中间的白色方形上,并从您的移动设备中选择gearbox_worm.jpg图像:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/46224ee9-d4ed-431b-b7de-7a7fcc3120dd.png

将“加载标记”方形从左侧滚动视图拖动到中间

  1. 现在,我们可以将我们的 3D 模型添加到标记中。点击左侧的 3D 按钮,并将“加载模型”拖到屏幕中间的标记上:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/1e4a0391-4d4c-407d-a352-1cdfbf498fd5.png

将“加载模型”方块拖到中间的标记上

  1. 导航到我们之前创建的AClass文件夹并选择gearbox_worm.glb。如你所见,接受许多文件类型:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/0d54980c-0ddd-4ee2-8c3e-2f2d90360542.png

选择我们的 3D 模型

  1. 等待模型加载完毕。你会看到模型默认被选中,并且顶部栏上显示着新的按钮。选择手形图标来操纵模型。使用移动/旋转/缩放按钮,操纵齿轮箱,直到它看起来如下:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/4ebf9ad2-f477-4853-8e24-8d1a6354bf98.png

3D 模型旋转并缩小

多手势选项允许你用更少的按钮来操纵模型。

  1. 现在,在层次结构面板下按场景保存图标。我们的当前标记将被保存,并在底部栏上出现缩略图:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/04333232-c818-480c-8a71-cd0286c05de0.png

当前标记作为缩略图出现在底部栏

  1. 在左上角点击“项目”按钮退出黑板。然后,从左上角点击“主页”按钮进入主菜单。在那里,按“转到查看器”。在这里,我们可以看到我们的项目在网格上:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/dbb0e531-30a8-4263-b2a6-c6487a7e295d.png

带有我们项目的查看者窗口

  1. 由于我们只有一个项目并且它已经被选中,请按眼睛图标来加载 AR。然后,用摄像头指向标记,以在图像上看到 3D 模型出现。移动和旋转图像,靠近或远离它,从所有角度查看模型:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/d6004136-857a-4321-a99b-86620169f8ec.png

齿轮箱出现在图像标记上

发明者和查看者窗口都有一个打印按钮,这样你就可以在没有它们的情况下打印带有标记的 PDF。

就这样。我们已经准备好了基本项目。现在,让我们给它添加一些交互功能。

添加用户交互

让我们通过让用户触摸屏幕来添加一些交互性,这样他们就可以在悬停在标记上时查看更多的 AR 信息。按照以下步骤操作:

  1. 返回到发明者窗口并选择我们的项目。按铅笔图标来编辑它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/34b57faa-3a06-472a-939e-9414ea65b39d.png

编辑一个项目

  1. 按下缩略图然后按铅笔图标来编辑标记的场景:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/8a0f1450-c063-4520-8615-94cc9233e729.png

选择和编辑场景

  1. 让我们添加一些信息。在左侧栏中,按文本按钮并将其中一个字体拖到标记上:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/e74591fb-3bb6-4ec8-b8e7-a96957ca8945.png

将文本元素拖到标记上

  1. 输入文本Worm gear,并使用操作按钮将其移动到金色齿轮(蜗轮齿轮)旁边我们的 3D 模型:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/b299f30d-71bf-4347-bc6c-0d8554655d96.png

将文本定位在它所引用的对象旁边

  1. 为了更容易放置,你可以通过按相机图标然后按带有眼睛的相机来更改相机视角:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/c8d94898-9b73-4896-8029-5f5cd19537fc.png

将相机视图切换到俯视图

  1. 现在,选择文本后,按时钟图标以添加交互并选择手形图标。这样,当模型可见时,用户触摸屏幕,文本将出现:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/7f8aabb5-c2e5-4e77-954e-33f034549b1a.png

选择文本的交互

你可以通过按它们或在层次结构面板中按它们的名称来选择场景中的不同元素。

  1. 保存场景并返回到观众窗口以启动 AR。现在,当模型出现在图像上时,按它。文本将出现:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/c29c7a7f-811d-4a37-ab7f-17a9f875386b.png

当触摸屏幕上的元素时出现的文本

在本节中,我们学习了如何为我们的标记添加基本交互。在下一节中,我们将创建一个标记交互。

在标记之间创建交互

现在,我们将创建一个标记交互。我们将有两个标记:模型,如前几节所述,以及一些简单的文本,“组件描述”。

在本例中,我们将保持简单,当我们用相机聚焦于模型的标记时,它将显示 3D 模型。然而,当我们把两个标记放在一起时,描述文本将出现。

因为我们将重用我们的 3D 模型的标记,我们将创建另一个项目。在一个项目中,单个标记不能重复,因为观众不知道它应该在标记上显示哪个内容。因此,我们将启动一个新的项目并创建必要的交互。让我们开始吧:

  1. 在项目窗口中创建一个新的项目,在黑板窗口中将其命名为交互式变速箱。对于此项目,选择两个标记交互:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/2512ed6f-4d84-4fa0-8a75-a03fd59703a4.png

带有两个标记的新项目

如你所见,右上角将出现一个新的按钮:分离/一起。此按钮将在两种模式之间切换(当标记分离和在一起时),允许我们在每种情况下在标记上放置不同的内容。

  1. 现在,从标记列表中,将gearbox_worm作为第一个标记:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/dc8bfb59-d2ca-4c74-9c55-2e1ac8ea2aff.png

将之前上传的 gearbox_womr1 图像拖动到第一个标记上

  1. 现在,将加载标记方框拖动到第二个标记上以加载component_desc.png图片:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/746b0a65-63b5-40de-a94f-db2e8fb404c7.png

拖动负载标记方框从移动设备加载图像

  1. 按下 3D 按钮,并将gearbox_worm模型从滚动视图的末端拖动并放到第一个标记上。这将是我们标记分离时的内容:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/6b8ca40b-b02d-4adf-b21c-268ad0a4bacf.png

拖动之前上传的模型

  1. 现在,点击“一起”按钮,切换到我们将它们放在一起时将出现的内容。你会看到之前的内容将从场景中消失:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/5674cd7f-dd59-4615-8be8-c69021e95e24.png

场景变为“一起”模式

  1. 重复步骤 4,将模型放置在第一个标记上方。

  2. 选择文本按钮,并将其中一个字体拖放到第一个标记的两个单独实例中,以创建两组不同的文本。选择并放置如下:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/8ac77d5b-9755-4c9f-b919-a4c4ec098226.png

包含模型和信息文本的场景

  1. 你可以利用相机的按钮来缩小场景,从顶部查看,以便正确放置文本:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/abe72f57-a28d-4881-9ac5-51ae0427e8ef.png

改变相机视图后的相同场景

  1. 就这样。现在,按保存按钮并返回到查看器窗口以启动 AR。在网格中选择当前项目并按眼睛图标:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/ac94cf3d-d136-4732-b4f2-d967c0076b09.png

选择在 AR 中显示的当前项目

  1. 现在,你会看到,当它们分离时,变速箱显示 3D 模型:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/d34a2090-b541-41e6-833c-55f5a8f4421d.png

当标记分离时,只显示模型

  1. 现在,当它们放在一起时,我们展示了之前添加的 3D 模型和文本:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/65df9321-4f28-48a6-831a-76ecfafb8c56.png

当标记与模型结合并显示信息时

除此之外,这种交互对于复杂的解释非常有用,例如化学反应(当它们分离时,不同的成分以某种方式表现,当它们在一起时以另一种方式表现),对于构词,对于指令(我们可以有如组件描述、组装或基本维护等标记,并且根据我们将哪个标记靠近模型,将显示不同的信息),等等。

分享项目

在设备上创建的所有项目都存储在本地。然而,你可能希望与你的学生或同事分享其中之一或多个。为此,请按照以下步骤操作:

  1. 前往项目窗口。

  2. 选择项目并按分享图标:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/6303151d-f757-4acb-8fca-f372e20af7e1.png

分享所选项目

  1. 对于多选,长按项目直到出现复选框,然后选择你想要的任意多个:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/c158e4e6-40a1-49db-ab91-3b3c25c6d53d.png

分享多个项目

  1. 将打开一个窗口,你可以通过电子邮件、社交媒体等方式分享你的项目文件:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/90a93b6e-6adb-48c6-9a0e-7ca55a68db77.png

选择如何分享项目(们)

要导入另一个人的项目(或你在另一台设备上创建的项目),请按照以下步骤操作:

  1. 从你的电子邮件或驱动器下载项目文件,或你分享它的地方(记住你下载它的文件夹):

    • 前往项目窗口。

    • 点击下载图标(当未选择项目时唯一的激活图标):

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/39622147-27c9-49ef-bf0e-c386a4b405da.png

选择导入项目文件

  1. 浏览到下载文件的文件夹并选择它:

https://github.com/OpenDocCN/freelearn-csharp-zh/raw/master/docs/entp-ar-proj-/img/0f7c00c3-1014-4a8b-8f14-b586f4e35a70.png

选择项目文件

项目(s)将自动导入。

一旦新的项目被导入到你的项目窗口中,你可以像编辑和删除其他任何你创建的项目一样编辑和删除它们。

接下来是什么?

到目前为止,你已经学会了如何创建一个简单的标记和两个标记交互,并为触摸屏添加了交互功能。为此,我们使用了 3D 模型和一些文本,但你也可以尝试用视频文件或音频解释来丰富当前的项目。

另一方面,增强类!提供了更多选项,包括与摄像头的交互(当摄像头远离标记时内容改变,当摄像头靠近标记时内容改变),延迟显示内容(元素在一段时间后出现,它们可以再次消失或不消失),以及内容编辑(视频和音频循环,文本颜色和样式等)。一旦你尝试了所有这些选项并且熟悉了它们,就可以设计并创建一个使用所有可能交互的完全交互式项目。

摘要

在本章中,你学习了两种不同的训练项目工具。第一个是基于 ARCore 的 Web 功能,它允许我们无需编写太多代码,就可以将 AR 可视化添加到任何在网页上显示的 3D 模型。第二个工具增强类!使我们能够轻松创建可以服务于不同目的的交互式教育项目,例如学习某个作品的基础知识,培训维护工程师等。

现在,你对 AR 的通用性有了更好的理解,它可以在移动设备和 Web 应用程序上使用,以及交互如何帮助创建更深入和更有价值的体验。凭借你在本章中获得的技术,你可以尝试将你的项目迁移到其他领域和需求,以及进一步探索这两个工具,以便你可以改进当前的项目。

在下一章中,我们将开始使用 Unity 3D 环境和一些可以集成到其中的其他 AR 工具。在这里,你将学习如何使用 EasyAR 工具的图像识别过程来创建一个 AR 目录。

Unreal Engine(13):虚拟现实(VR)与增强现实(AR)开发教程 Unreal Engine, 由Epic Games开发, 是一个先进的游戏引擎, 也广泛应用于虚拟现实(VR)和增强现实(AR)的开发中。它提供了强大的渲染能力、物理模拟、动画系统以及直观的编辑工具,使得开发者能够创建出沉浸感极强的VR和AR体验。Unreal Engine的蓝图系统和C++支持,让不同技能水平的开发者都能参与到项目中来。 阅读详情

相关推荐

Eclipse 在 Java 增强现实开发中的应用探索

本文旨在为Java开发者提供使用Eclipse进行增强现实开发的完整技术路线。内容涵盖从环境配置到高级AR功能实现的各个方面,重点介绍如何利用Eclipse的强大功能提升AR开发效率。文章首先介绍AR开发基础概念,然后深入Eclipse的AR开发支持,接着通过实际案例展示开发流程,最后探讨优化技巧和未来趋势。增强现实(AR):将计算机生成的虚拟信息叠加到真实世界的技术标记追踪(Marker Tracking):通过识别特定图案实现空间定位的技术:实时定位与地图构建技术。

AI开发架构师 797

一份不可多得的 《操作系统》 学习指南 ( 5.6W字 )

程序是 “死的” 文件,进程是 “活的” 运行过程。比如你电脑里的 “QQ.exe” 是程序 —— 它就是一个存在硬盘里的文件,没打开的时候就是一堆代码;当你双击打开 QQ,操作系统就会把这个程序加载到内存,分配资源(比如内存空间、CPU 时间),这时候就变成了 “QQ 进程”—— 它是正在运行的、有生命周期的 “活对象”。对比维度程序(Program)进程(Process)状态静态(存硬盘)动态(在内存运行)资源不占系统资源占用 CPU、内存等资源生命周期永久存在(不删除就有)

一个人几乎可以在任何他怀有无限热忱的事情上成功 2409

华为增强现实(AR)产品设备完全指南手册

华为AR设备的硬件配置是其技术实力的直接体现,它包括处理器、存储、显示技术、输入输出设备等多个部分。处理器通常采用高性能的ARM架构芯片,确保数据处理的速度和效率。存储方面,利用闪存技术,以提供高速的数据读写性能。显示技术则采用先进的光学显示系统,以实现更自然的增强现实体验。此外,输入输出设备如触摸屏、麦克风、扬声器等,都经过精心设计,以支持更为直观和丰富的交互方式。华为AR设备的软件平台是实现各种AR应用和功能的基石。

weixin_33173126的博客 1620

2020年AR(增强现实)最新发展趋势

增强现实技术在2019年取得了创纪录的发展。微软,亚马逊,苹果,Facebook和谷歌等大型科技公司正在积极推动AR商业化。据估计,到2023年,移动设备和智能眼镜等AR支持产品的用户群将超过25亿。该行业的收入将达到750亿美元。 增强型世博会和消费电子展显示了AR行业近期的大量进展。在此基础上,本文预测了增强现实的9个未来趋势,这将在未来几年塑造增强现实的未来,并刺激AR从业者进行创新。...

图像算法Imalg的博客 5867

基于EasyAR的Unity AR项目实战开发

增强现实(Augmented Reality,简称AR)是一种将虚拟信息叠加到现实世界中的技术,通过计算机视觉与传感技术,为用户提供沉浸式的交互体验。AR不同于虚拟现实(VR)的全封闭环境,也区别于混合现实(MR)的深度融合特性,其核心在于“增强”真实世界。EasyAR 是一款面向增强现实(AR)应用开发的跨平台SDK,广泛支持主流操作系统和开发框架,具备良好的兼容性和易用性。以下是其支持的平台和开发环境:平台类型支持系统开发语言主要开发工具移动端桌面端。

weixin_35266799的博客 1551

Mac上Office合法安装与激活全指南:2021/2024/M365区别解析

Office是微软办公套件的核心产品,其在macOS平台的部署逻辑与Windows截然不同——不依赖传统密钥激活,而是基于Microsoft账户与设备标识的云端绑定机制。理解这一原理,是解决‘无法验证开发者’‘打不开’‘功能受限’等常见问题的前提。Office 2021代表永久许可模型,Office 2024 LTSC面向企业离线场景,Microsoft 365则是持续订阅服务,三者在授权验证方式、更新策略与系统兼容性上存在本质差异。实际应用中,需结合macOS版本、芯片架构(Intel/Apple Sil

weixin_33491377的博客 1267

2024年增强现实(AR)的现状

2024年的增强现实正处于一个过渡期,从移动AR转向混合现实和智能AI眼镜。尽管AR技术已经广泛为人所知,但其融入日常生活的过程仍在继续。移动AR的黄金时代已经过去,社交AR的兴起带动了广告收入的增长。目前,混合现实头显和智能眼镜成为了新的焦点。对于开发者和企业而言,利用AI创造创新的AR/MR体验,并专注于企业级解决方案,将是未来的关键发展方向。随着技术的不断进步,全天候可穿戴的AR+AI眼镜有望在未来几年内成为现实。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 3282

告别代码移植烦恼:STM32CubeMX 6.4.0 + STM32F407ZGT6 + YT8512C PHY芯片的LWIP网络配置全攻略

本文详细介绍了如何使用STM32CubeMX 6.4.0配置STM32F407ZGT6与YT8512C PHY芯片的LWIP网络适配,包括硬件特性解析、STM32CubeMX基础配置、专用驱动适配和LWIP协议栈定制化配置,帮助开发者解决PHY芯片差异导致的网络问题。

weixin_28718793的博客 290

深入浅出:增强现实(AR)技术全解析

增强现实给真实世界“加特效”。与虚拟现实创造出一个完全数字化的、沉浸式的世界不同,AR致力于将数字信息无缝地叠加到我们生活的真实世界中。它不是要取代现实,而是要做现实的“增强版插件”,为我们提供更多维度的信息。AR核心三要素,一个都不能少👁️ 虚实结合:虚拟信息和真实环境同框出现。👆 实时交互:虚拟信息能对你的一举一动做出反应。📐 三维注册:虚拟物体能稳稳地“坐”在真实世界的某个位置上,不会飘走。

2302_80294550的博客 4106

跟着团子学SAP:SAP用户状态管理详解(含权限分配等) OK02

SAP用户状态详细配置逻辑及解析

Lucas1211的博客 3万+

Android Studio运行报错: failed to load include path ……\platforms\android-35\android.jar的最细解决方案

【代码】Android Studio运行报错: failed to load include path ……\platforms\android-35\android.jar的最细解决方案。

2401_86789230的博客 2万+

增强现实企业级项目(二)

在上一节中,我们学习了如何使用 EasyAR 创建一个简单的 AR 应用来显示立方体。在本节中,我们将将自己的 3D 模型导入到 Unity 中,以便在目标上可视化并玩弄其材质和纹理。对于这个项目,我们将使用fbx,这是一种允许我们包含材质、纹理和动画的导出格式。要查看 Unity 接受的所有导出和本地 3D 格式的列表,请访问docs.unity3d.com/Manual/3D-formats.html。在“层次”窗口中选择“方向光”。然后,在检查器窗口中,将阴影类型设置为无阴影。

龙哥盟 898

电机控制基础,小白入门篇

电机,这个藏在风扇、电动车、机器人里的“动力心脏”,如何精准控制它的转速、方向甚至力量?这篇博客专为完全零基础的小白打造,用“说人话”的方式拆解电机控制的底层逻辑,帮你从“看不懂电路图”到“能调个简单电机”。 电机控制不是“大神专属”,只要掌握“电生磁、磁生力”的底层逻辑,加上动手实践,小白也能快速入门。这篇博客会陪你从“看电机转”到“让电机听话”,把复杂的控制原理变成能上手玩的“小实验”。准备好你的面包板和电机,我们一起开启“电控之旅”吧!

汽车电子软件领域知识分享 5606

从增强现实(AR),谈工业4.0的产品观

就像这两年的“互联网+”之争一样,是“互联网+产业”还是“产业+互联网”,哪个是主导。越来越多的证据表明,“产业+互联网”更容易成功,因为只有产业才最了解自己,产业的人利用互联网的技术与思维,会破茧重生,获得快速的成长。当前的AR技术也是类似的情况,无论是德国的“工业4.0”,还是美国的“工业互联网”,从智能工厂到智能制造、智能供应链,利用AR等新技术助力产业升级,未来必然是工业产业为主导,高科技为辅。综上所述,笔者有几个观点分享:1、选择高价值的细分市场,垂直行业深耕细作;

wsl3465205046的博客 1230

YOLOv8与UNetV2融合:一种面向目标检测与图像分割的混合方法【附核心代码】

我们提出了一种基于YOLOv8和UNetV2相结合的混合架构。该架构利用YOLOv8作为主干进行目标检测,同时在YOLOv8的特征提取过程中,引入UNetV2来进行图像分割任务的增强。在该架构中,YOLOv8负责大范围目标检测和位置预测,而UNetV2则在检测网络的特征图基础上,通过其高效的上下文信息提取和细节恢复能力,进一步优化分割任务。在本文中,我们提出了一种改进YOLOv8的方法,通过引入图像分割网络UNetV2来提高图像分割检测性能。

一键难忘的博客 3525

WEB浏览器视频流播放方案

基于Media Source Extensions播放视频流 浏览器播放视频的几种方法 一、H5 video标签 在浏览器播放视频,可以使用HTML5原生的video标签。但其播放的格式使用一定限制的,目前video只支持三种格式WebM、Ogg、MP4。 WebM:WebM 文件使用 VP8 视频编解码器和 Vorbis 音频编解码器 Ogg :Ogg 文件使用 Theora 视频编解码器和 Vorbis音频编解码器 MP4: MPEG 4文件使用 H264 视频编解码器和AAC音频编解码器 上面三种

machh的专栏 2381

增强现实(AR)与虚拟现实(VR)有啥区别?

公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com。未经作者允许请勿转载,欢迎各位同学积极分享和交流。前言增强现实(AR)和虚拟现实(VR)是两种不同的虚拟体验技术,它们在如何与现实世界交互和创建虚拟体验方面存在差异,像Meta Quest 2或Valve Index这样的VR头戴设备,以及像Pokemon ...

点云PCL 1632

7、树莓派故障排查全攻略

本文详细介绍了树莓派在使用过程中常见的各类故障及其排查方法。内容涵盖键盘鼠标诊断、电源诊断、显示诊断、启动诊断、网络诊断以及紧急内核的使用,提供了具体的解决方法和实用建议。同时,文章总结了故障排查流程、常见故障及解决方法的汇总,并给出了注意事项和操作建议,帮助用户高效解决树莓派使用过程中的问题,确保其稳定运行。

cream的博客 324

GitHub_Trending/ap/app-ideas增强现实:AR技术与现实世界交互

你是否曾经想象过,通过手机摄像头就能看到虚拟的恐龙在客厅里漫步?或者用手指在空中比划就能操控3D模型?这就是增强现实(Augmented Reality,AR)技术的魅力所在。与完全沉浸式的虚拟现实不同,AR技术巧妙地将数字信息叠加到现实世界中,创造出全新的交互体验。 本文将深入探讨AR技术的核心原理、开发实践以及如何将其融入现实世界应用场景。无论你是前端开发者、移动应用工程师,还是对新兴技术充...

gitblog_00964的博客 1230

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

React Native AR相机开发终极指南:从零打造企业级增强现实应用

在移动应用开发领域,增强现实(AR)技术正成为提升用户体验的关键要素。传统React Native项目在集成AR功能时往往面临性能瓶颈和开发复杂度两大挑战。react-native-vision-camera凭借其创新的帧处理器架构,为开发者提供了接近原生性能的AR开发解决方案。 ## AR相机核心架构深度解析 react-native-vision-camera的AR能力源于其革命性的帧处理

gitblog_00973的博客 313

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

零基础集成增强现实:vue-vben-admin的AR功能实现指南

你是否想为后台管理系统添加沉浸式数据可视化?是否需要在企业应用中实现3D模型交互?本文将带你从零开始在vue-vben-admin中集成增强现实(AR)功能,通过WebXR API和Three.js构建交互式3D管理界面,让数据以更直观的方式呈现。 ## 技术选型与项目准备 vue-vben-admin作为基于Vue.js的企业级后台框架,提供了灵活的插件系统和组件架构,非常适合扩展AR功能。...

gitblog_00998的博客 1093

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Vuforia AR开发实战:从图像识别到空间锚定,打造企业级增强现实应用

增强现实(AR)技术通过将虚拟信息叠加到真实世界,正在重塑工业、教育、营销等多个领域。其核心原理基于计算机视觉的实时图像识别与空间定位,实现数字内容与物理环境的精准融合。这项技术的核心价值在于提升信息呈现的直观性和交互效率,尤其在设备维护、产品展示和培训指导等场景中优势显著。Vuforia作为领先的AR开发平台,提供了从基础的图像识别、模型识别到高级的空间锚定系统等一整套SDK工具,帮助开发者高效构建稳定、高精度的AR体验。通过结合Unity引擎,开发者可以快速实现虚拟内容的稳定跟踪与交互,并利用其灵活的云

weixin_30162121的博客 352

增强现实(AR)、虚拟现实(VR)、混合现实(MR)之间有什么区别?

刚接触沉浸式技术场景的人问的第一个问题是,如何将增强现实(AR)与虚拟现实(VR)区分开来,还有混合现实(MR)和扩展现实(XR)等术语又是什么意思。下面让我们来看看,它们究竟是什么?

安宝特AR的博客 3426

关于用Unity实现校区AR导航毕业设计的建议

最近有人问,怎么用ARCore来做校园AR导航的毕业设计。因为不是第一个了,后面估计还会有,就专门说一下。 先说室内导航,毕竟很多人问都是因为我做过AR室内导航的内容。AR室内导航有2种技术方式实现,运动跟踪和稀疏空间地图或云锚点。运动跟踪因为中途不能自动校正,而稀疏空间地图或云锚点能自动校正,所以后者更可靠,不推荐用运动跟踪实现。 那么,可以用稀疏空间地图或云锚点实现校区范围的AR导航么?技术上可以,但是,做毕业设计的大概不行。用稀疏空间地图或云锚点实现AR导航,首先需要建立地图或者锚点。 这里有手机建图

wuyt2008的专栏 4304

AR.js与MindAR终极对比:2024年Web AR开发库选择完全指南

在当今快速发展的增强现实(AR)技术领域,**AR.js**和**MindAR**作为两个主流的Web AR开发库,为开发者提供了在浏览器中实现沉浸式AR体验的强大工具。本文将从功能特性、性能表现、易用性和实际应用场景等多个维度,为你详细解析这两个库的差异,帮助你做出最适合的选择。 ## 🔍 核心功能特性对比 ### AR.js:成熟稳定的Web AR解决方案 AR.js支持**图像追踪*

gitblog_00762的博客 848
上一篇: C#10 和 .NET6 企业级应用开发(五)
下一篇: 增强现实企业级项目(二)
绝不原创的飞龙
绝不原创的飞龙 优质创作者: 人工智能、数据科学与机器学习技术领域 优质创作者: 人工智能、数据科学与机器学习技术领域
博客等级 码龄15年 4万+粉丝 2万+原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值