65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 Unity 中创建增强现实地球

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (6投票s)

2018 年 5 月 3 日

CPOL

13分钟阅读

viewsIcon

19959

在本篇文章中,我们将使用 C# 编程来构建一个地球模型。

这是摘自《增强现实开发者》一书的内容,作者是 Jonathan Linowes 和 Krystian Babilinski,由 Packt Publishing 出版。本书将教您如何使用 Unity 3D、Vuforia、ARToolKit、Microsoft Mixed Reality HoloLens、Apple ARKit 和 Google ARCore 在移动和可穿戴设备上构建激动人心的 AR 应用。

教育是增强现实的一个重要应用。所有年龄段的孩子都喜欢天文学和研究我们太阳系的行星。因此,对于这个项目,我们将构建一个教育性 AR 应用,让您可以在舒适的客厅里探索太阳系并查看行星。

在本篇文章中,我们将构建一个地球模型。我们将使用真实的 NASA 数据来设置地球的大小和纹理。我们将使用 C# 编程来动画化行星的自转和公转。

我们将使用编码标记作为主要的 AR 技术来实现该项目。我们将打印带有 AR 标记的卡片,您可以使用这些卡片来交互式地探索天体。我们还将向您展示如何为支持空间映射的设备制作项目的无标记版本。

让我们通过在 Unity 中设置新项目并使其准备好进行 AR 来开始实现。

创建初始项目

