本章主要介绍通过VIU,实现利用手柄射线射线进入、点击、离开物体,以及射线拾取物体两大部分的内容。

1、前期准备
这里以第二章中的瞬移场景为基础进行讲解。链接如下:
我们将阶梯命名为Stairs,墙命名为Wall,方便我们测试手柄射线进入、点击、离开物体做准备。

2、3D物体检测射线的进入、点击、离开
编写Demo4_RayDetectionTest脚本,同时挂载在阶梯和墙上,触发前提条件:物体上已挂载Collider

using System.Collections.Generic;
using UnityEngine;
using HTC.UnityPlugin.Vive;
using UnityEngine.EventSystems;public class Demo4_RayDetectionTest : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler,IPointerClickHandler
{private HashSet<PointerEventData> hovers = new HashSet<PointerEventData>();     //射线Hover哈希表/// <summary>/// 射线进入/// </summary>/// <param name="eventData"></param>public void OnPointerEnter(PointerEventData eventData){if (hovers.Add(eventData) && hovers.Count == 1){Debug.Log($"射线进入 {transform.name}");}}/// <summary>/// 射线离开/// </summary>/// <param name="eventData"></param>public void OnPointerExit(PointerEventData eventData){if (hovers.Remove(eventData) && hovers.Count == 0){Debug.Log($"射线离开 {transform.name}");}}/// <summary>/// 射线点击/// </summary>/// <param name="eventData"></param>public void OnPointerClick(PointerEventData eventData){VivePointerEventData viveEventData = eventData as VivePointerEventData;if (viveEventData != null){if (viveEventData.viveButton == ControllerButton.Trigger){Debug.Log($"射线点击 {transform.name}");}}}
}

运行测试,阶梯和墙都会触发射线进入、点击、离开

2、3D物体拖拽
想要实现3D物体射线拾取的功能很简单,直接在物体上挂载Draggable组件即可,拖拽前提条件:物体上已挂载Collider,运行后效果:射线对准阶梯/墙体,扣动扳机键不放可拾取物体,握持键按住不放可拾取物体并移动到距离玩家一定距离,通过触摸板可以控制拾取距离的长短。

3、Draggable组件详解

(1)Init Grab Distance:初始拾取时,物体距玩家距离
(2)Ovveride Max Angular Velociry:覆盖最大角速度
(3)Unblockable Grab:无阻挡拾取
(4)Scrolling Spped:拉伸速率,数值越大,物体距离调调整速率越高
(5)Min Stretch Scale:缩放最小值,两个手柄射线同时拾取时生效
(6)Max Stretch Scale:缩放最大值,两个手柄射线同时拾取时生效

我们在实际开发过程中,更多的是实现功能和交互,如:玩家站在地面,需要把设备安装至天花板。
以上案例,我们除了可以在场景中放个梯子,拖拽设备瞬移到一定高度安装之外,还可以通过Draggable组件的After Grabbed、Befor Release、On Drop事件来通过直接在地面上通过射线拾取与调整距离就可以安装到指定位置。
编写Demo4_RayDrag脚本,同时挂载在阶梯和墙上,触发前提条件:物体上已挂载Collider

using UnityEngine;public class Demo4_RayDrag : MonoBehaviour
{private Draggable draggable;private void Awake(){draggable = GetComponent<Draggable>();}private void Start(){draggable.afterGrabberGrabbed += Draggable_afterGrabberGrabbed;draggable.beforeGrabberReleased += Draggable_beforeGrabberReleased;draggable.onGrabberDrop += Draggable_onGrabberDrop;}private void Draggable_afterGrabberGrabbed(){Debug.Log($"{transform.name} 已被拿起");}private void Draggable_beforeGrabberReleased(){Debug.Log($"{transform.name} 放下之前");}private void Draggable_onGrabberDrop(){Debug.Log($"放下 {transform.name}");}
}

不难看出,通过脚本中的三种状态,对于以上所述案例,解决思路为:
(1)被拿起后,安装位置高亮
(2)放下之前进行碰撞检测,若为安装位置,进行逻辑处理
(3)放下后,安装位置不高亮

