UnityVR交互插件

Unity开发VR,使用的插件主要是基于OpenVR开发的。
其中可以实现VR功能的有以下几种插件:
1.SteamVR自身提供方法;
2.SteamVR集成了来自《The Lab》的Interaction System;
3.VRTK。
一、Steam VR自身提供的方法。
使用SteamVR实现与物体的交互需要考虑如下问题:
    如何获得按钮事件?如何获得按钮传递的数据?抓取的基本原理(Collider,Rigibody)以及手柄震动的实现
使用SteamVR实现与物体的交互实现步骤
1. 获取手柄引用
2. 手柄与Box的碰撞检测
3. 获取按钮事件
4. 抓取:Box作为手柄的transform的子物体,失去rigibody相关属性
5. 松开:Box的parent为空,重新获取自身的rigibody相关属性
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InterationWithBox : MonoBehaviour {
    private SteamVR_TrackedObject trackedObject;
    private SteamVR_Controller.Device device;
    private GameObject interactBox;
    // Use this for initialization
    void Start ()
    {
        trackedObject = GetComponent();
        device = SteamVR_Controller.Input((int)trackedObject.index);
    }

    // Update is called once per frame
    void Update ()
    {
        if (device==null)
        {
            return;
        }
        if (device.GetAxis().x!=0||device.GetAxis().y!=0)
        {
            Debug.Log(device.GetAxis().x+"|"+device.GetAxis().y);
        }
        if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
        {
            if (interactBox!=null)
            {
                interactBox.transform.parent = transform;
                Rigidbody rig = interactBox.GetComponent();
                rig.useGravity = false;
                rig.isKinematic = true;
            }
        }
        if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
        {
            interactBox.transform.parent = null;
            Rigidbody rig = interactBox.GetComponent();
            rig.useGravity = true;
            rig.isKinematic = false;
        }
    }
    ///
    /// 碰撞体进入处理函数
    ///
    ///
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("TriggerEnter");
        interactBox = other.transform.gameObject;
    }
    ///
    /// 碰撞体脱离处理函数
    ///
    ///
    private void OnTriggerExit(Collider other)
    {
        Debug.Log("TriggerExit");
        interactBox = null;
    }

    private void OnTriggerStay(Collider other)
    {
        if (device != null)
        {
            device.TriggerHapticPulse(800);
        }
    }
}
二、Steam VR集成了《The Lab》里的Interaction System。
(有比较详细的使用文档,但提供的功能比较少,基本的功能是有实现,但一些写相对深度一点的效果就少了。)
该交互系统是组件式开发,基本常用的都已组件化,使用时只需对想要实现的功能挂在指定的脚本即可,想要灵活运用就要对这些组件了解,便可以快速实现一些效果。
系统组成的几个核心组件:
1、PlayerPrefab
2、Hand
3、Teleport(传送)
4、Teleport Point
5、Teleport Area
Player
使用Player不需要像CameraRig一样先进行配置。Player已经配置好了
1、BodyCollider和HeadCollider分别为身体和头部的碰撞器,可根据此碰撞信息不同,造成减血不同等效果


 
2、Hmd Transform意味着摄像机Transform,Unity分为了两种形式展现VR场景,一种是由VRCamera渲染的头显显示场景,另一种是由FallbackObjects的Camera渲染的场景,该场景可通过WASD和鼠标左右键控制人物在场景中移动


 
访问Player属性的方法:
using Valve.VR.InteractionSystem;
Player.instance.hmdTransform...;
Player.instance.hands[0].AttachedObjects()...;
//对脚位置的估计值       
Vector3 a = Player.instance.feetPositionGuess;
//通过头盔和手柄的朝向估算身体的朝向值    
Vector3 b = Player.instance.bodyDirectionGuess;
Hand


 
Starting Hand Type:设置左右手,当设置一只为左手时,另一个Hand也必须设置为右手。也可不设置
Hover Sphere Transform:自定义设置手的悬停范围的transform,默认为手柄的transform
Hover Sphere Radius:设置手柄的悬停半径
Hover Layer Mask:指定哪些层能受到感应
Controller Prefab:指定操控的预制体,若不想使用手柄,可设置为其他物体
Teleport


 
Teleporting:实现了瞬移功能的预制体,将其拖入Hierarchy,此时按下TouchPad键,便可实现瞬移的画面显示。但此时还没有TeleportPoint,所以无法移动  注:放置1个就好
TeleportPoint:可瞬移的点(必须有Teleporting,实现传送功能,才可传送)
TeleportPoint


 
Locked:确定该传送点是否可传送,通过代码可访问其属性
Marker Active:勾选时,按下TouchPad时,该点显示。传动过去后,该点隐藏;不勾选:一直显示。传送过去后不会消失。
Teleport Type:Move To Location / Switch To New Scene
Title:标题(及上方显示的文字“跳转点”)
Switch To Scene:要跳转到的场景的名字。若该场景在根目录Project文件下下,仅填写该场景名称即可。若在其他目录下,要填写完整路径
 
Teleport Area
在一个区域当中实现瞬移
新建面片,为其添加Teleport Area脚本,同时场景中需有一个Teleporting预制体。传送需是Player,不能是[CameraRig]。
但你要注意:这个可传送的面片不能被其他物体遮挡。


 
三、VRTK。
(提供的文档比较详细,且提供的功能加多而且对功能的诠释都有相应的demo场景参考
文档提供的比较详细,初次使用的话不知道原理,需要注意的地方就要好好读文档,难度不是很大。)
VRTK初步设置
1、删除默认相机,拖入[CameraRig]
2、新建[VRTK]空物体,加入VRTK_SDK Manager组件:
      Quick select SDK选择Stem VR
      Simulator是模拟器,可在无头盔时使用
3、点击Auto Populate Linked Objects
4、设置手柄
在[VRTK]下新建两个ganmeObject,重命名“LeftController”、“RightController”,给它们都添加:
①、VRTK_Controller Events:必须
②、VRTK_Pointer:VRTK的交互是基于指针的
③、VRTK_Bezier Pointer Renderer或VRTK_Straight Pointer Renderer:渲染手柄发射出的射线,从而使我们看到射线。
同时,我们还要将Renderer组件指定给Pointer Renderer选项框

5、将两个手柄分别赋值给Scripts Alias Left/Right Controller

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GarFe-Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值