Microsoft HoloLens開發入門


本帖最後由 geekli 於 2017-4-11 15:53 編輯

AR開發者交流羣:605785368windows


AR開發者社區:app



第一部分:開發要求

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上啓用硬件虛擬化。


詳細步驟請看: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/downloadside

4.安裝HoloLens emulator(https://developer.microsoft.com/en-us/windows/mixed-reality/hololens_emulator_archive)


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



第三部分:關於Hololens 模擬器


HoloLens模擬器容許你在沒有Hololens的狀況下在PC上測試全息應用程序,並附帶Hololens開發工具集。仿真器使用Hyper-V虛擬機。
關於輸入:
  • 向前,向後,向左和向右走 - 使用鍵盤上的W,A,S和D鍵或Xbox控制器上的左鍵。
  • 查找向上,向下,向左和向右 - 單擊並拖動鼠標,使用鍵盤上的箭頭鍵或Xbox控制器上的右鍵。
  • 空氣敲擊手勢 - 右鍵單擊鼠標,按鍵盤上的Enter鍵,或使用Xbox控制器上的A按鈕。
  • 綻開手勢 - 按鍵盤上的Windows鍵或F2鍵,或按Xbox控制器上的B按鈕。手動移動滾動 - 按住Alt鍵,按住鼠標右鍵,向上/向下拖動鼠標,或者在Xbox控制器中按住右側觸發器和A按鈕,向上和向下移動右側手柄。

關於工具欄:工具

在主窗口的右側,您將找到仿真器工具欄。工具欄包含如下按鈕:post

  • 關閉:關閉模擬器。
  • 最小化:最小化仿真器窗口。
  • 人工輸入:鼠標和鍵盤用於模擬模擬器的人工輸入。
  • 鍵盤和鼠標輸入:鍵盤和鼠標輸入直接傳遞到HoloLens操做系統做爲鍵盤和鼠標事件,就像鏈接了藍牙鍵盤和鼠標同樣。
  • 適合屏幕:適合模擬器屏幕。
  • 縮放:使仿真器愈來愈大。
  • 幫助:打開模擬器幫助。
  • 打開設備門戶:在仿真器中打開HoloLens OS的Windows設備門戶。
  • 工具:打開「 其餘工具 」窗格。



第四部分:開發----Hello,HoloLens!

首先咱們在unity中新建一個項目,接着添加一個簡單的3D模型進行測試,好比:






接着部署Windows Store







接着,點擊Build,生成VS項目:




啓動VS:








通常默認狀況下,從Unity導出的UWP應用程序在任何Windows 10設備上運行。因爲HoloLens是不一樣的,應用程序應該利用僅在HoloLens上可用的功能。爲此,您須要在Visual Studio TargetDeviceFamily中的Package.appxmanifest文件中設置爲「Windows.Holographic」 ,以下:
接下來,就能夠運行啦:

第五部分:輸入事件總結


1.GAZE凝視操做


在Hololens中,使用的是用戶的頭部位置與方向來gaze,而不是眼睛。

示例代碼(PS:核心在於RayCast):

[C#] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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.手勢輸入




[C#] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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.語音輸入




using System.Collections.Generic;開發工具

using System.Linq;測試

using UnityEngine;ui

using UnityEngine.Windows.Speech;this

public class SpeechManager : MonoBehaviourspa

{

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.音頻輸入


相關文章
相關標籤/搜索