开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1876

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 3812|回复: 22

[AR酱] Microsoft HoloLens开发入门

[复制链接]  [移动端链接]
排名
1686
昨日变化
1

20

主题

243

帖子

1421

积分

Rank: 9Rank: 9Rank: 9

UID
156756
好友
11
蛮牛币
1280
威望
0
注册时间
2016-7-13
在线时间
466 小时
最后登录
2017-9-12

专栏作家

发表于 2017-4-11 15:45:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
第一部分:开发要求

Hololens 运行与Win10,应用程序是与UWP(通用windows开发平台)构建的,开发Hololens 这样的全息体验对电脑的配置要求也是相当高的。

硬件配置:

1.64位Windows 10专业版,企业版或教育版(家庭版不支持Hyper-V)
2.64位CPU
3.8GB以上的RAM
4.在BIOS中,必须具备以下功能:

  • 硬件辅助虚拟化
  • 二级地址转换(SLAT)
  • 基于硬件的数据执行保护(DEP)

5.对于GPU,需DirectX 11.0或更高版本,WDDM 1.2驱动程序或更高版本

关于Hyper-V,它是微软的一款虚拟化产品,采用类似Vmware和Citrix开源Xen一样的基于hypervisor的技术。



第二部分:安装

1.启用虚拟化,即在PC上启用硬件虚拟化。
1.png

详细步骤请看:https://msdn.microsoft.com/library/windows/apps/jj863509(v=vs.105).aspx

2.启用Hyper-V
3.安装Visual Studio 2017Visual Studio 2015 Update3https://developer.microsoft.com/en-us/windows/downloads

2.png


