這個問題頗為重要又相當棘手,但實際上早在一兩年前,
有些程式高手已經解決,並且將解法免費分享在GitHub上。
想要看到戴HoloLens眼鏡的人看到些什麼,一般可以用電腦開啟網路瀏覽器,
並且以網路連線HoloLens,就可以開啟Device Portal,
觀看Hologram與環境疊合後的混合實境結果。
可是,這項功能所看到的畫面向來會延遲個4-5秒鐘,
這對於APP展示或Oral Presentation非常不便。
後來,找到了一個已經早早被分享出來的解法。
在GitHub上有人分享一套稱為MixedRealityCompanionKit的套件,
裏頭有許多好用的小東西,其中的MixedRemoteViewCompositor就可以解決延遲的問題。
2018年8月4日 星期六
2018年6月27日 星期三
場景切換後按鈕點擊一次變成兩次
我使用HoloToolkit提供的ButtonHolographic這個Button,
並且在裏頭寫了一些我希望Button做的事,
其中該具備的各項功能與參數都已經寫好並測試好。
豈知,在不同場景之間互相切換之後,卻碰出一個詭異到不行的問題。
問題是:明明對button做一次的click,可是他卻變成兩次click。
於是只好到處看論壇,找找看是否有人跟我遇到相同問題。
在GitHub論壇[連結],我找到了這篇貼文:InputManager causing UI events to fire twice
這個解法是被動式的解法,嚴格說並非求甚解而得,
但短期內還得仰仗HoloToolkit的prefab的前提下,這是最快而且可解決問題的作法。
並且在裏頭寫了一些我希望Button做的事,
其中該具備的各項功能與參數都已經寫好並測試好。
豈知,在不同場景之間互相切換之後,卻碰出一個詭異到不行的問題。
問題是:明明對button做一次的click,可是他卻變成兩次click。
於是只好到處看論壇,找找看是否有人跟我遇到相同問題。
在GitHub論壇[連結],我找到了這篇貼文:InputManager causing UI events to fire twice
這篇貼文與討論,高手如雲。
我最後是用以下這段程式碼解決的。
概念上是這樣的,一旦他偵測到兩個click之間的間隔時間太短,就不執行這個function。
所以第一個click抓到之後,第二個如果時間間隔太近,就離開function。
如此,就如同只發生一個click而已。
private float lastClickTime = 0; private float debounceDelay = 0.005f; public void OnInputClicked(InputClickedEventData eventData) { if(Time.time - lastClickTime < debounceDelay) { return; } lastClickTime = Time.time; // do stuff }
這個解法是被動式的解法,嚴格說並非求甚解而得,
但短期內還得仰仗HoloToolkit的prefab的前提下,這是最快而且可解決問題的作法。
2018年6月22日 星期五
2018年6月13日 星期三
使用HoloToolkit 做聲音控制- KeywordManager.cs
聊一下Voice command的使用,我手邊使用的兩本書,
關於聲控這項功能,寫的範例都是要先把視線(gaze)移至某處後,然後說"Select",接著看做什麼事。
而這次我需要聲控,就是因為要讓使用者輕鬆的做操作,所以不需要把視線(gaze)的情況考量進去。
上網找了一下資源,我找到這個參考資源 [連結] 裏頭有voice command的設定步驟。因為我所使用的HoloToolkit版本找不到KeywordManager.cs這個script,所以我另外到 GitHub搜尋,並下載來使用KeywordManager.cs [下載]。
使用的邏輯很簡單,先透過他的KeywordManager.cs,以介面的方式設定好你需要的口語指令。

需要口語指令的個數,指定在Size裡面。(上圖範例是4個)
口語指令是什麼,寫在Keyword裡面。(上圖範例有Previous, Play, Next, Stop)
說出指令後,要做的事情必須寫在某個Game Object裏頭的Script裏頭
並且以全域方式寫function,如下:
public void name (){
敘述;
}
Script 寫好之後,再把口語指令說出之後要做的function,指定進去。
(上圖範例btnPlay是事先寫好的GameObject,btn_Play.myPlayDo是該function)
使用心得:
1. Visual Studio 跟 Unity 的連動,有點慢,如果你寫好的function未即時呈現再Unity裡面
其實,再稍微等一下下就會出現了。
2. Voice command的功能得要把專案整個發佈到HoloLens上才能測試。
使用Holographic Emulation功能,會因為沒有麥克風而無法測試。
關於聲控這項功能,寫的範例都是要先把視線(gaze)移至某處後,然後說"Select",接著看做什麼事。
而這次我需要聲控,就是因為要讓使用者輕鬆的做操作,所以不需要把視線(gaze)的情況考量進去。
上網找了一下資源,我找到這個參考資源 [連結] 裏頭有voice command的設定步驟。因為我所使用的HoloToolkit版本找不到KeywordManager.cs這個script,所以我另外到 GitHub搜尋,並下載來使用KeywordManager.cs [下載]。
使用的邏輯很簡單,先透過他的KeywordManager.cs,以介面的方式設定好你需要的口語指令。

需要口語指令的個數,指定在Size裡面。(上圖範例是4個)
口語指令是什麼,寫在Keyword裡面。(上圖範例有Previous, Play, Next, Stop)
說出指令後,要做的事情必須寫在某個Game Object裏頭的Script裏頭
並且以全域方式寫function,如下:
public void name (){
敘述;
}
Script 寫好之後,再把口語指令說出之後要做的function,指定進去。
(上圖範例btnPlay是事先寫好的GameObject,btn_Play.myPlayDo是該function)
使用心得:
1. Visual Studio 跟 Unity 的連動,有點慢,如果你寫好的function未即時呈現再Unity裡面
其實,再稍微等一下下就會出現了。
2. Voice command的功能得要把專案整個發佈到HoloLens上才能測試。
使用Holographic Emulation功能,會因為沒有麥克風而無法測試。
2018年5月31日 星期四
使用HoloToolkit 加入cursor
使用 HoloToolkit 的 button prefabs
HoloToolkit裏頭有一些按鈕UI可以使用,我覺得以下這兩個挺不錯的,就拿來試試。
HoloToolkit-Example → UX → prefabs → ButtonHolographic (這是一個prefab)
HoloToolkit-Example → UX → prefabs → ButtonPush (這是一個prefab)
特別是 ButtonHolographic,很容易修改圖示與文字,以下就特別介紹他的使用方式。
這個按鈕可以修改圖示

按鈕也可以修改文字

使用上算是輕鬆容易的。
但今天使用上遇到一件有點難懂的問題,琢磨了好久才想通處理掉。
問題是這樣的:照理說,紫色的cursor碰到按鈕時會變亮,代表按鈕受到關注。

但不知道為什麼,cursor滑過按鈕,卻無法讓按鈕變亮起來。

猜測應該是按鈕跟舞台在景深方向上重疊,所以cursor無法區分舞台與按鈕。

果不其然,把舞台以及按鈕之間的景深距離拉遠,cursor滑過按鈕,按鈕就可以變亮。

以上作個紀錄!
----------------------------------------------------
HoloToolkit-Example → UX → prefabs → ButtonHolographic (這是一個prefab)
HoloToolkit-Example → UX → prefabs → ButtonPush (這是一個prefab)
特別是 ButtonHolographic,很容易修改圖示與文字,以下就特別介紹他的使用方式。
這個按鈕可以修改圖示

按鈕也可以修改文字

使用上算是輕鬆容易的。
但今天使用上遇到一件有點難懂的問題,琢磨了好久才想通處理掉。
問題是這樣的:照理說,紫色的cursor碰到按鈕時會變亮,代表按鈕受到關注。

但不知道為什麼,cursor滑過按鈕,卻無法讓按鈕變亮起來。

猜測應該是按鈕跟舞台在景深方向上重疊,所以cursor無法區分舞台與按鈕。

果不其然,把舞台以及按鈕之間的景深距離拉遠,cursor滑過按鈕,按鈕就可以變亮。

以上作個紀錄!
----------------------------------------------------
後記:
後來,比較熟悉Unity的架構之後,才知道原來是碰撞體(Collider)造成。
視線方向與碰撞體在空間中有交集後,游標(cursor)才能hug在碰撞體上面,並加以顯示出來。
碰撞體是附屬在遊戲物件的component,通常是透明的,
必須點擊後才能修改大小、形狀、位置。
Unity提供的碰撞體很多,有2D,也有3D,形狀上好像還有膠囊狀、矩形狀之類的。
這個場景中的遊戲物件有點多,包含:人物、舞台、按鈕。
人物,有人物的碰撞體;舞台,有舞台的碰撞體;按鈕有按鈕的碰撞體。
這裡所碰到到情況是,這多個遊戲物件彼此間的碰撞體太大,導致互相重疊。
把舞台等物與按鈕的距離拉遠,以致可以判斷視線與碰撞體的交集。
自然,游標就可以顯示出來了。
這個原理,也就是關於視線方向、碰撞、與顯示cursor之間的關係,
後來在寫手機的程式時,英文論壇上有人仔細討論一番,便知道原因了。
2018年5月25日 星期五
[HoloLens] 偵測 airtap手勢
在HoloLens的使用上,airtap手勢等同於滑鼠的click事件,其重要性不在話下。
我參考這篇文章 [連結],成功抓到airtap的事件驅動方式,而且非常容易。
1. 首先,假設您的Unity已經灌好HoloTookKit,那麼可以試著去找InputTapTest這個scene
他的位置可能在 HoloToolkit\Input\Test\Scenes\InputTapTest
此Scene裏頭有個cube,你可以airtap那個cube,那個cube會變大。
2. 接著,可以到 HoloToolkit-Example/Input/Script/ 找TapResponder.cs
把這個script檔案指給舞台上的物件,測試時直接對該物件airtap,該物件會放大。
3. 複製TapResponder.cs,並依照您的需求加以修改,即可。
參考資料
HoloToolkit Unity - Gaze and Airtap [連結]
我參考這篇文章 [連結],成功抓到airtap的事件驅動方式,而且非常容易。
1. 首先,假設您的Unity已經灌好HoloTookKit,那麼可以試著去找InputTapTest這個scene
他的位置可能在 HoloToolkit\Input\Test\Scenes\InputTapTest
此Scene裏頭有個cube,你可以airtap那個cube,那個cube會變大。
2. 接著,可以到 HoloToolkit-Example/Input/Script/ 找TapResponder.cs
把這個script檔案指給舞台上的物件,測試時直接對該物件airtap,該物件會放大。
3. 複製TapResponder.cs,並依照您的需求加以修改,即可。
參考資料
HoloToolkit Unity - Gaze and Airtap [連結]
2018年4月21日 星期六
HoloLens的環境辨識功能
HoloLens是一套混合實境(mixed reality)眼鏡,
其特別之處就是能對物理環境進行感知,
辨識後甚至能分辨出牆面、地板與可放置物體的平面等。
使用者能將虛擬生成的全像圖形(hologram)以符合環境條件的方式放置入環境中,
這種讓使用者同時感受到虛擬全像物體以及日常物理實景,
兩者共同塑造出來的環境,稱為混合實境。
以下介紹HoloLens的環境辨識功能,它不僅能分辨出環境中足以遮蔽阻擋的表面出來,
也可以分辨這些表面為牆面、地板或者是大到足以放置物體的平面等。
訂閱:
文章 (Atom)

