本帖最后由 truthrudy 于 2016-6-28 16:50 编辑
Project Tango 将增强现实 (AR) 体验带入人们的生活。从现实到异想天开,Project Tango 应用帮助将虚拟物体(从新起居室中的任何家具到全尺寸恐龙)带入您的真实世界。
上个月我们向您介绍了如何快速而轻松地在 AR 中建立一个简单的太阳系。但如果您打算做点什么更高级的,下面的教程介绍了如何使用 Project Tango 的深度 API 将虚拟物体与真实物体关联到一起。本教程还会展示如何使用 Tango 支持库功能在环境中寻找平坦的表面。
那么,我们的新教程项目是什么呢?我们觉得,既然猫统治互联网,我们就在 AR 中放置一只虚拟猫吧!开发者体验的设计目标是简单易用,当您点按屏幕时,应用会根据真实猫的几何形状数据创建一只虚拟猫。接着,您使用深度相机来定位您点按的表面,将猫注册(放置)到合适的 3D 位置。
让猫登场! 在开始之前,您需要下载 Project Tango Unity SDK。然后,按以下步骤创建您自己的猫。
第 1 步:创建一个新 Unity 项目,将 Tango SDK 程序包导入项目。
第 2 步:创建新场景。如果您不知道如何完成这一步,请回顾太阳系教程。就像太阳系项目那样,在此场景中,您将使用 Tango Manager 和 Tango AR 相机,并删除默认的 Main Camera 游戏对象。完成这一步之后,您应该看到类似下面这样的场景层次结构:
第 3 步:构建并运行一次,确保应用仅显示 Tango 相机输送的视频。
第 4 步:启用 Tango Manager 游戏对象的 Depth 复选框。
第 5 步:将 Tango Point Cloud 预制件从 TangoPrefab 文件夹拖放到场景中。 Tango Point Cloud 包含许多与点云有关的有用函数,包括查找地板、将点云转换成统一的全局空间并渲染调试点。在本例中,您将使用 FindPlane 函数来根据触摸事件查找平面。
第 6 步:在场景中创建一个 UI Controller 游戏对象。为此,请点击 Hierarchy 选项卡下的“Create”按钮,然后点击“Create Empty”。该 UI Controller 将成为负责运行 UIController.cs 脚本(下一步您将创建该脚本)的主游戏对象。
第 7 步:在检查器窗口中,点击“UIController gameobject”,然后点击“Add Component”,以添加一个名为 KittyUIController.cs 的 C# 脚本。KittyUIController.cs 将处理触摸事件,调用 FindPlane 函数,将您的小猫放入场景中。
第 8 步:双击 KittyUIController.cs 文件并使用以下代码替换该脚本 using UnityEngine; using System.Collections; public class KittyUIController : MonoBehaviour { public GameObject m_kitten; private TangoPointCloud m_pointCloud; void Start() { m_pointCloud = FindObjectOfType(); } void Update () { if (Input.touchCount == 1) { // Trigger place kitten function when single touch ended. Touch t = Input.GetTouch(0); if (t.phase == TouchPhase.Ended) { PlaceKitten(t.position); } } } void PlaceKitten(Vector2 touchPosition) { // Find the plane. Camera cam = Camera.main; Vector3 planeCenter; Plane plane; if (!m_pointCloud.FindPlane(cam, touchPosition, out planeCenter, out plane)) { Debug.Log("cannot find plane."); return; } // Place kitten on the surface, and make it always face the camera. if (Vector3.Angle(plane.normal, Vector3.up) < 30.0f) { Vector3 up = plane.normal; Vector3 right = Vector3.Cross(plane.normal, cam.transform.forward).normalized; Vector3 forward = Vector3.Cross(right, plane.normal).normalized; Instantiate(m_kitten, planeCenter, Quaternion.LookRotation(forward, up)); } else { Debug.Log("surface is too steep for kitten to stand on."); } } }
代码说明
以下是有关上述代码的说明:- m_kitten 是对 Kitten 游戏对象的引用(我们将在后续步骤中添加该模型)
- m_pointCloud 是对 Tango Point Cloud 游戏对象中 TangoPointCloud 脚本的引用。我们需要借助此引用来调用 FindPlane 方法。
- 我们在 Start() 函数中分配了 m_pointcloud 引用。
- 在一次触摸结束时,我们会在 Update() 函数中检查触摸的次数及状态。
- 我们调用 PlaceKitten(Vector2 touchPosition) 函数将猫放入 3D 空间中。这就需要查询主相机(在本例中,是指 AR 相机)的位置,然后根据相机的位置和触摸位置调用 FindPlane 函数。FindPlane 从触摸点返回一个估算的平面,并将猫放到某个不是过于陡峭的平面上。提醒一下,Tango 支持库中提供了 FindPlane 函数。您可以访问TangoSDK/TangoSupport/Scripts/TangoSupport.cs,查看其全部功能。
第 9 步:通过下载 kitty.unitypackage 准备好一切资源,其中包括一个猫模型以及一些简单的动画。双击该程序包,将其导入到您的项目中。在项目文件夹中,有一个 Kitty 预制件,您可以将其拖放到 KittyUIController 的 Kitten 字段中。
第 10 步:编译并再次运行应用。您应当能够点按屏幕并将小猫放在任何地方!我们希望您喜欢本教程,让猫的可爱和 AR 的魔力浑然一体。请继续关注本博客,了解更多 AR 动态和教程!
有关本教程的最后说明
现在,您已经创造了在 AR 中生活的虚拟猫。这很好,但从编码的角度来看,您还需要再执行几步操作,以打造真正栩栩如生的 AR 应用。查看我们在 Github 上的 Unity 示例代码(尤其是 Augmented Reality 示例),以详细了解如何构建优秀的 AR 应用。此外,如果您需要进修,请查阅 I/O 大会上关于使用 Project Tango 构建 6DOF 游戏的谈话。
|