5.安装Unity  (https://unity3d.com/cn/get-unity/download)


关于详细的安装视频,可以看看老外的这个教程:






第三部分:关于Hololens 模拟器

3.png

HoloLens模拟器允许你在没有Hololens的情况下在PC上测试全息应用程序,并附带Hololens开发工具集。仿真器使用Hyper-V虚拟机。

关于输入:

  • 向前,向后,向左和向右走 - 使用键盘上的W,A,S和D键或Xbox控制器上的左键。
  • 查找向上,向下,向左和向右 - 单击并拖动鼠标,使用键盘上的箭头键或Xbox控制器上的右键。
  • 空气敲击手势 - 右键单击鼠标,按键盘上的Enter键,或使用Xbox控制器上的A按钮。
  • 绽放手势 - 按键盘上的Windows键或F2键,或按Xbox控制器上的B按钮。手动移动滚动 - 按住Alt键,按住鼠标右键,向上/向下拖动鼠标,或者在Xbox控制器中按住右侧触发器和A按钮,向上和向下移动右侧手柄。

关于工具栏:



在主窗口的右侧,您将找到仿真器工具栏。工具栏包含以下按钮:


  • 关闭:关闭模拟器。
  • 最小化:最小化仿真器窗口。
  • 人工输入:鼠标和键盘用于模拟模拟器的人工输入。
  • 键盘和鼠标输入:键盘和鼠标输入直接传递到HoloLens操作系统作为键盘和鼠标事件,就像连接了蓝牙键盘和鼠标一样。
  • 适合屏幕:适合模拟器屏幕。
  • 缩放:使仿真器越来越大。
  • 帮助:打开模拟器帮助。
  • 打开设备门户:在仿真器中打开HoloLens OS的Windows设备门户。
  • 工具:打开“ 其他工具 ”窗格。




第四部分:开发----Hello,HoloLens!

首先我们在unity中新建一个项目,接着添加一个简单的3D模型进行测试,比如:

4.png



5.png



接着部署Windows Store


6.png



7.png



接着,点击Build,生成VS项目:


8.png



启动VS:

9.png



10.png



一般默认情况下,从Unity导出的UWP应用程序在任何Windows 10设备上运行。由于HoloLens是不同的,应用程序应该利用仅在HoloLens上可用的功能。为此,您需要在Visual Studio TargetDeviceFamily中的Package.appxmanifest文件中设置为“Windows.Holographic” ,如下:

11.png

接下来,就可以运行啦:
12.png

13.png




第五部分:输入事件总结


1.GAZE凝视操作
14.png

在Hololens中,使用的是用户的头部位置与方向来gaze,而不是眼睛。


示例代码(PS:核心在于RayCast):

[C#] 纯文本查看 复制代码
using UnityEngine;

public class WorldCursor : MonoBehaviour
{
  private MeshRenderer meshRenderer;

  // Use this for initialization
  void Start()
  {
    // Grab the mesh renderer that's on the same object as this script.
    meshRenderer = this.gameObject.GetComponentInChildren<MeshRenderer>();
  }

  // Update is called once per frame
  void Update()
  {
    // Do a raycast into the world based on the user's
    // head position and orientation.
    var headPosition = Camera.main.transform.position;
    var gazeDirection = Camera.main.transform.forward;

    RaycastHit hitInfo;

    if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
    {
      // If the raycast hit a hologram...
      // Display the cursor mesh.
      meshRenderer.enabled = true;

      // Move the cursor to the point where the raycast hit.
      this.transform.position = hitInfo.point;

      // Rotate the cursor to hug the surface of the hologram.
      this.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
    }
    else
    {
      // If the raycast did not hit a hologram, hide the cursor mesh.
      meshRenderer.enabled = false;
    }
  }
}






2.手势输入


15.png



[C#] 纯文本查看 复制代码
using UnityEngine;
using UnityEngine.VR.WSA.Input;

public class GazeGestureManager : MonoBehaviour
{
  public static GazeGestureManager Instance { get; private set; }

  // Represents the hologram that is currently being gazed at.
  public GameObject FocusedObject { get; private set; }

  GestureRecognizer recognizer;

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

    // Set up a GestureRecognizer to detect Select gestures.
    recognizer = new GestureRecognizer();
    recognizer.TappedEvent += (source, tapCount, ray) =>
    {
      // Send an OnSelect message to the focused object and its ancestors.
      if (FocusedObject != null)
      {
        FocusedObject.SendMessageUpwards("OnSelect");
      }
    };
    recognizer.StartCapturingGestures();
  }

  // Update is called once per frame
  void Update()
  {
    // Figure out which hologram is focused this frame.
    GameObject oldFocusObject = FocusedObject;

    // Do a raycast into the world based on the user's
    // head position and orientation.
    var headPosition = Camera.main.transform.position;
    var gazeDirection = Camera.main.transform.forward;

    RaycastHit hitInfo;
    if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
    {
      // If the raycast hit a hologram, use that as the focused object.
      FocusedObject = hitInfo.collider.gameObject;
    }
    else
    {
      // If the raycast did not hit a hologram, clear the focused object.
      FocusedObject = null;
    }

    // If the focused object changed this frame,
    // start detecting fresh gestures again.
    if (FocusedObject != oldFocusObject)
    {
      recognizer.CancelGestures();
      recognizer.StartCapturingGestures();
    }
  }
}



3.语音输入


16.png



[C#] 纯文本查看 复制代码
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 Object", () =>
    {
      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();
    }
  }
}




4.音频输入
17.png



[C#] 纯文本查看 复制代码
using UnityEngine;

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

  bool rolling = false;

  void Start()
  {
    // Add an AudioSource component and set up some defaults
    audioSource = gameObject.AddComponent<AudioSource>();
    audioSource.playOnAwake = false;
    audioSource.spatialize = true;
    audioSource.spatialBlend = 1.0f;
    audioSource.dopplerLevel = 0.0f;
    audioSource.rolloffMode = AudioRolloffMode.Custom;

    // 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)
  {
    // Play an impact sound if the sphere impacts strongly enough.
    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>();

    // Play a rolling sound if the sphere is rolling fast enough.
    if (!rolling && rigid.velocity.magnitude >= 0.01f)
    {
      rolling = true;
      audioSource.clip = rollingClip;
      audioSource.Play();
    }
    // Stop the rolling sound if rolling slows down.
    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)
  {
    // Stop the rolling sound if the object falls off and stops colliding.
    if (rolling)
    {
      rolling = false;
      audioSource.Stop();
    } 
  }
}







回复

使用道具 举报

7日久生情
2350/5000
排名
2471
昨日变化
5

0

主题

1525

帖子

2350

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
94526
好友
0
蛮牛币
1478
威望
0
注册时间
2015-4-22
在线时间
375 小时
最后登录
2017-9-25
发表于 2017-4-12 08:41:19 | 显示全部楼层
感谢楼主分享

回复

使用道具 举报

5熟悉之中
651/1000
排名
2938
昨日变化
9

4

主题

73

帖子

651

积分

Rank: 5Rank: 5

UID
127539
好友
0
蛮牛币
3217
威望
0
注册时间
2015-11-1
在线时间
192 小时
最后登录
2017-9-25
QQ
发表于 2017-4-13 08:53:00 | 显示全部楼层
太有用了,收藏了

回复

使用道具 举报

3偶尔光临
188/300
排名
14634
昨日变化
12

0

主题

123

帖子

188

积分

Rank: 3Rank: 3Rank: 3

UID
180119
好友
0
蛮牛币
167
威望
0
注册时间
2016-11-2
在线时间
31 小时
最后登录
2017-9-9
发表于 2017-4-13 11:33:23 | 显示全部楼层
Thanks for sharing

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1336/1500
排名
1620
昨日变化
8

26

主题

320

帖子

1336

积分

Rank: 6Rank: 6Rank: 6

UID
89788
好友
1
蛮牛币
2552
威望
0
注册时间
2015-4-7
在线时间
352 小时
最后登录
2017-9-25
发表于 2017-4-17 14:51:24 | 显示全部楼层
等什么时候有设备再看。。。
[发帖际遇]: 被游戏打的佑子 在论坛发帖时没有注意,被小偷偷去了 2 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
816/1000
排名
3286
昨日变化
1

4

主题

164

帖子

816

积分

Rank: 5Rank: 5

UID
182321
好友
0
蛮牛币
-3
威望
0
注册时间
2016-11-9
在线时间
306 小时
最后登录
2017-8-31
发表于 2017-4-19 09:14:37 | 显示全部楼层
高端,高端,高端。

回复

使用道具 举报

7日久生情
1970/5000
排名
992
昨日变化
1

3

主题

406

帖子

1970

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
46577
好友
1
蛮牛币
2383
威望
0
注册时间
2014-9-24
在线时间
695 小时
最后登录
2017-9-21
发表于 2017-4-19 14:09:01 | 显示全部楼层
可以可以,虽然现在用不上,但是对了解很有用

回复 支持 反对

使用道具 举报

4四处流浪
499/500
排名
9119
昨日变化
2

0

主题

307

帖子

499

积分

Rank: 4

UID
161170
好友
0
蛮牛币
775
威望
0
注册时间
2016-8-8
在线时间
104 小时
最后登录
2017-9-12
发表于 2017-4-20 16:05:27 | 显示全部楼层
66666666666666

回复

使用道具 举报

4四处流浪
499/500
排名
9119
昨日变化
2

0

主题

307

帖子

499

积分

Rank: 4

UID
161170
好友
0
蛮牛币
775
威望
0
注册时间
2016-8-8
在线时间
104 小时
最后登录
2017-9-12
发表于 2017-4-24 14:07:59 来自Mobile--- | 显示全部楼层
真是太好了

回复

使用道具 举报

3偶尔光临
164/300
排名
9013
昨日变化
10

1

主题

53

帖子

164

积分

Rank: 3Rank: 3Rank: 3

UID
8296
好友
0
蛮牛币
350
威望
0
注册时间
2013-11-17
在线时间
22 小时
最后登录
2017-5-18
发表于 2017-5-2 08:46:43 | 显示全部楼层
跑跑试试看哦{:87:}

回复 支持 反对

使用道具 举报

2初来乍到
102/150
排名
51131
昨日变化
561

0

主题

70

帖子

102

积分

Rank: 2Rank: 2

UID
35028
好友
0
蛮牛币
17
威望
0
注册时间
2014-7-18
在线时间
30 小时
最后登录
2017-9-21
发表于 2017-5-3 09:14:23 | 显示全部楼层
感觉还不错呀.

回复

使用道具 举报

6蛮牛粉丝
1020/1500
排名
2391
昨日变化
9

8

主题

96

帖子

1020

积分

Rank: 6Rank: 6Rank: 6

UID
164216
好友
0
蛮牛币
2832
威望
0
注册时间
2016-8-25
在线时间
454 小时
最后登录
2017-9-25
发表于 2017-5-3 11:37:35 | 显示全部楼层
马克一下 感谢楼主

回复 支持 反对

使用道具 举报

4四处流浪
424/500
排名
6550
昨日变化
66

1

主题

106

帖子

424

积分

Rank: 4

UID
56110
好友
0
蛮牛币
394
威望
0
注册时间
2014-11-18
在线时间
169 小时
最后登录
2017-9-25
发表于 2017-5-4 09:06:45 | 显示全部楼层
好东西 学习学习 支持

回复 支持 反对

使用道具 举报

5熟悉之中
664/1000
排名
2950
昨日变化
3

0

主题

118

帖子

664

积分

Rank: 5Rank: 5

UID
47200
好友
0
蛮牛币
1015
威望
0
注册时间
2014-9-29
在线时间
167 小时
最后登录
2017-8-23
发表于 2017-5-4 22:06:47 | 显示全部楼层
感谢楼主分享

回复

使用道具 举报

排名
23041
昨日变化
23

4

主题

25

帖子

75

积分

Rank: 2Rank: 2

UID
217789
好友
0
蛮牛币
87
威望
0
注册时间
2017-4-14
在线时间
34 小时
最后登录
2017-9-22
发表于 2017-5-21 13:37:49 | 显示全部楼层
可以哦  看一个

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表