一、预设体
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:如果要给一个物体添加锚点时,它上边已存在创建过的锚点,需要先删除原来的,再添加,否则创建不会成功。