本次实验基于:
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
点击运行
五.实验截图