萌猫娘巧克力 的 VR笔记

本篇VR笔记由“萌猫娘巧克力”撰写,文明观赏,请勿转载,谢谢合作

该VR笔记的来源是 蛮牛教育 上的课程【HTC VIVE 开发实例教程】

——————————————————————

观看前的一些提醒:

Unity版本 5.6.0f3

VRTK版本:3.2.1

SteamVR版本:1.2.2

另外提醒一下:SteamVR版本一定不能高过1.2.2,因为高过了会使得  手柄  无法显示
——————————————————————

初识HTC VIVE

HTC

宏达国际电子股份有限公司成立于1997515日,简称宏达电,亦称HTC,是一家位于台湾的手机与平板电脑制造商。是全球最大的Windows Mobile智能手机生产厂商,全球最大的智能手机代工和生产厂商。

全球第一款安卓手机HTC G1HTC20089月推出。

20153月的MWC2015上发布了与Valve联合开发的VR虚拟现实头盔产品HTC Vive

VIVE

ValveValve Software(维尔福软件公司)的简称,1996年成立于华盛顿州西雅图市,是一家专门开发电子游戏的公司,代表作品有半条命,反恐精英,求生之路,DOTA2等。

 

 

HTC Vive 是由HTCValve联合开发的一款VR头显(虚拟现实头戴式显示器)产品,于2015年3月在MWC2015(巴塞罗拉世界移动通信大会)上发布。由于有Valve的SteamVR提供的技术支持,因此在Steam平台上已经可以体验利用Vive功能的虚拟现实游戏。2016年6月,HTC推出了面向企业用户的Vive虚拟现实头盔套装—Vive BE(即商业版),其中包括专门的客户支持服务。

2016年11月,HTC Vive头戴式设备荣登2016中国泛娱乐指数盛典“中国VR产品关注度榜top10”。

AR 网址

HTC VIEW 交互设计开发

关于凝视效果

  1. 通过跟踪头部移动,设置一个代表光标的准星,当停留在某处足够长时间以后,激发选中逻辑
  2. 类似 Kinect 自然语言交互
  3. 多用于移动VR,如 Cardboard、GearVR
  4. VIVE 平台使用凝视效果可增强用户体验

实现原理

  1. 基于射线原理,通过Raycast 判断击中的物体,在Update 里面进行逻辑帕努单
  2. 准星或十字线基于UGUI ,设置为相机的子物体,等待操作过程一般为圆环逐渐填充动画或者进度条动画
  3. 被凝视的物体可以是UI也可以是3D物体
  4. 如果在一段时间内击中的物体是用一个物体,则认为该元素被选中,在此逻辑内撰写相应处理函数,入消失,变换材质,缩放等
  5. 元素一般分为三个状态相应:准星进入、准星退出、准星停留时间

 

 

 

对于工具的学习:

SteamVR工具

使用Interaction System 实现与物体的交互

Unity脚本上的一个小技巧,当我们想在添加这个脚本的时候,还需要哪些组件支持,就可以使用RequireComponent,进行强制添加上去,以免发生不必要的小问题

使用ItemPackage 实现配套物体的同时抓取

 

Linear Drive Circular Drive 的使用

LinearMapping是一个百分比

  

传统UI VR UI 《屏幕座标系》 《世界座标系》的区别

 

VR中的UI一般构建步骤

Interaction System 中的UI交互

 

3D物体上面挂在 Interactable 脚本用于3D物体交互,

而在UI上面要交互的话,要挂在UIElement脚本

使用 Sourcetree Github 克隆项目并保持更新

VRTKSteamVR的集成

VRTK的配置

 

VRTK手柄指针配置

VRTK_Controller Events

VRTK_Pointer —— 定义指针交互

指针渲染有两种【VRTK_BezierPointerRenderer】 和 【VRTK_StraightPointerRenderer

VRTK_StraightPointerRenderer —— 定义指针外观

 

 

 

早期VRTK

 

早期直接使用 Simple Pointer是可以进行操作的,但是现版本不允许这么使用了

 

 

 

