網頁

顯示具有 HoloLens-Holotoolkit 標籤的文章。 顯示所有文章
顯示具有 HoloLens-Holotoolkit 標籤的文章。 顯示所有文章

2018年8月4日 星期六

解決Mixed Reality Capture的延遲問題

這個問題頗為重要又相當棘手,但實際上早在一兩年前,
有些程式高手已經解決,並且將解法免費分享在GitHub上。

想要看到戴HoloLens眼鏡的人看到些什麼,一般可以用電腦開啟網路瀏覽器,
並且以網路連線HoloLens,就可以開啟Device Portal,
觀看Hologram與環境疊合後的混合實境結果。

可是,這項功能所看到的畫面向來會延遲個4-5秒鐘,
這對於APP展示或Oral Presentation非常不便。

後來,找到了一個已經早早被分享出來的解法。
在GitHub上有人分享一套稱為MixedRealityCompanionKit的套件,
裏頭有許多好用的小東西,其中的MixedRemoteViewCompositor就可以解決延遲的問題。

2018年6月27日 星期三

場景切換後按鈕點擊一次變成兩次

我使用HoloToolkit提供的ButtonHolographic這個Button,
並且在裏頭寫了一些我希望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日 星期五

HoloLens 的 sharing 功能

在網路上可以找到的多人共享功能與文件,少之又少。
所以這個問題花了我頗多時間,才能完全搞懂他的邏輯。

為了解這個問題,主要從三個方向進行:

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功能,會因為沒有麥克風而無法測試。




2018年5月31日 星期四

使用HoloToolkit 加入cursor

當我們在舞台上放上物件後,以視線選取物件時,
會需要有個cursor可以黏在物件上,代表視線是否在物體上。

這時候必須使用Cursor這個prefab
請至 HoloToolkit → Input → prefabs → Cursor 取用



把他拖曳到舞台上。

其實拖曳上來就可以使用,但為了培養好習慣,
最好還是整理一下舞台上的東西,把跟I/O有關的東西,一併整理到Managers裡。



有cursor可以使用之後,視線移動到哪裡,cursor就會出現在那裏。
使用上算是相當輕鬆容易的喔!

使用 HoloToolkit 的 button prefabs

HoloToolkit裏頭有一些按鈕UI可以使用,我覺得以下這兩個挺不錯的,就拿來試試。

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 [連結]

2018年4月21日 星期六

HoloLens的環境辨識功能


HoloLens是一套混合實境(mixed reality)眼鏡,
其特別之處就是能對物理環境進行感知,
辨識後甚至能分辨出牆面、地板與可放置物體的平面等。

使用者能將虛擬生成的全像圖形(hologram)以符合環境條件的方式放置入環境中,
這種讓使用者同時感受到虛擬全像物體以及日常物理實景,
兩者共同塑造出來的環境,稱為混合實境。

以下介紹HoloLens的環境辨識功能,它不僅能分辨出環境中足以遮蔽阻擋的表面出來,
也可以分辨這些表面為牆面、地板或者是大到足以放置物體的平面等。