使用以下步骤在 Unity 中创建新的 AR 项目。您需要先下载 Vuforia 包(请参阅第 2 章,设置您的系统)。请参考以下步骤进行操作。

  • 打开 Unity 并创建一个新的 3D 项目。将其命名为 SolarSystem
  • 转到 Assets | Import Package | Custom Package... 以导入 vuforia-unity-xxxx。
  • 转到 Assets | Import Package | Custom Package... 以导入 VuforiaSamples-xxxx。
  • 浏览到 Vuforia 开发门户(https://developer.vuforia.com/targetmanager/licenseManager/licenseListing),然后选择或创建一个许可证密钥。将许可证密钥复制到剪贴板。
  • 回到 Unity,转到 Vuforia | Configuration,然后将许可证密钥粘贴到 App License Key 中。
  • 查看其他配置设置,包括当前的 Webcam Camera Device

设置场景和文件夹

接下来,用 Vuforia 的 ARCamera 预制体替换默认的 Main Camera 对象。

  • Hierarchy 中删除 Main Camera 对象。
  • Project Assets/Vuforia/Prefabs 文件夹中找到 ARCamera 预制体,然后选择并将其拖到 Hierarchy 中。
  • 使用 Add ComponentARCamera 添加 Camera Settings 组件。
  • 将场景保存为 SolarSystem(File | Save Scene As),然后保存项目(File | Save Project)。

本次教程,我们将面向 Android 设备。我们现在可以进行一些基本设置。这样,您可以定期进行构建和运行,以便在整个项目中查看设备上的进度。

  • 转到 File | Build Settings
  • Switch Platform 设置为 Android
  • 另外,添加当前场景并按 Add Open Scenes
  • 选择 Player Settings,然后设置您的 Identification Package 名称(com.Company.Product)和 Minimum API Level(Android 5.1)。
  • 保存场景,然后保存项目。

此时,如果您在 Unity 编辑器中按 Play 按钮,您应该会看到来自网络摄像机的视频流。这将允许您在 Unity 编辑器中调试 AR 应用程序。

现在在项目 Assets 文件夹中创建一些空文件夹将很有用,我们很快就会用到它们。

  • Project 窗口中,选择顶级的 Assets/ 文件夹。
  • Assets/ 中创建一个名为 SolarSystem 的新文件夹。
  • Assets/SolarSystem/ 中,创建另外三个新文件夹:TexturesScriptsMaterials

生成的项目 Assets 文件夹如下截图所示。

使用标记目标

开发此项目时,我们需要一个物理目标图像。选择一个目标图像并打印出来。我们将在本章后面讨论自定义 AR 目标。选择以下之一打印:

  • 您可以使用 samples 包提供的 VuMark00。打印 VuMark00.pdf 的副本,该文件位于 Assets/Editor/Vuforia/ForPrint/Vuforia-VuMark-Instances-00-99.zip(将文件解压缩到项目目录外的另一个文件夹)。
  • 或者,使用本书可下载文件中的标记表。文件名是 PlanetMarkerCards.pdf。打印出来并剪下第一个:SOLAR SYSTEM(这是 VuMark00 标记)。

以下是其中一个标记。

在 Unity 中,请按照以下步骤操作:

  • 激活数据库。转到 Vuforia | Configuration,勾选 Load Vuforia Database 复选框,然后勾选其 Activate 复选框。
  • 将 Vuforia/Prefabs/VuMark 预制体拖到 Hierarchy(如有必要,重置其 Transform)。
  • Inspector 中,在 Vu Mark Behavior 下,将 Database 设置为 Vuforia
  • 勾选 Enable extended tracking

Vu Mark Behavior 组件设置如下图所示。

创建 SolarSystem 容器

现在,我们应该创建一个作为 VuMark 子对象的空游戏对象,它将是我们太阳系所有天体的容器父对象。为此,请执行以下步骤:

  • Hierarchy 中选择 VuMark,右键单击 Create Empty 并命名为 SolarSystem
  • 验证它是否是 VuMark 的子对象。

如果您现在在编辑器中按 Play,您将能够看到来自网络摄像机的视频流。但它不会响应检测到目标标记而执行任何操作。

  • 将一个 Sphere 添加为 SolarSystem 的子对象(选择 SolarSystem 并右键单击 3D Object 下的 Sphere)。确保球体的 Transform 已重置(Transform | gear icon | Reset)。
  • 将鼠标悬停在 Scene 窗口上,然后按 F 以查找并缩放到对象(或在 Hierarchy 中双击 SolarSystem 对象)。
  • 再次在 Hierarchy 中选择 SolarSystem,然后将其放置在目标上方,例如 (0, 0.75, 0)。
  • 保存场景并保存项目。
  • 现在按 Play,并将网络摄像头指向目标。您应该会看到球体。

当前场景层次结构如下图所示。

Scene 窗口中,它应该看起来像这样。

构建地球

根据圣经,起初,大地是混沌、空虚的。但在 Unity 中,它始于一个未纹理的球体。Unity 中的 3D 对象,例如球体、立方体或任意形状的网格,默认使用未纹理的默认材质进行渲染。

材质定义了对象表面外观的细节,通常使用纹理图像。纹理是映射到对象表面上的图像,就像绘画或墙纸一样。这被称为漫反射纹理或表面反射。高级材质可以使用其他纹理来模拟额外的表面细节、凹凸、锈蚀、金属和其他物理特性。

假设一个球体具有这样的表面纹理。

从球体展开并展平为 2D 图像的纹理称为等矩形投影,如下图所示,很像您在世界地图中找到的那样(请参阅 https://en.wikipedia.org/wiki/Equirectangular_projection)。这种投影类型也常用于 360 度虚拟现实图像。

创建地球

要创建 Unity 中的地球,请参阅以下步骤:

  • 如果您没有 SolarSystemSphere 子对象,请立即创建一个(在 Hierarchy 中,右键单击 SolarSystem,然后转到 3D Object | Sphere)。将其重命名为 Earth
  • 确保它是 SolarSystem 的子对象。
  • 如有必要,重置其 TransformTransform | gear icon | Reset)。
  • 移除其 ColliderSphere Collider | gear icon | Remove Component)。

注意

Collider 是一个组件,它定义了对象的形状,以便检测物理碰撞。它是不可见的,通常比对象本身具有更简单的几何形状,因为物理计算可能非常耗费资源。在此项目中我们不使用 Unity 物理,因此我们的行星不需要碰撞体。

现在我们可以应用纹理了。

  • earth.png 导入到项目 Assets/SolarSystem/Textures/ 文件夹中(您可以通过将它们从操作系统文件浏览器(finder)拖放到 Unity Project 窗口中轻松完成此操作)。
  • 现在,将地球纹理从 Assets/SolarSystem/Textures/ 拖到 Earth 对象上(可以在 SceneHierarchyInspector 窗口中)。