设计思想:

开始指定SDK,指定相关模型,跟相关控制脚本发生链接,在控制器上挂载最核心的Controller Events,把事件挂载到控制器上,将相关的属性进行设置,

 

 

 

VRTK瞬移机制:

         瞬移是基于 碰撞器 之上的,所以想瞬移的话,就得加上碰撞器组件

 

 

将射线照射在箱子上,他目前不会站在箱子上,

这里就涉及到了【自适应高度】问题,

 

将Basic替换成Height脚本即可解决问题

VRTK_Height Adjust Teleport 和 VRTK_Basic Teleport 只能添加一个

让指针的末端附着在物体的表面上,

就像凝视效果的光标,和物体的法线方向保持一致

 

VRTK的快速瞬移:

 

之前的瞬移是从一个点快速 到了另一个点,中间没有过程只是加了闪屏

 VRTK_Dash Teleport 快速瞬移

中间的移动过程是可见的,并且,它自带高度自适应的效果

 

瞬移区域限制:

有种办法就是,把不想让玩家进行瞬移的位置进行 碰撞器 的消除,但是这样的话,太麻烦

VRTK,就为我们提供了 3 种限定瞬移区域机制

 

第一种方式:

 

无论Basic 、Height 还是 Dash Teleport ,都有

它设定了排除的规则,它需要脚本类型是【VRTK_Policy List】

【包含3个Tag的游戏物体】

忽略 Tag 为 NoTeleport 游戏物体,不参与进行瞬移

此时,第三个箱子就无法瞬移到上面了

以上是VRTK_Policy List方式

 

第二种方式:

那三个瞬移组件,也有这个NavMeshLimitDistance,

【这个图可能无法看清烘焙范围,后面有张烘焙后的图】

Nav Mesh Limit Distance

 

要注意一个问题,那就是这个 Nav Mesh Limit Distance 是 烘焙缩进,如果是0的话,那就绝对不可以往Nav Mesh范围外进行瞬移,

 

如果设置了0.5的话,它就可以往 Nav Mesh 范围外0.5的位置进行微瞬移(可以往外面一点)

视频解释:往NavMesh以外,往外走0.5米,也是可以进行瞬移的

注意下,填写正整数的话,就会往NavMesh外多少多少米进行微瞬移,填写0的话,就会不考虑 导航 瞬移

 

 

第三种方式:

类似于 Interaction System 的 Teleport Point,

给他设定一个点

VRTK  ->  Prefabs  ->  DestinationPoint

最初它的样子是一个胶囊体[瞬移点]

但是,我们可以将它变成一个椭圆片[瞬移区域]

还要注意一点的就是,它们的 碰撞器大小 !!!!拖成 椭圆片 之后,要更改碰撞器

自定义指针:

我们得了解,它们分别的名字

Custom Cursor 是 指针与碰撞体 交界的光标.

Custon Tracer 是 构成曲线的元素 【 默认用Sphere构成的点状曲线  】

Tracer Density 是 曲线密度,越大越密集

根据长短,自动缩放

【看组件名】

将物体改成条形的话,游戏物体就只挂载Transform 和 Line Renderer

设置 Width 、不要World Space 、 Positions Element2  Z轴改成2

我们可以在Tracer上做很多设置,例如添加粒子特效

【试想一下,当按下Touch Pad,就会有烟花火星产生,那个场景,这就是添加了粒子特效做出来的效果】

 

 

使用VRTK实现与物体的交互

 

VRTK中与物体交互的三种类型:Touch、Grab、Use

 

 

使用VRTK实现与物体的交互

 

给 想进行交互的物体 添加一个VRTK_Interactable Object脚本

【物体上要添加这个脚本 碰撞器】

三种方式与物体进行交互

[手柄上,要添加VRTK_Interactable Grab]

 

【视频此处太模糊了,因为,VRTK版本过旧,而且有些地方不一样了,所以没有贴图】

在手柄上,添加上Grab,也可以添加上Use