ViveInputUtility-手柄射线与3D物体交互(5)相关推荐

  1. SteamVR 2.x 手柄射线与3D物体交互(9)

    UI模块在前面已经讲完了,从本章开始,会着重介绍手柄与3d游戏物体之间的交互,我们平时项目开发,最常用的就是手柄射线点击物体.手柄触碰以及手柄拾取物体,先来聊聊射线点击物体. 沿用的思想我们之前有说过 ...

  2. PicoXR中手柄射线与UI的交互

    PicoXR中手柄射线与UI的交互 本文将介绍在PicoXR中如何使用手柄射线与UI进行交互 基本步骤 开发Unity XR项目必不可少的要先右键点击Hierarchy面板 XR-Room-Scale ...

  3. cocos 射线检测 3D物体 (Sprite3D点击)

    看了很多朋友问怎么用一个3D物体做一个按钮,而且网上好像还真比较难找到答案, 今天翻了一下cocos源码发现Ray 已经封装了intersects函数,那么剩下的工作其实很简单了, 从屏幕的一个poi ...

  4. HMS Core AR Engine 2D图片/3D物体跟踪技术 助力打造更智能AR交互体验

    AR技术已经被广泛应用于营销.教育.游戏.展览等场景.通过2D图像跟踪技术和3D物体跟踪技术,用户只需使用一台手机进行拍摄,即可实现海报.卡牌等平面物体以及文物.手办等立体物体的AR效果.尽管近年来2 ...

  5. SteamVR 2.x 手柄触摸3D物体(11)

    通过上一章对Interactable组件有了初步的了解之后,现在来正式开始学习手柄触摸物体的交互. 一.前期准备 新建场景,删除默认相机,将Player拖拽进入场景内 新建Plane,修改为Floor ...

  6. unity3d VR手柄射线拾取,投掷,发射可拿去的物体

    using UnityEngine; /// <summary> /// 手柄射线原代码要添加好1. SteamVR_LaserPointer 2.SteamVR_TrackedContr ...

  7. 笔记14 灯光、预设体、3d物体的事件、碰撞体、刚体、炸箱子、触发器、物理材质、射线

    笔记14 灯光.预设体.3d物体的事件.碰撞体.刚体.炸箱子.触发器.物理材质.射线 灯光 基本项 烘焙 灯光的种类 Lighting窗口 预设体 了解预设体 利用代码操作预设体 实例化预设体Inst ...

  8. ViveInputUtility-手柄拾取3D物体(7)

    本章主要介绍通过VIU,实现手柄拾取3d物体以及拾取事件触发. 1.前期准备 新建场景06-3DGrab,删除默认相机,新建原点空节点Player,将需要的模块拖入Player节点内,本章还是沿用第二 ...

  9. Pico UnityXR中的手柄射线

    PicoXR中的手柄射线 前言 ​ 本文是继PicoXR中的输入事件博客的进一步补充,针对手柄的射线相关API进行解析,并以VR水果忍者为例子封装手柄射线的事件. 手柄射线的获取 XRRayInter ...

最新文章

  1. 使用 U 盘制作 Ubuntu 系统启动盘
  2. MariaDB表表达式(2):CTE
  3. akka框架——异步非阻塞高并发处理框架
  4. docker镜像构建工具kaniko构建过程缓慢原因探究
  5. 多路测量实时同步工作原理_MCC 134测量热电偶的工作原理
  6. android volatile的使用
  7. 数据库中字段的类型选择
  8. 使用CALayer设置图像边框
  9. react-native windows下环境搭建和现阶段开发测试问题汇总(持续更新)
  10. 2018-01-03 烂尾工程: Java实现的汇编语言编译器
  11. 【SDOI2008】Sue的小球
  12. 中山纪中集训Day7+8.7模拟赛题解
  13. 赛码网笔试Java代码示例
  14. 数据库实验六综合实验-水果商店进阶一
  15. 木纹OCA一体显示屏
  16. 这次的新计算,很全能!
  17. uva12325 暴力枚举
  18. 尽量用pass-by-reference-to-const(const引用)替换pass-by-value(传值)
  19. 解决Google浏览器卸载后无法重新安装的问题
  20. Linux_文件系统与磁盘管理

热门文章

  1. web前端——transform变形 旋转角度正负的判断
  2. html图片左右无缝循环滚动示例
  3. 解读ConnectBot-1 telnet、ssh常识
  4. 按键精灵识别不出图片
  5. 疫情下我离职一年,收入增长了10倍
  6. 【计算机架构】计算 CPU 动态功耗 | 集成电路成本 | SPEC 基准测试 | Amdahl 定律 | MIPS 性能指标
  7. alienware笔记本过热处理
  8. AcWing - 求组合数 III(lucas逆元)
  9. selenium接管浏览器并配置代理
  10. 安全协议系列(二)----CCM与CCMP