如果您浏览到项目 Assets/SolarSystem/Materials 文件夹,您会发现 Unity 已自动创建一个新材质,其名称与纹理相同,并将您的纹理设置为其 Albedo(表面纹理图像)。

  • 打开其材质(在地球的 Inspector 中或直接在 Assets 中)。
  • 取消勾选 Specular Highlights,然后取消勾选 Reflections

我们将保持地球的比例为 1 个单位。我们可以按比例缩放其他行星。

注意

如果您想调整地球相对于目标的尺寸或位置,请使用父 SolarSystem 对象,并将地球保持在 1 的比例和 (0,0,0) 的中心位置。

保存场景,保存项目,然后按 Play,将摄像头指向目标标记,然后查看地球仪。以下是我运行项目的 Game 窗口的屏幕截图,该项目已被标记识别并显示了我们的地球对象。

旋转地球

在上一个章节中,我们使用 Unity 图形编辑器实现了动画,用于动画师状态和动画曲线。这次,我们将通过 C# 脚本来实现。

地球每天旋转一次!(您知道的。)大约每小时 15 度(360/24)。如果我们想追求逼真,以这个速度观察模型旋转可能会有点无聊(当我们添加太阳时,我们将不得不等待一年才能观看完整公转的动画)。相反,让我们在 24 秒内完成一次旋转。即每真实小时游戏时间一秒。

我们将编写一个快速脚本来旋转地球仪。如果您是编程新手,只需继续跟随,然后在下一节阅读编程简介。

  • Hierarchy 中,选择 Earth,然后在 Inspector 中(您可能需要向下滚动它),按 Add ComponentNew ScriptC-Sharp)。将其命名为 Spin,然后按 Create and Add

Spin 脚本现在作为组件出现在地球的 Inspector 中,如下图所示。

  • 双击 Spin 脚本以在编辑器中打开它。

注意

根据您安装 Unity 的方式,程序脚本的默认编辑器可能是 MonoDevelop 或 Visual Studio。两者都可以。Unity 会从默认模板创建一个空脚本。

编辑文件,使其看起来像这样:

File: Spin.cs 
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
 
public class Spin : MonoBehaviour { 
    public float gametimePerDay = 24.0f; 
 
    void Update () { 
        float deltaAngle = (360.0f / gametimePerDay) * Time.deltaTime; 
        transform.Rotate(0f, deltaAngle, 0f); 
    } 
}

我们声明了一个名为 gametimePerDay 的变量,其值为 24(float 是带小数点的数字,而 integer 是整数)。每次游戏更新显示时,它将围绕 y 轴(垂直轴)旋转当前对象 deltaAngle 度。deltaAngle 属性是每游戏秒旋转的度数(360 / gametimePerDay)乘以当前帧时间(Time.deltaTime)。

  • 编辑完成后,保存文件。
  • 回到 Unity,按 Play,将摄像头指向您的标记,观看地球仪旋转。

注意

如果脚本有任何错误,Unity 会在 Console 窗口中报告给您。请确保 Console 窗口可见(Window | Console),以便您知道在编写脚本时是否犯了任何拼写错误或其他错误。

  • 现在,进行一些清理工作,在 Project 窗口中,将 Spin 脚本从 Assets/ 拖到 Assets/SolarSystem/Scripts 文件夹。
  • 保存场景并保存项目。

添加音频

这越来越令人兴奋了!我们现在有一个旋转的世界来增强我们的现实。让我们添加一些额外的功能,在它旋转时播放一些背景音乐。

