一、預設體
1、 Cursor:光標,遊標,類似於pc端的鼠標,在holokit中它包含了很多的種類
DefaultCursor一個基本的光標 ,類似於hololens界面中的光標,一般是白色的圈,點擊的時候是一個白點,自帶燈光和動畫,分爲三種狀態 激活狀態,禁用狀態,取消狀態。
Cursor 集成在holokit中的光標,集成了Cursor類中的四種不同的光標狀態。
BasicCursor 是集成在holokit中最基本的光標,他是藍色的。
CursorWithFeedback 一個自帶反饋的光標,也就是說他可以反饋當前物體的各種狀態,例如旋轉狀態的時候是一個旋轉的光標。
2. FPSDisplay:是一個反饋當前場景的FPS值的預製體。 畫面每秒傳輸的幀數
3. HoloLensCamera:一個已經集成好的hololens相機。這個相機自帶一個用於控制鏡頭運動的腳本。
4. inputManager:是一個集成了凝視,手勢輸入,穩定相機抖動,手勢管理的預製體。
5. Directional Light:是一個集成了通用環境下的hololens適用的燈光系統。
6. InputManager:輸入管理的類,下面解析他裏面腳本的用法,首先是
GazeManager:他的作用是凝視的經理, 管理着與其他物體相互作用的凝視光線。
Singleton是一個全局管理的單例,如果你在holok上快速開發你的項目,這是一個很好的捷徑,他已經規避了很多的風險,但是還是要謹慎的使用。
IsGazingAtObject是一個bool值,你可以通過判斷這個值的true或者false來決定當前是否凝視在某個物體上。
HitInfo 是公用的射線,這是一個很重要的屬性,通過外部用RaycastHit m_ray = hitInfo;這種方式來鏈接這個射線。 HitObject這是當前凝視的對象,你可以判斷這個值是否爲null來做一些很必要的操作。
HitPosition凝視的位置。
GazeOrigin凝視的來源。
GazeNormal正常凝視的時候。
MaxGazeCollisionDistance凝視與物體接觸的最大距離,這個值是10,再大的值沒有經過測量。
RaycastLayerMasks層?Yes,No()=>Yes。Stabilizer當前一個固定的方法(A),用於消除凝視射線產生的數據 這個方法其實是手勢的處理。如果這裏不做處理,就不會根據碰撞或者觸發來判斷,如果當前是離開的話,就不會執行這個A方法。 GazeTransform當前凝視的來源和位置,默認是相機發出來的。
FocusedObjectChanged當焦點一直處於某個對象或者更換了對象之後。
raycastResultList一個射線的集合。
UnityUIPointerEvent UI指針事件,如果你沒有調用他,it isNull;在他的實現方法中,所有的凝視都是實時更新的,而且要處理UI層,以及當前凝視物體的狀態和物體的更新。
GazeStabilizer :一個穩固凝視放置光標抖動的類。他的功能大概就是如此。
二、unity 中HoloTookit 的接口
IFocusable 凝視(進入和退出)類似鼠標的OnMouseEnter和Exit
IHoldHandler (一個保持手勢)比如說一直抓着。他是wins的持有手勢。當你開始抓的時候,正在抓的時候,抓完了,抓的過程中掉了
IInputClickHandler(點擊手勢)所有的點功能都在這裏面實現,類似click
INavigationHandler(導航手勢)這裏的導航手勢是用於旋轉或者物體移動狀態改變的
IInputHandler(輸入手勢)類似鍵盤的按下 擡起 點擊
IInputSource (輸入源)當檢測到的時候 當丟失的時候,比如說,當你的手舉起來的時候hololens檢測到了你的手,當你吧手垂下的時候hololens丟 失了你的手
IManipulationHandler (操作手勢)這個手勢一般是移動物體或者改變他的移動狀態的
ISpeechHandler(語音)如果你要實現語音。so->this
ISourceStateHandler(輸入源狀態)
在這裏holokit給我們提供了一個腳本叫做 HandDraggable 他能夠實現拖拽的功能。或許你有時候只需要對她稍微修改,他就可以實現你想要的功能。
二、unity 中HoloTookit 的腳本 詳解:https://blog.csdn.net/wdmzjzlym/article/details/53812615
這個文件夾下包含了很多通用的腳本,這裏試試大概說明其功能,具體的參數需要自己翻譯。
Billboard 讓一個物體總是面對着攝像頭。
interPolationUtilities 有一些插值相關的靜態方法
interpolator 提供了一些移動 旋轉 縮放的差值。他的用法會在後面的空間聲音詳細說道。
NearPlaneFade 他會根據和相機的位置進行顯示或者隱藏(差值型的)
SimpleTagalong 讓某個物體和相機保持固定的距離。
Singleton 一個單例,適用於全局。
SphereBasedTagalong 讓一個球一直跟隨你,但他始終面想你,你可以根據他來實現開始界面的菜單跟隨功能。
Tagalong 讓一個物體在相機的範圍內一直不變。他加上Billboard可以實現開始界面的菜單跟隨功能。
WorldAnchorManager 一個空間錨管理類。在空間錨部分會詳細的說明。
Timer 一個時間管理類,注重於流程的控制吧
TextToSpeechManager 文字播放類
三、詳細解析:
1:Billboard.cs 可以讓一個全息物體總是面對着攝像頭。
(該腳本配合Tagalong.cs可以實現Hololens主菜單效果,即平滑追蹤+始終面對功能)
參數:
PivotAxis:旋轉中心軸。參數:free(default):物體每個軸都可以自由旋轉;Y:物體只繞着Y軸旋轉(即左右轉頭物體會面向你,上下轉頭 物體不會面向你)。
2:DirectionIndicator.cs 方向指示腳本,讓一個方向指示器始終指向該腳本上的對象。
參數:
Cursor:該物體在場景中被當作光標,方向指示器會顯示在這個物體旁邊。
DirectionIndicatorObject:方向指示器物體,該物體會一直指向附加該腳本的對象。對象可以是2D或者3D。
DirectionIndicatorColor:方向指示器的顏色(方向指示器材質裏的Shader必須要有“_TintColor”屬性,否則顏色不會變)
VisibilitySafeFactor: 範圍[-0.3,0.3] ,當物體在攝像機視錐的某個百分比範圍中,方向指示器纔會顯示。(例如此值爲0時,當物體完全離開 攝像機視錐之後方向指示器纔會顯示;此值爲0.1時,物體在視錐範圍的90%之外,方向指示器纔會顯示;此值爲-0.1時,物體在視錐範圍的110% 之 ,方向指示器纔會顯示)
MetersFromCursor:方向指示器從原中心到它面向方向(forward)的一個偏移值。
3:FixedAngularSize.cs 讓一個物體在攝像機裏的大小始終不變。
(該腳本無視物體和攝像機之間的距離,只要在攝像機視錐範圍中,它的大小比例始終相同)
參數:
SizeRatio:比例值,該值爲0時,此腳本不起作用。增大該值後,物體在攝像機內的比例會增大,推薦值0.1左右。
4:FpsDisplay.cs 輔助顯示當前場景的FPS值。
(推薦直接使用Prefabs文件夾下的FPSDisplay,裏邊已經集成好相應的字體和顯示方式)
參數:
Frame Range:計算FPS值的平均幀數,不可小於1。(例如此值爲10時,會統計10幀的FPS值,然後顯示10幀的平均數)
5:HeadsUpDirectionIndicator.cs在攝像機裏顯示一個指針,該指針會始終指向某個物體。
(該腳本功能和DirectionIndicator.cs相近。推薦直接使用Prefabs文件夾下的HeadsUpDirectionIndicator預製體,指針模型均已集成好)
參數:
TargetObject:指針指向的物體對象。
Depth:指針物體的深度值,該值越大,指針越小。
Pivot:對象位置中心點的偏移位置,推薦設置爲(0,0.5,0)。
PointerPrefab:指針物體。
IndicatorMarginPercent:目標物體在視距內的某個百分比時,指針會自動到達中心。
DebugDrawPointerOrientationPlanes:在Scene面板繪製指針到目標物體間的某些線?
6:InterPolationUtilities.cs 存儲了一些和插值相關的靜態方法。
7:Interpolator.cs 對物體的Position、Transfrom和Scale進行插值。
8:NearPlaneFade.cs 讓物體根據它和攝像機的相對位置漸隱或者漸顯。
9:PriorityQueue.cs 輔助類,貌似低優先級的對象將會首先在隊列中刪除。(待研究~~)
10:SimpleTagalong.cs 讓一個物體始終和攝像機保持固定的距離。
(該腳本無視物體和攝像機之間的距離,只要在攝像機視錐範圍中,它的大小比例始終相同)
參數:
TagalongDistance:物體和攝像機之間的固定距離。
EnforceDistance:讓物體始終跟隨相機,即時物體不必再進行移動。
PositionUpdateSpeed:物體更新速率(以 米/秒爲單位)。
SmoothMotion:物體是否平滑移動。
SmoothingFactor:平滑因子,僅當SmoothMotion爲true時有效。
11:Singleton.cs 單例基類,遵循單例設計原則,每個繼承它的腳本應當只有一個實例(Instance)。
12:SphereBasedTagalong.cs 讓一個物體始終和攝像機保持固定的距離,該物體處於一個球體半徑範圍內。
(該腳本是性能最好的跟隨腳本,佔用資源最少)
參數:
SphereRadius:球體半徑。
MoveSpeed:物體跟隨攝像機的速度。
DebugDisplaySphere:在Scene面板顯示球體的線框。
DebugDisplayTargetPosition:在Scene面板顯示目標位置。
13:Tagalong.cs 讓一個物體在攝像機裏的大小始終不變。
(該腳本無視物體和攝像機之間的距離,只要在攝像機視錐範圍中,它的大小比例始終相同)
參數:
SizeRatio:比例值,該值爲0時,此腳本不起作用。增大該值後,物體在攝像機內的比例會增大,推薦值0.1左右。
14:TextToSpeechManager.cs 文字語音播放管理類
(該腳本利用帶Win10裏的語音庫Media.SpeechSynthesis,可以將文本或者SSML協議文檔的內容轉換成語音輸出,目前Hololens只支持其語音庫下的MSTTS_V110_enUS_MarkM、MSTTS_V110_enUS_ZiraFM和MSTTS_V110_enUS_DavidM三種英文庫,中文庫目前無法導入。)
參數:
audioSource:語音播放控件,此處必須要添加已有的Audio Source控件,否則無法播放。
voice:語音選項,可選默認、David、Zira以及Mark這幾種類型。
用法:
創建一個新物體,在上邊添加Audio Source組件以及TextToSpeechManager.cs腳本,將Audio Source組件拖到TextToSpeechManager.cs裏的audioSource上,voice隨 意選擇即可。之後再新物體上新添加一個聲音控制腳本,如下以SpeechTest.cs爲例:
public class SpeechTest: MonoBehaviour
{
//將TextToSpeechManager拖到這裏
public TextToSpeechManager TextToSpeech;
Void Start()
{
if (TextToSpeech != null)
{
var voiceName = Enum.GetName(typeof(TextToSpeechVoice), TextToSpeech.Voice);
var msg = string.Format("The Windows Device Portal for HoloLens lets you configure and manage your device", voiceName);
TextToSpeech.SpeakText(msg);
}
}
}
15:Timer.cs和TimerScheduler.cs 定時器
(定義時間分配,有點類似Unity裏的Invoke方法)
用法:
此類用起來很簡單,如下所示:
private Timer timer;
// Use this for initialization
void Start ()
{
timer = new Timer(1);
float durationInSec = 5.5f;
Timer.Start(durationInSec, TimerCallback);
}
private void TimerCallback()
{
//add something here
}
private void CallMethodAtNextFrame()
{
Timer.StartNextFrame(TimerCallback);
}
private void StopTimer()
{
timer.Stop();
}
16:WorldAnchorManager.cs 空間錨管理類。
用法:
1:創建一個空物體,命名爲Manager,將WorldAnchorManager.cs附加到此物體上。
2:當要給一個物體創建空間錨點時,調用anchorManager.AttachAnchor(this.gameObject, SavedAnchorName)方法,其中SavedAnchorName是識別空間錨物體對象的唯 一Name,不可重複。
3:刪除空間錨點時,調用 anchorManager.RemoveAnchor(gameObject)方法即可
4:如果要給一個物體添加錨點時,它上邊已存在創建過的錨點,需要先刪除原來的,再添加,否則創建不會成功。