需求:抓起剑的时候,实现手柄消失

被物体添加 VRTK_InteractController Appearance

看见Hide Controller On Grab了吧,它的意思就是当抓起来的时候,隐藏手柄

 

现在给 手柄 添加一个振动:

手柄振动的反馈是,给物体交互配置过程进行设置的,所以,我们只需要给物体添加一个脚本,VRTK_Interact Haptics

另一种配置物体可交互的手段:

【强烈推荐,根本不需要记忆该添加哪些脚本自动完成添加脚本】

基于图形化配置

每个物体的交互是不一样的,

门 和 剑,它们的交互方式是不一样的

Precision Grab是精准抓取的意思,不勾选的话,它是和手柄的座标保持一致,只有吸附的效果

如果勾选上的话,碰到什么地方,就从那里抓取起来,

这个属性,有利于抓取点没有特殊要求的物体

设置 吸附点 Handler非常有利于吸附的方式

它的旋转朝向的设置,就是被抓取的物体,在被抓取以后在原有的基础上,将要在各个轴向上进行旋转的一个增量,它是一个增量而不是一个具体要达到的数值

另外一种抓取机制,将被抓取的物体作为一个被攀爬的点

VRTK抓取机制:关节点相关机制【视频中讲的特别难受】

这种效果,就是类似于攀岩的效果

 

当我抓取这个节点的时候,节点还是和手柄在一起,只不过这个节点不在相对于世界做一个运动,而是移动我们的身体,通过不停的拖拽从而移动体验者的位置

在某个组件上添加Player Climb即可攀爬

【该图中,我们正在攀爬梯子】

另一种抓取机制:

Rotator Track ,要配合【Hinge Joint】组件,

 

它可以被理解为门的合叶,它是围绕一个点进行旋转,最恰当的例子

这里有个黄色的箭头,这就是要围绕旋转的轴向

VRTK 3.2.1版本】配置,早期这个笔记写出来的时候上面的配置 并非 使用3.2.1的配置方式,但是,在之前配置的时候,我已经调整了笔记的顺序,所以,看到这里可以再往上翻一翻我写过的配置方式

【在这里就放一张图,看看大家能不能回想起来,如何配置】

VRTK中的高亮和振动

控制器高亮:

 

想让 控制器 进行高亮,我们需要去自己写脚本来进行控制

 

课时27,讲解了一个二级联动的一个BUG,可以看一看!!!!

【有兴趣的各位,可以看看视频,这里就不做赘述了】

VRTK中与UI的三种交互方式

我们想近距离触碰一个UI并且触发它

在Canvas上,挂在一个 VRTK_UI Canvas脚本,有个Auto Active Within Distance

它的意思是,距离多少的时候,就激活这个UI面板 ;;;;【并且手柄要添加一个Touch组件和 UI Pointer,这样才能响应UI上的事件】

现在,我们要弄一个头部控制的这么一个东西,因此,

 

然后再在HeadSet【头部控制器】上,添加一个组件【VRTK_Transform Follow】

这个组件是 它可以让一个物体跟随另一个物体,包括位置旋转以保证当前这个粒子,让HeadSet跟踪头部来发送射线以指定它的位置

补充一句,这个Interact With Object是后面讲到的东西,我弄混了

它是用激光和物体进行交互

还有一步,就是别忘了添加渲染上去

【将渲染拖上去,要记得】

 

 

总结一下:

人为定义一个可以发送射线的物体 配置 Pointer 、 它的Pointer Renderer 和 与UI进行交互的UI Pointer,再添加一个进行跟随Transform Follow,让它指定到头盔上,以确定,它是以眼睛的方位进行发送射线,然后跟UI碰撞

使用激光指针与物体进行交互

用激光对物体进行交互,需要进行配置

在两个手柄上,添加一个脚本【VRTK_Interact Use】

然后Pointer脚本上,勾选上Interact With Object

 

选中的目的,就是让这个激光与物体实现交互,而不是简单实现手柄

这时候,就实现了激光指针跟手柄与物体实现选中效果,

