社区链接:
Spatial XR 高级社区(知识星球)
Spatial XR 高级社区(爱发电)
这篇教程将会介绍如何用 Meta 的 Interaction SDK,将远处的物体抓取到手上。
环境配置可参考:https://blog.csdn.net/qq_46044366/article/details/133967343
配置一个基本的玩家物体可以参考前几期教程:https://blog.csdn.net/qq_46044366/article/details/134097455
系列教程专栏:https://blog.csdn.net/qq_46044366/category_12118293.html
配套的视频链接:
11.如何用VR手势追踪远距离抓取以及交互
?电脑操作系统:Windows 11
使用的 VR 设备:Meta Quest 3(Quest 系列都适用)
使用的 Unity 版本:2021.3.5 LTS (这里推荐使用 2021 及以上的 LTS 版本)
Meta XR SDK 版本:v57
官方文档:https://developer.oculus.com/documentation/unity/unity-gs-overview/
远距离抓取脚本介绍文档:
https://developer.oculus.com/documentation/unity/unity-isdk-distance-hand-grab-interaction/
远距离抓取配置过程文档:https://developer.oculus.com/documentation/unity/unity-isdk-create-distance-grab-interactions/
最终实现的效果:
在 Unity 编辑器的 Project 窗口栏中搜索 DistanceHandGrabInteractor 物体:
将这个 Prefab 拖到场景中,作为玩家物体上 HandInteractorsLeft 和 HandInteractorsRight 物体的子物体:
点击 DistanceHandGrabInteractor 物体,将玩家物体上的 OVRHmd 物体拖到 HmdRef 脚本中的 Hmd 变量上:
展开 DistanceHandGrabInteractor,激活 Visuals 子物体下的 HandGrabVisual 和 HandGrabGlow 物体:
点击 HandGrabVisual 物体,将对应手部的 Synthetic Hand 进行赋值:
点击 HandGrabGlow 物体,按下图所示进行赋值,另一只手同理:
在玩家物体的 LeftHand 和 RightHand 下添加 HandVelocityCalculator Prefab,然后引用到 DistanceHandGrabInteractor 脚本中的 Velocity Calculator 中:
最后,需要把 DistanceHandGrabInteractor 物体拖到 HandInteractorsLeft 和 HandInteractorsRight 物体的 Best Hover Interactor Group 脚本中:
接下来,我将配置一个具有物理碰撞效果和自定义抓取手势的物体。
首先物体的身上需要有碰撞体,刚体,Grabbable 脚本,Physics Grabbable 脚本。
然后为物体录制抓取手势,可以参考这期教程:Unity Meta Quest 一体机开发(九):【手势追踪】通过录制抓取手势实现自定义抓取姿势
录好手势后找到物体的 HandGrabPose 子物体,修改手指的自由度(我这里将所有手指的自由度改为了 Locked):
然后在物体的 HandGrabInteractable 子物体上添加 DistanceHandGrabInteractable 脚本,将物体身上的 Physics Grabbable 脚本拖到 DistanceHandGrabInteractable 脚本的 Physics Grabbable 变量上:
在 HandGrabInteractable 物体上添加 Move Towards Target Provider 脚本,然后将脚本拖到 DistanceHandGrabInteractable 脚本的 Movement Provider 变量上:
修改 Travel Speed 可以修改物体飞向手部的速度。Travel Speed 越大,物体飞向手部所花的时间越长。
DistanceHandGrabInteractor 会有自己的探测范围,在范围内的物体才能够触发远距离抓取。
我们找到玩家身上的 DistanceHandGrabInteractor 脚本:
默认引用了三个 Frustum,我们可以定位到这三个 Frustum 的位置:
HandFrustumNarraw 被赋给了 Selection Frustum 变量,表示的是远距离抓取的探测范围,会从手部发出一个锥体的探测范围,在此范围内的物体会被选中,有资格触发远距离抓取。最靠近范围中心的物体会被选中。调整 Conical Frustom 脚本的参数可以修改探测范围。
同样是从手部发出一个锥体范围,但是范围比 Narraw 更大。如果 HandFrustumWide 被赋给了 Deselection Frustum 变量,当物体被选中后,必须要退出 HandFrustumWide 的范围才能视为取消选中,而不是退出 Narraw 的范围。
从头部发出一个锥体范围。如果 HeadFrustum 被赋给了 Aid Frustum 变量,当物体同时进入到 Aid Frustum 和 Selection Frustum 的范围内,才能被选中。也就是说我们要用手对准可抓取物体,并且看向可抓取物体时,如果物体同时进入到了这两个范围内,才能触发远距离抓取。