人机交互技术实验一:基于HTC Vive实现抓取与投掷

本次实验基于:
1.Win11系统
2.Unity2018.4.0f1
3.Steam下SteamVR
4.Unity下插件steamvrplugin1.2.2

文章目录

一.安装Steam以及软件SteamVR

二.将HTC Vive设备与电脑连接

三.Unity前期准备

四.核心功能开发

五.实验截图

一.安装Steam以及软件SteamVR

过程略
在这里插入图片描述

二.将HTC Vive设备与电脑连接

  • 本次实验只使用一个传感器
    需要间断性长按传感器后按钮,直至在传感器屏幕端观察到荧光绿色的"A"字样

  • 长按手柄圆盘下端按钮,至手柄震动,绿灯亮

  • 将串流盒与头显相连,并将其连接至电脑

  • 调整Windows有关屏幕设置
    选择“扩展这些显示器”
    在这里插入图片描述
    运行Steam下SteamVR
    在这里插入图片描述
    将观察到
    在这里插入图片描述
    点击左上角按钮,进行房间设置
    在这里插入图片描述
    此处务必选择“设置为仅站立”,并佩戴好头显
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

三.Unity前期准备

打开Unity2018.40f1
新建3D项目
在这里插入图片描述

导入steamvrplugin1.2.2
在这里插入图片描述

在这里插入图片描述
然后按下图进行选择
在这里插入图片描述
此处请务必选择"I Made a Backup"
在这里插入图片描述
选择Accept ALL

在这里插入图片描述

然后针对第一个警告“Show Unity Splashscreen”进行修改
(否则会持续报错)

打开Assets > SteamVR > Editor > SteamVR_Settings.cs

在这里插入图片描述
修改第39行,将false修改为true
修改前:
在这里插入图片描述
修改后:
在这里插入图片描述

随后安装openvr包
打开Window > Package Manager
搜索openvr
如果碰到搜索不到这个包的情况,请先尝试重启Unity
在这里插入图片描述
在这里插入图片描述

四.核心功能开发

修改Edit > Project Setting
在这里插入图片描述

打开 Assets > SteamVR > Prefabs,将两个预制件CameraRig与SteamVR拖入到左侧物品栏
并将Main Camera删除
在这里插入图片描述
为场景中添加一个球体和一个平面
其中,球体的位置放在摄像机前方便抓取
并给球体添加
1.Rigbody 不要勾选is trigger
2.Sphere Coilder 质量阻力设置为0.1 勾选使用重力
在这里插入图片描述
在这里插入图片描述
在Assets下新建文件夹Scripts
在Scripts下新建脚本,名为PickUp
在这里插入图片描述

删除初始代码,将以下代码复制进去

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
[RequireComponent(typeof(SteamVR_TrackedObject))]
 
public class PickUp : MonoBehaviour {
 
    //追踪的手柄
    SteamVR_TrackedObject trackedObj;
    //获取输入事件
    SteamVR_Controller.Device device;
    public Transform sphere;
 
    // Use this for initialization
    void Start () {
        trackedObj = GetComponent<SteamVR_TrackedObject>();
        Debug.Log("Start....................................."+trackedObj.name);
    }
	
	// Update is called once per frame
	void Update () {
        //获取扳机键类型
        device = SteamVR_Controller.Input((int)trackedObj.index);
      
     }
 
 
 
    private void OnTriggerStay(Collider collider)
    {
        Debug.Log("OnTriggerStay.....................................");
 
        //抓取物体
        //触摸中
        if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
        {
            // 不受重力影响
            collider.attachedRigidbody.isKinematic = true;
            //将物体设置到父级上
            collider.gameObject.transform.SetParent(gameObject.transform);
            Debug.Log("GetTouch.....................................");
        }
 
 
        //松开物体
        if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))
        {
            Debug.Log("GetTouchUp.....................................");
            // 受重力影响
            collider.attachedRigidbody.isKinematic = false;
            //将父级置为空
            collider.gameObject.transform.SetParent(null);
            //投掷物体
            tossObject(collider.attachedRigidbody);
        }
    }
 
    //物体投掷
    void tossObject(Rigidbody rigidbody)
    {
        //如果是起始位置,则设置为起始位置,否则设置为父类
        Transform origin = trackedObj.origin ? trackedObj.origin : trackedObj.transform.parent;
 
        //如果起始位置部位空
        if(origin != null)
        {
            //将局部坐标转换成世界坐标
            rigidbody.velocity = origin.TransformVector((device.velocity));
            rigidbody.angularVelocity = origin.TransformVector((device.angularVelocity));
        }
        else
        {
            //设置速度
            rigidbody.velocity = device.velocity;
            //设置角速度
            rigidbody.angularVelocity = device.angularVelocity;
        }
    }
 
 
    //重置小球
    private void Reset()
    {
        //扣动扳机键
        if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad))
        {
            //重置位置
            sphere.transform.position = Vector3.zero;
            //重置速度
            sphere.GetComponent<Rigidbody>().velocity = Vector3.zero;
            //重置角速度
            sphere.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
        }
    }
 
}

然后将将本拖到CameraRig下的Controller(left)与Controller(right)
在这里插入图片描述
并且给CameraRig下的Controller(left)与Controller(right)
添加组件Sphere Collider,并勾选is Trigger
在这里插入图片描述

点击运行

五.实验截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_62316271/article/details/130580810