但是,到目前为止,我们并没有告诉VRTK,我们在选中它之后,要做什么,

它仅仅是接受到了事件,仅仅知道我用鼠标进行点击,并不知道点击之后要做什么

这里有两种方法可以进行配置

第一种,用Unity的自带东西:

在手柄上添加一个VRTK_InteractUse_UnityEvents

添加了之后,它上面有事件函数

 

两个函数的意思是:

当控制器使用了可交互的物体

使用完毕之后

 

这是开始去抓取的设置

这里要注意下,分别去设置左手和右手

现在有个问题,那就是抓取了武器之后,任然能进行瞬移,这是我们不想要的,

所以,我们得对Pointer进行一个设置,在抓取的时候不允许它去射线

把  VRTK_Pointer  也拖进去,找到它的一个Toggle属性,设置为false , 不允许它射线从而达到无法瞬移

这样设置来设置去,显然特别麻烦,因此,我们要通过手动写代码的形式去进行配置

第二种,用 手动写代码 的方式进行配置Use

 

源代码:

这个代码是出自 第19个 案例

它自己写了一个代码,不过这个代码是继承自 VRTK_InteractableObject 所以本质上还是挂载了InteractableObject脚本

 

唯一要关注的地方就是 它重写了 StartUsing 和 StopUsing  这两个方法:

 

StartUsing函数描述:

VRTK_InteractableObject.StartUsing(GameObject currentUsingObject)` has been replaced with `VRTK_InteractableObject.StartUsing(VRTK_InteractUse currentUsingObject)`. This method will be removed in a future version of VRTK.

public virtual void StartUsing(GameObject currentUsingObject)

{

     StartUsing((currentUsingObject != null ? currentUsingObject.GetComponent<VRTK_InteractUse>() : null));

}

这个函数已经过时了,形参列表由原先的GameObject被改成了VRTK_InteractUse

StopUsing也是如此

所以,我们要实现更复杂的逻辑,就需要继承自  VRTK_InteractableObject  ,自己来进行开发

当自己写的脚本继承自了 VRTK_InteractableObject , 它就会有它的东西可以进行设定

之前我们设置的射线抓取是被吸附到手柄上,然后再抓取,位置移动了!

我们可以设置一下,以达到一个目的,那就是吸附在光标上

因为不要吸附点这样就可以不让它直接吸到手柄上

 

把这个打开,它就会被吸附到  光标  上

这就是实现的效果

注意事项:

勾选了这个,它可以把激光当做手柄的延伸进行一个操作

这是介绍了Use使用方法,它是基于事件的处理函数

关闭了这个,同样是可以远程抓取,就不是在激光顶点

 

自定义手柄 – 将手柄定义为手的样子

用脚本的方式实现自动抓取

在两个控制器上,添加一个Auto Grab脚本

 

 

 

现在,我们不希望它显示默认控制器的模型了,所以,左手右手添加一个Controller Appearance

两个都选上 隐藏控制器 在抓取上

 

如果不勾选,会呈现出这样的效果

手柄与模型有旋转的偏移

我们要在抓取点上设置手柄与物体的朝向

【实现效果,按下后完全按下(播放动画)】

接下来就是有个需求,我想实现一个按下10%,它也是只做一个握10%的动作

这就是按下百分比动画的代码展示

视频中,说了一个问题,我们手柄是被替换掉了,但是抓取物体时出现了问题,抓取的话会脱离手柄

双手模型上拖上我们之前写的Hand脚本上去,再把Controller也拖上去

 

能触碰到,但是,无法进行抓取

这是因为,我们左右手控制器上,没有RigidBody

所以,我们要在 拖出来手模型 的下面放置一个  空物体带上刚体组件 

好了,至此为止,本人的VR笔记就到此为止了,介绍了它的配置,如何抓取东西,抓取机制,Handler的使用

最后再次申明,本篇VR笔记最终解释权由 “萌猫娘巧克力” 持有

欢迎大家来观看与指出瑕疵

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章