hololens 开发实录

Hololens 开发实录

Created by miccall (转载请注明出处)

前奏

一 . 安装必要文件

windows 10 开发者版本
需要成为Windows内部人员并注册开发者
    转到设置 > 更新和安全 > Windows预览版
    选择 Windows Insider Fast 
    转到设置 > 更新和安全 > 检查更新
    继续检查更新,直到您看到您的设备是最新的。
启用开发者模式
    转到设置>更新和安全>针对开发人员
    切换为开发者模式
Visual Studio 2017

Visual Studio 2017 下载地址

下载安装 Visual Studio 2017 和 Windows 10 SDK
选择安装选项 
    Universal Windows Platform development (通用Windows平台开发)
         包含 Windows SDK (10.0.14393.0)
         包含 Windows SDK (10.0.10586.0) (可选)
     Game Development with Unity  (使用 Unity 的游戏开发) 
        包含 Unity 5.6 编辑器 (可选)
![安装界面](https://az835927.vo.msecnd.net/sites/mixed-reality/Resources/images/VSMRSetup-SelectUnityNoPlayer.PNG)
HoloLens Emulator

模拟器下载地址

您的系统必须支持Hyper-V才能使仿真器安装成功。
请参考其他教程开启功能
Unity 5.6

Unity下载地址

如果以前没有安装 或者vs里没选选择Unity 5.6 编辑器
下载安装Unity

二 . 构建方法

  • 这一步开始 默认情况为一切准备就绪。

新建一个工程

要使用Unity构建应用程序,您首先需要创建一个项目。 
该项目组织成几个文件夹,其中最重要的是您的资产文件夹。 
这是保存从数字内容创建工具(如Maya,Max Cinema 4D或Photoshop)
导入的所有资源的文件夹,您使用Visual Studio或您最喜爱的代码编辑器创建的所有代码,
以及Unity创建的任何数量的内容文件 编辑器中的场景,动画和其他Unity资产类型。

在hololens运行。要构建和部署UWP应用程序。
Unity可以将该项目导出为包含所有必需的资源
和代码文件的Visual Studio解决方案。
  • 上面一堆废话 我们要做的 只有 :
    启动Unity
    选择 新建( new )
    输入项目名称(例如“MixedRealityIntroduction”)
    输入 保存项目的位置
    确保 选择3D切换
    选择 创建项目(create project)

设置主摄像机

选择 文件(File)>新建场景(new Sene)

首先,由于主摄像机跟踪用户头部的移动
所以可以通过设置主摄像头的起始位置来设置用户的起始位置。

    在“层次结构(Hierarchy)”面板中选择主摄像头(Main Camera)
    在“检查器(Inspector)”面板中,找到“变换(Transform)”组件,
    并将位置从(X : 0 , Y : 1 , Z : -10)更改为(X:0,Y:0,Z:0)

其次,默认的Camera背景也需要一些调整。
对于 HoloLens 应用程序,真实世界应该出现在相机呈现的所有内容之后,而不是Skybox纹理。

    在“层次结构(Hierarchy)”面板中仍然选择主摄像机(Main Camera)
    请在“检查器(Inspector)”面板中找到 “Camera” 组件
    然后将“ 清除标志(Clear Flag) ”从“天空(Skybox)”
    下拉列表更改为“纯色(Solid Color )”。
    选择背景颜色(Background)选择器并将RGBA值更改为(0,0,0,0)

第三,让我们考虑Unity中的近剪辑平面,
并防止当用户接近对象或对象接近用户时,
使对象被渲染得太靠近用户的眼睛。
对于HoloLens应用,近剪切平面可以设置为HoloLens推荐的0.85米。
    在“层次结构(Hierarchy)”面板中仍然选择主摄像头(Main Camera),
    在“检查器(Inspector)”面板中找到“Camera”组件
    将“近剪切平面(Near Clip Plane )”
    字段从默认值0.3更改为HoloLens推荐的0.85。

最后,让我们保存场景更改。
请选择“文件(File)”>“将场景另存为(Save Sence As)”,
将场景命名为Main,然后选择保存(Saves)。

项目设置

   我们还将设置一些Unity项目设置
   帮助我们定位Windows Holographic SDK进行开发
   我们还将为我们的应用设置一些质量设置
   最后,我们将确保我们的构建目标设置为Windows Store

Unity 性能和质量设置
    由于在HoloLens上保持高帧率是非常重要的
    我们希望调整质量设置以实现最快的性能
    有关更多详细的性能信息,请参阅Unity的性能建议

    选择编辑(Edit)>项目设置(Project Setting)>质量(Quality)
    选择Windows Store徽标下的下拉列表,然后选择最快(Fastest)。

    当WindowsStore列和最快行中的框为绿色时,
    您将会知道该设置正确应用。
    对于针对遮挡显示的混合现实应用,您可以将质量设置保留为默认值。

我们需要让Unity知道我们试图导出的应用程序应该创建一个全息视图而不是2D视图

我们通过在面向Windows 10 SDK的Unity上启用虚拟现实支持来实现此目的。
    选择编辑(Edit)>项目设置(Project Setting)>播放器(Player)
    在“检查器(Inspector)”面板中,单击“Windows Store”选项卡
    展开“其他设置(other)”组。
    在“渲染(Rendering)”部分中,
    检查虚拟现实支持的复选框(Virtual Reality Supported)
    以添加新的虚拟现实SDK列表(Virtual Reality SDKs),

    并确认“Windows混合现实”被列为支持的SDK。
获取所有项目设置的真棒工作。接下来,让我们添加一个全息图!

创建简单物体

在Unity项目中创建多维数据集就像在Unity中创建任何其他对象一样。
将立方体放置在用户面前很容易,因为Unity的坐标系映射到现实世界 
Unity中的一米在现实世界中大约为一米。
    在Hierarchy面板中, 右键 选择 create > 3D Object > Cube.
    在Hierarchy面板中,选中刚刚创建的cube 
    在Inspector面板中,找到Transform组件并且改变Position属性为
    (X: 0, Y: 0, Z: 2). 
    这个位置表示 在摄像机前 也就是用户眼睛前方两米处的位置。

    还是在Transform组件中,更改Rotation属性为 (X: 45, Y: 45, Z: 45)

    更改Scale属性为(X: 0.25, Y: 0.25, Z: 0.25).
    缩放的cube边长为0.25米 

最后保存我们的场景, 选择 File > Save Scene.

HoloLens 使用 Unity 远程处理

在您的HoloLens上
从Windows Store 下载安装Holographic Remoting Player。
在设备上启动应用程序,它将进入等待状态并显示设备的IP地址。
记下IP。
    在Unity中,打开Window>Holographic Emulation。
    将 Emulation Mode 从无(None)到更改为( Romote to Device )。
    在 Remote Machine 中,输入前面提到的HoloLens的IP地址。
    单击连接Connect。
    确保连接状态更改为绿色已连接。
    现在,您可以在Unity编辑器中单击 play 。

您现在将可以在设备和编辑器中查看多维数据集。
您可以像在编辑器中运行应用程序一样暂停,检查对象和调试,

对于其他混合现实支持的设备
使用USB电缆和HDMI或显示器端口电缆将耳机连接到开发PC。

从 Visual Studio 构建和部署

我们现在准备将我们的项目编译到Visual Studio并部署到我们的目标设备。

导出到Visual Studio解决方案
        打开文件(File)>构建设置窗口(Build Settings)。
        单击添加打开场景(Add Open Scenes )以添加场景。
        将平台(Platform)更改为Windows Store,然后单击开关平台(Swith Platform)。
        在Windows Store设置中,确保SDK是Universal 10。                
        对于目标设备,请留下任何设备进行遮挡显示或切换到HoloLens。
        UWP构建类型(Build type)应为D3D。
        UWP SDK可以留在最新安装(Latest installed)。                
        在调试下检查Unity C#项目。
        单击构建(Build)。
        在文件资源管理器中,单击新建文件夹(New Folder )并命名文件夹“应用程序”。                
        选择“应用”文件夹后,单击“选择文件夹”按钮。
        当Unity完成后,将出现Windows文件浏览器窗口。
        在文件浏览器中打开App文件夹。                
        打开生成的VisualStudio解决方案
        (本例中为MixedRealityIntroduction.sln)

编译Visual Studio解决方案
        最后,我们将编译导出的Visual Studio解决方案,部署它,并在设备上尝试。
        使用Visual Studio中的顶部工具栏,将目标从Debug更改为Release,从ARM更改为X86。
        对于部署到设备与仿真器的说明不同。按照与您的设置相匹配的说明。

通过Wi-Fi部署到混合现实设备
        单击本地计算机按钮旁边的箭头,并将部署目标更改为远程计算机(Remote Machine)。
        输入混合现实设备的IP地址,
        并将其他设备的HoloLens和Windows的认证模式Authentication Mode更改为通用Universal
        (未加密协议 Unencrypted Protocol )。
        单击调试(Debug)>启动而不进行调试(Start without debugging)。
        对于HoloLens,如果这是首次部署到您的设备,则需要使用Visual Studio配对。

通过USB部署到混合现实设备
        确保通过USB电缆插入设备。
        对于HoloLens,单击本地计算机按钮旁边的箭头,并将部署目标更改为设备(Device)。
        要定位连接到PC的遮挡设备,请将设置保留到本地计算机。确保您有混合现实门户运行。
        单击调试>启动而不进行调试。
部署到模拟器
        单击设备按钮旁边的箭头,从下拉列表中选择HoloLens仿真器。
        单击调试(Debug)>启动而不进行调试(Start without debugging)。
        尝试你的应用程序

现在您的应用程序已部署,请尝试移动多维数据集周围,并观察它在您面前的世界。

示例教程

  • 配置有安装正确工具的Windows 10 PC。
  • 配置用于开发的HoloLens设备。
  • 下载示例 (Unity 5.6.2 以上)

Holograms下载地址

开启模拟器

说明
    启动Unity
    选择打开(open)。
    选择刚刚下载的文件夹 打开这个工程 
    保存新场景:文件/将场景另存为。
设置主摄像头
    在“Hierarchy”面板中,选择MainCamera。
    Inspecutor面板将其 rotation 设置为0,0,0。
    找到Clear Flags属性,并将Skybox更改为Solid color。
    点击背景栏打开一个颜色选择器。
    将R,G,B和A设置为0。
设置场景
    在“Hierarchy”面板中,单击“Create”并创建“Empty”。
    右键单击新的GameObject并选择重命名。将GameObject重命名为OrigamiCollection。
    从项目面板中的Holograms文件夹:
    将Stage拖入Hierarchy,成为OrigamiCollection的孩子。
    将Sphere1拖入Hierarchy,成为OrigamiCollection的孩子。
    将Sphere2拖入Hierarchy,成为OrigamiCollection的孩子。
    右键单击“Hierarchy”面板中的“Directional Light”对象,然后选择“delete”。
    从“Holograms”文件夹中,将“Lights”拖动到“Hierarchy”面板的根目录中。
    在Hierarchy中,选择OrigamiCollection。
    在Inspecutor中,将transform设置为(0,-0.5 ,  2.0 )。
    按Unity中的 Play 预览全息图。
    您应该在预览窗口中看到折纸对象。
    按第二次 play 停止预览模式。
将项目从Unity导出到Visual Studio
    在Unity中选择文件(File)>构建设置(Build Settings)。
    在“平台(Platform)”列表中选择Windows Store,然后单击“Switch Platform”。
    将SDK设置为Universal 10,将Build Type设置为D3D。
    检查Unity C#project。
    单击 Add Open Scenes 以添加场景。
    点击Player Settings ....
    在检查面板中选择Windows Store徽标。然后选择Publishing Settings。
    在功能部分(Capabilities)中,选择microphone和SpatialPerception功能。
    回到Build Settings窗口,点击Build。
    创建一个名为“App”的新文件夹。
    单击应用程序文件夹。
    按选择文件夹。
    当Unity完成后,将出现一个File Explorer窗口。
    打开App文件夹。
    打开折纸Visual Studio解决方案。
    使用Visual Studio中的顶部工具栏,将目标从Debug更改为Release,从ARM更改为X86。
    单击设备按钮旁边的箭头,然后选择HoloLens仿真器。
    单击调试 - >启动不调试或按Ctrl + F5。
    一段时间后,仿真器将从折纸工程开始。当首次启动仿真器时,仿真器可能需要长达15分钟才能启动。一旦开始,不要关闭它。

凝视游标

目标
    使用世界锁定的光标可视化您的目光。
说明
    返回到Unity项目,并关闭构建设置窗口(如果它仍然是打开的话)。
    在“project”面板中选择“Holograms”文件夹。
    将Cursor对象拖到  Hierarchy 面板的根目录下。
    双击Cursor对象,仔细观察它。
    右键单击“Project”面板中的“Scripts”文件夹。
    单击创建子菜单。
    选择C#脚本。
    将脚本命名为 WorldCursor。注意:该名称区分大小写。您不需要添加.cs扩展名。
    在“Hierarchy”面板中选择“cursor”对象。
    将WorldCursor脚本拖放到“Inspector”面板中。
    双击WorldCursor脚本在Visual Studio中打开它。
    将此代码复制并粘贴到WorldCursor.cs并全部保存。
  • WorldCursor.cs

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

    public class worldcursor : MonoBehaviour {

            private MeshRenderer meshRenderer ; 
            // Use this for initialization
            void Start () {
                    meshRenderer = this.gameObject.GetComponentInChildren<MeshRenderer>();
            }

            // Update is called once per frame
            void Update () {
                Vector3 headPosition = Camera.main.transform.position;
                Vector3 gazeDirection = Camera.main.transform.forward;

                RaycastHit hitinfo ;
                if(Physics.Raycast(headPosition,gazeDirection,out hitinfo))
                {
                        meshRenderer.enabled = true ;
                        this.transform.position = hitinfo.point ;
                        this.transform.rotation = Quaternion.FromToRotation(Vector3.up ,hitinfo.normal);
                }
                else{
                        meshRenderer.enabled = false ;
                }
            }
    }
从“文件(File)”>“构建设置(Build Settings)”重新构建应用程序。
返回到以前用于部署到仿真器的Visual Studio解决方案。
出现提示时选择“全部重新加载”。
单击调试 - >启动不调试或按Ctrl + F5。
使用Xbox控制器来查看场景。注意光标如何与对象的形状相互作用。

手势

在本章中,我们将添加对手势的支持。
当用户选择纸球时,我们将通过使用Unity的物理引擎打开重力来使球体落下。
目标
    使用选择手势控制全息图。
说明
    我们将首先创建一个脚本,而不是检测到选择手势。
    在脚本文件夹中,创建一个名为GazeGestureManager的脚本。
    将GazeGestureManager脚本拖动到层次结构中的OrigamiCollection对象上。
    在Visual Studio中打开GazeGestureManager脚本并添加以下代码:
  • GazeGestureManager.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.VR.WSA.Input;

    public class GazeGestureManager : MonoBehaviour {

        public static GazeGestureManager Instance { get; private set; }

        // 目前指向的那个全息物体 
        public GameObject FocusedObject { get; private set; }

        GestureRecognizer recognizer;

        // Use this for initialization
        void Start()
        {
            Instance = this;

            // 设置GestureRecognizer以检测选择手势。
            recognizer = new GestureRecognizer();
            //添加监听
            recognizer.TappedEvent += (source, tapCount, ray) =>
            {
                // 发送OnSelect消息到 聚焦对象和他的祖先物体。
                if (FocusedObject != null)
                {
                    FocusedObject.SendMessageUpwards("OnSelect");
                }
            };
            //开始捕获手势
            recognizer.StartCapturingGestures();
        }

        // Update is called once per frame
        void Update()
        {
            // 每一帧去检测聚焦是否在这个物体上 
            GameObject oldFocusObject = FocusedObject;

            // 根据用户的头部位置和方向进行射线投射到世界。
            var headPosition = Camera.main.transform.position;
            var gazeDirection = Camera.main.transform.forward;

            RaycastHit hitInfo;
            if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
            {
                //如果射线射到了全息物体 ,则将其用作聚焦对象。
                FocusedObject = hitInfo.collider.gameObject;
            }
            else
            {
                // 如果射线没有射到物体 ,则将其清空。
                FocusedObject = null;
            }

            // 如果这一帧的聚焦物体改变了 ,则再一次开启捕获新手势
            if (FocusedObject != oldFocusObject)
            {
                recognizer.CancelGestures();
                recognizer.StartCapturingGestures();
            }
        }
    }
    在脚本文件夹中创建另一个脚本,此时命名为SphereCommands。
    在“层次结构”视图中展开OrigamiCollection对象。
    将SphereCommands脚本拖动到“层次结构”面板中的Sphere1对象上。
    将SphereCommands脚本拖动到“层次结构”面板中的Sphere2对象上。
  • SphereCommands.cs

    using UnityEngine;

    public class SphereCommands : MonoBehaviour
    {
        // Called by GazeGestureManager when the user performs a Select gesture
        void OnSelect()
        {
            // If the sphere has no Rigidbody component, add one to enable physics.
            if (!this.GetComponent<Rigidbody>())
            {
                var rigidbody = this.gameObject.AddComponent<Rigidbody>();
                rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
            }
        }
    }
    导出,构建和部署应用程序到HoloLens仿真器。
    环视现场,并围绕其中一个球体。
    按Xbox控制器上的A按钮或按空格键来模拟选择手势。

语音

在本章中,我们将添加两个语音命令的支持:“重置世界”,将丢弃的球体返回到原始位置,并且“放置球体”使球体落下。
目标
    添加始终在后台侦听的语音命令。
    创建一个对语音命令作出反应的全息图。
说明
    在Scripts文件夹中,创建一个名为SpeechManager的脚本。
    将SpeechManager脚本拖动到层次结构中的OrigamiCollection对象上
    在Visual Studio中打开SpeechManager脚本。
    将此代码复制并粘贴到SpeechManager.cs中并全部保存:
  • SpeechManager.cs

    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    using UnityEngine.Windows.Speech;

    public class SpeechManager : MonoBehaviour
    {
        KeywordRecognizer keywordRecognizer = null;
        Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

        // Use this for initialization
        void Start()
        {
            keywords.Add("Reset world", () =>
            {
                // Call the OnReset method on every descendant object.
                this.BroadcastMessage("OnReset");
            });

            keywords.Add("Drop Sphere", () =>
            {
                var focusObject = GazeGestureManager.Instance.FocusedObject;
                if (focusObject != null)
                {
                    // Call the OnDrop method on just the focused object.
                    focusObject.SendMessage("OnDrop");
                }
            });

            // Tell the KeywordRecognizer about our keywords.
            keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

            // Register a callback for the KeywordRecognizer and start recognizing!
            keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
            keywordRecognizer.Start();
        }

        private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
        {
            System.Action keywordAction;
            if (keywords.TryGetValue(args.text, out keywordAction))
            {
                keywordAction.Invoke();
            }
        }
    }
在Visual Studio中打开SphereCommands脚本。
更新脚本,如下所示:
  • SphereCommands.cs

    using UnityEngine;

    public class SphereCommands : MonoBehaviour
    {
        Vector3 originalPosition;

        // Use this for initialization
        void Start()
        {
            // Grab the original local position of the sphere when the app starts.
            originalPosition = this.transform.localPosition;
        }

        // Called by GazeGestureManager when the user performs a Select gesture
        void OnSelect()
        {
            // If the sphere has no Rigidbody component, add one to enable physics.
            if (!this.GetComponent<Rigidbody>())
            {
                var rigidbody = this.gameObject.AddComponent<Rigidbody>();
                rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
            }
        }

        // Called by SpeechManager when the user says the "Reset world" command
        void OnReset()
        {
            // If the sphere has a Rigidbody component, remove it to disable physics.
            var rigidbody = this.GetComponent<Rigidbody>();
            if (rigidbody != null)
            {
                DestroyImmediate(rigidbody);
            }

            // Put the sphere back into its original local position.
            this.transform.localPosition = originalPosition;
        }

        // Called by SpeechManager when the user says the "Drop sphere" command
        void OnDrop()
        {
            // Just do the same logic as a Select gesture.
            OnSelect();
        }
    }
导出,构建和部署应用程序到HoloLens仿真器。
模拟器将支持您的PC麦克风并响应您的声音:调整视图,使光标位于其中一个球体上,并说出“Drop Sphere ”。
说“Reset world”让他们恢复原来的位置。

声音

在本章中,我们将向应用添加音乐,然后在某些操作上触发声音效果。我们将使用空间声音在3D空间中给予声音一个特定的位置。
目标
    在你的世界听到全息图。
说明
    在Unity中选择编辑(Edit)>项目设置(Prokect Settings)>音频(Audio)
    找到Spatializer Plugin设置并选择MS HRTF Spatializer。
    从“Holograms”文件夹中,将“Ambience”对象拖动到“Hierarchy”面板中的“OrigamiCollection”对象上。
    选择OrigamiCollection并找到音频源组件(Audio Source Component)。更改这些属性:
            勾选 Spatialize 属性。
            勾选 Play On Awake。
            通过将 Spatial Blend 滑块一直向右拖动 更改为3D。
            勾选Loop属性。
            展开3D声音设置,并为多普勒等级(Doppler Level)输入0.1。
            将卷滚动设置(Volume Rolloff)为对数滚动(Logarithmic Rolloff.)。
            将最大距离设置(Max Distance)为 20。
    在脚本文件夹中,创建一个名为SphereSounds的脚本。
    将SphereSounds拖动到层次结构中的Sphere1和Sphere2对象。
    在Visual Studio中打开SphereSounds,更新以下代码并全部保存。
  • SphereSounds.cs


    using UnityEngine;

    public class SphereSounds : MonoBehaviour
    {
        AudioSource audioSource = null;
        AudioClip impactClip = null;
        AudioClip rollingClip = null;

        bool rolling = false;

        void Start()
        {
            // 添加一个AudioSource组件并设置一些默认值
            audioSource = gameObject.AddComponent<AudioSource>();
            audioSource.playOnAwake = false;
            audioSource.spatialize = true;
            audioSource.spatialBlend = 1.0f;
            audioSource.dopplerLevel = 0.0f;
            audioSource.rolloffMode = AudioRolloffMode.Logarithmic;
            audioSource.maxDistance = 20f;

            // Load the Sphere sounds from the Resources folder
            impactClip = Resources.Load<AudioClip>("Impact");
            rollingClip = Resources.Load<AudioClip>("Rolling");
        }

        // Occurs when this object starts colliding with another object
        void OnCollisionEnter(Collision collision)
        {
            // 如果球体足够强大,则会产生冲击声。
            if (collision.relativeVelocity.magnitude >= 0.1f)
            {
                audioSource.clip = impactClip;
                audioSource.Play();
            }
        }

        // Occurs each frame that this object continues to collide with another object
        void OnCollisionStay(Collision collision)
        {
            Rigidbody rigid = this.gameObject.GetComponent<Rigidbody>();

            // 如果球体滚动足够快,则会发出滚动的声音。
            if (!rolling && rigid.velocity.magnitude >= 0.01f)
            {
                rolling = true;
                audioSource.clip = rollingClip;
                audioSource.Play();
            }
            // 如果滚动速度减慢,请停止滚动声音。
            else if (rolling && rigid.velocity.magnitude < 0.01f)
            {
                rolling = false;
                audioSource.Stop();
            }
        }

        // Occurs when this object stops colliding with another object
        void OnCollisionExit(Collision collision)
        {
            // 如果物体脱落并停止碰撞,请停止滚动声音。
            if (rolling)
            {
                rolling = false;
                audioSource.Stop();
            }
        }
    }
保存脚本,并返回到Unity。
导出,构建和部署应用程序到HoloLens仿真器。
戴上耳机以获得全面的效果,并从舞台上进一步靠近并听到声音的变化。

空间映射

现在我们将使用空间映射将游戏板放在现实世界中的一个真实物体上。
目标
    把你的真实世界带入虚拟世界。
    将您的全息图放在最重要的位置。
说明
    单击“项目(Project)”面板中的“全息图(Holograms)”文件夹。
    将空间映射资源(Spatial Mapping)拖动到层次结构(Hierarchy)的根目录中。
    单击层次结构(Hierarchy)中的空间映射对象(Spatial Mapping)。
    在“检查器(Inspector)”面板中,更改以下属性:
        检查绘制视觉网格框(Draw Visual Meshes)。
        找到绘制材料(Draw Material ),然后单击右侧的圆圈。在顶部的搜索字段中输入“wireframe”。点击结果,然后关闭窗口。
    导出,构建和部署应用程序到HoloLens仿真器。
    当应用程序运行时,先前扫描的真实客厅的网格将呈现线框。
    看看一个滚动的球体如何从舞台上掉下来,到地板上!
现在我们将向您展示如何将OrigamiCollection移动到新的位置:
    在脚本文件夹中,创建一个名为TapToPlaceParent的脚本。
    在层次结构(Hierarchy)中,展开OrigamiCollection并选择Stage对象。
    将TapToPlaceParent脚本拖放到Stage对象上。
    在Visual Studio中打开TapToPlaceParent脚本,并将其更新为以下内容:
  • TapToPlaceParent.cs


    using UnityEngine;

    public class TapToPlaceParent : MonoBehaviour
    {
        bool placing = false;

        // 当用户执行选择手势时,由GazeGestureManager调用
        void OnSelect()
        {
            // 在每个选择手势上,切换用户是否处于放置模式。
            placing = !placing;

            // 如果用户处于放置模式,则显示空间映射网格。
            if (placing)
            {
                SpatialMapping.Instance.DrawVisualMeshes = true;
            }
            // 如果用户不处于放置模式,请隐藏空间映射网格。
            else
            {
                SpatialMapping.Instance.DrawVisualMeshes = false;
            }
        }

        // Update is called once per frame
        void Update()
        {
            // 如果用户处于放置模式,请更新该位置以匹配用户的注视。

            if (placing)
            {
                // 做一个raycast到世界只会打到空间映射网格。
                var headPosition = Camera.main.transform.position;
                var gazeDirection = Camera.main.transform.forward;

                RaycastHit hitInfo;
                if (Physics.Raycast(headPosition, gazeDirection, out hitInfo,
                    30.0f, SpatialMapping.PhysicsRaycastMask))
                {
                    //将此对象的父对象移动到射线播放到空间映射网格的位置。
                    this.transform.parent.position = hitInfo.point;

                    // 旋转该对象的父对象以面对用户。
                    Quaternion toQuat = Camera.main.transform.localRotation;
                    toQuat.x = 0;
                    toQuat.z = 0;
                    this.transform.parent.rotation = toQuat;
                }
            }
        }
    }
导出,构建和部署应用程序。
现在,您应该可以通过使用选择手势(A或空格键)将游戏放在特定位置,然后移动到新位置,然后再次使用选择手势。