选择您喜欢的 MP3 文件。我们决定使用 Laurie London 演唱的 He's got the whole world in his hands 的免费版本(http://www.bulkmp3.co/song/Laurie-London-He-S-Got-The-Whole-World-In-His-Hands-1958.html)。该文件包含在本书的下载文件中。或者,您可能更喜欢古典音乐,或者 David Bowie 的 Starman。

  • Project 窗口中,创建一个名为 Assets/Audio 的文件夹,并将 MP3 文件导入(拖放)到其中。
  • Hierarchy 中,在根目录下创建一个空对象,并将其命名为 BackgroundMusic(如有必要,重置其 Transform)。
  • 转到 Add Component | Audio | Audio Source
  • 现在,将 MP3 音频剪辑从 Project 窗口拖到 Audio Source 的 AudioClip 插槽。
  • 勾选 Play on AwakeLoop,因为我们希望它在应用加载时开始播放,并在播放完后循环回到开头。

好了!按 Play 并享受您的应用。然后,保存场景和项目。我们刚刚定义的 Audio Source 组件如下图所示。

注意

如果音乐变得烦人,您可以使用 Game 窗口中的 Mute Audio 在编辑器的 Play 模式下禁用音频。或者,您可以将其完全禁用,方法是取消勾选 BackgroundMusic 对象(Inspector 的左上角)或禁用其 Audio Source 组件(在构建之前记得将其重新启用)。

照亮场景

我们的目标是创建一个太阳系,而不仅仅是一个旋转的地球仪。这意味着我们需要从侧面照亮行星,就像它接收阳光一样。我们将通过替换默认场景灯光来实现这一点,使用点光源。

首先,移除默认灯光。

  • Hierarchy 中,删除 Directional Light
  • 接下来,转到 Lighting 面板。如果未启用,请转到 Window | Lighting | Settings,然后将其选项卡拖到 Inspector 旁边。
  • Lighting 中,在其 Scene 选项卡下的 Environmental Lighting 部分,将 Source 设置为 Color,将 Ambient Color 设置为黑色 (000)。
  • 另外,在 Environmental Reflections 组中,将 Intensity Multiplier 设置为 0。

这看起来很暗。

添加太阳光

Unity 为您的场景提供了各种不同类型的光源。对于太阳光,我们将使用点光源,因为它向所有方向辐射。

  • Hierarchy 中,转到 Create | Light | Point Light 并将其命名为 Sunlight(您可能需要转到并单击 Inspector 选项卡以显示该面板)。
  • 将其作为 SolarSystem 的子对象移动,重置其 Transform,并将其移离中心,例如 (-5, 0, 0)。
  • 将其范围设置为 10,000(一个非常大的数值)。
  • Mode 设置为 Realtime
  • 将其 Intensity 设置为 1.3(调整直到看起来不错)。
  • Shadow Type 设置为 Soft Shadows

注意

请记住,您可以使用鼠标右键在 Scene 面板中旋转视图,并使用鼠标中键移动视图。

现在播放场景并决定您是否喜欢它。然后,保存场景和项目。

夜间纹理

有些不对劲。我们的地球看起来像是无人居住的。与我们太阳系中的其他行星不同(据我所知),只有地球有从太空可见的城市灯光在行星的夜晚侧。我们有另一张地球夜晚的纹理,称为 earth_night.png,我们可以将其添加到 Earth 材质中。我们将使此纹理成为发射,这意味着它将产生自己的光(城市灯光在行星的黑暗侧会这样做)。

  • 如果 earth_night.png 尚未导入,请将其导入到 Project Assets/SolarSystem/Textures 文件夹中。
  • 选择 Earth 材质。在 Hierarchy 中,选择 Earth,然后在 Inspector 中,展开其材质(或导航到 Assets/SolarSystem/Materials/earth)。
  • 勾选 Emission 复选框。
  • earth_night 纹理拖到 Emission Color 旁边的方块上。
  • 将发射级别(Emission Color 右侧)调低到 0.5 左右。
  • 保存场景和项目,然后点击 Play

我不知道您是否能在下面的截图中看到,但行星的白天一侧被阳光照亮,而背面显示城市灯光的发射。太酷了!

要完成这个 AR 太阳系项目,请查看由 Jonathan Linowes 和 Krystian Babilinski 撰写的《增强现实开发者》一书,由 Packt Publishing 出版。您还可以通过本书构建其他有趣的 AR 项目,例如增强名片、增强说明手册、AR 室内设计应用等。

© . All rights reserved.