Unity Meta Quest 一体机开发(八):【手势追踪】实现 Hand Grab 扔物体功能
文章目录
- 📕教程说明
- 📕设置刚体和碰撞体
- 📕给物体添加 Physics Grabbable 脚本
- 📕给手部添加 Hand Velocity Calculator 物体
此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量知识星球 XR 社区,博主目前在内担任 XR 开发的讲师。此外,该社区提供教程答疑、及时交流、进阶教程、外包、行业动态等服务。
社区链接:
Spatial XR 高级社区(知识星球)
Spatial XR 高级社区(爱发电)
📕教程说明
这篇教程将会介绍如何在能够抓取物体的基础上实现扔物体的物理效果。
配置一个基本的玩家物体可以参考前几期教程:https://blog.csdn.net/qq_46044366/article/details/134097455
实现抓取物体的效果可以参考上一篇教程:https://blog.csdn.net/qq_46044366/article/details/134488224
这篇教程将基于上一篇教程的配置来讲解,因为实现扔物体的前提是实现物体的抓取。
系列教程专栏:https://blog.csdn.net/qq_46044366/category_12118293.html
配套的视频链接:
https://www.bilibili.com/video/BV12j411L7YQ
电脑操作系统: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-throw-object/
Interaction SDK 物理组件:https://developer.oculus.com/documentation/unity/unity-isdk-using-with-physics/
最终效果:
📕设置刚体和碰撞体
要想实现扔物体的物理效果,可抓取物体就需要拥有重力效果,并且能和其他物体发生碰撞。我们需要取消勾选碰撞体组件上的 Is Trigger,并且勾选刚体组件上的 Use Gravity:
📕给物体添加 Physics Grabbable 脚本
在可抓取物体的身上添加 Physics Grabbable 脚本。
这个脚本会自动引用物体身上的 Rigidbody 和 Grabbable 脚本。如果 Rigidbody 和 Grabbable 在添加 Physics Grabbable 脚本之后被添加,需要手动引用。
然后找到物体的 HandGrabInteractable 子物体,找到 HandGrabInteractable 脚本,将物体身上的 Physics Grabbable 脚本拖到 Optionals 下的 Physics Grabbable 变量上。
Physics Grabbable 脚本能够保证物体在被抓取和释放的时候不会出现奇怪的物理效果。物体被抓取时,Physics Grabbable 会将刚体的 Is Kinematic 设为 true。
Unity 的物理系统有这么几个特性:
- 两个物体产生碰撞的条件是:两个物体都有碰撞体,至少有个物体有刚体。
- 物体加了刚体会受到力的效果。
而 is Kinematic 设为 true 的物体不会对其他刚体的碰撞和力做出反应,但依然会对其他刚体产生物理影响,比如可以撞击其他刚体,或者其他刚体撞击自己,其他刚体会被弹开。也就是我撞别人,能撞动别人;别人撞我,我没反应,别人可能会被弹开。
然后抓取的物体被释放后,Is Kinematic 会恢复成 false。然后会给物体施加一个力,让物体掉落时的物理效果看起来正常一点。如果没有添加 Physics Grabbable 脚本,在释放物体后物体会非常快速地落下。但是添加了Physics Grabbable 脚本后,物体就会以正常的重力效果掉落。
📕给手部添加 Hand Velocity Calculator 物体
在 Project 窗口的搜索栏搜索 Hand Velocity Calculator,将 Hand Velocity Calculator 这个 Prefab 拖到玩家物体的 LeftHand 下:
点击 Hand Velocity Calculator 物体,找到它的 Hand Pose Input Device 脚本,将 LeftHand 拖到 Hand 变量上:
然后找到左手的 HandInteractorsLeft 下的 HandGrabInteractor,将左手的 Hand Velocity Calculator 物体拖到 HandGrabInteractor 脚本的 Veclocity Calculator 变量上:
右手也是同样的道理。
当我们配置好了物体和手部后,就能实现 Hand Grab 扔物体的效果。
而 Hand Velocity Calculator 上的 StandardVelocityCalculator 脚本就能模拟物体扔出去后的速度。
最终效果: