我们在VR中总是靠着头部来浏览场景,当我们想更丰富多彩的与我们所沉浸的世界进行交互,这时我们就需要通过VR手柄或者按键使用我们在世界中的移动。
使用CardBoard实现在场景中的跳跃。
首先我们需要知道,CardBoard的交互都是基于Gaze凝视点来实现的。首先第一步,我们就需要获取的我们凝视射线所指向的位置。
-
我们通过查阅CardBoard的SDK可以知道,Gaze(凝视点)属性可以从CardBoardHead脚本进行获取,并且我们可以看出这条射线是从头部向头部的前方进行发射的。
Paste_Image.png
- 将我们的CardboardMain的预制拖拽进我们的场景。并为它添加Player脚本。在脚本中获取CardBoardHead的引用。由于我们的Head上就挂载有CardBoardHead,我们使用GetComponentInChildren<CardboardHead>()来进行获取。
- 我们可以通过Debug输出Gaze的direction来测试我们正在凝视的方向。
找到了凝视的方向,这时我们就需要朝我们凝视的方向实现跳跃,这样就需要鼠标点击触发相应的事件,我们也可以通过CardBoard脚本里的OnTrigger事件知道,发生界面的点击时会触发这个事件,现在我们就需要将我们的Jump方法绑定进这个事件。(会发生跳跃肯定也少不了刚体)
Paste_Image.png Paste_Image.png为了避免我们跳跃时发生不必要的旋转导致头晕,我们需要将Rotation进行冻结。
Paste_Image.png我们实现跳跃只需抬头向上,把Gaze的direction对准天上,以这个方向添加力即可,但是这样会使我们的跳跃效果杂乱无章(用户抬头跳跃后在低头看下面的景色很容易出现眩晕)。这里使用固定角度进行跳跃。
-
首先我们需要获取我们Gaze 射线到“水平方向”上的投影(这里的xz平面)我们使用Vector3.ProjectOnPlane方法
Vector3 ProjectedVector = Vector3.ProjectOnPlane(GazeHead.Gaze.direction, Vector3.up); -
Vector3.up(0,1,0)也就是xz平面的法向量。
Paste_Image.png -
得到了位置在xz平面上的方向投影,我们就需要给这个向量设置偏转(它需要偏转多少度(也就是跳跃多少度))使用Vector3.RotateTowards最后把这个方向赋值给velocity并加上速度大小即可。
-
由于我们的底层计算都是以弧度为单位的,首先我们就需要把我们的角度转成弧度。
- 跳跃完成:
网友评论