福感科技有限公司 欢迎您!
联系方式

    地址:北京市平谷区马坊镇金河北街17号院3号楼7层712

    电话:010-89968230

    网站:http://www.fgsense.com

UNITY3D 与 HTC VIVE 数据手套VR应用开发

2021-10-6 21:37:36      点击:

目前很多VR用户使用UNIYT3D做VR应用开发时,新版本的SteamVR1.2.1在Unity5.4.4下狂报错,这是因为vive的sdk SteamVR在升级,会有些改动。

下面的内容是在以下环境完成的 unity5.6.2f1

1、导入SDK:SteamVR Plugin和Vive Input Utility
2、将CamerRag拖入场景

3、添加拾取对象

添加一个3d对象,并添加脚本BasicGrabbables即可,则物体可以被拾取。物体要被拾取,还需要添加刚体组件

4、添加触碰对象

添加一个3d对象,默认即可触碰

5、添加接触效果

在3d物体上添加脚本MaterialChanger,设置其参数

Normal:默认贴图

Heightlight:触碰后的贴图

Pressed:按下按钮时的贴图

Heighlight Button:指定按钮,默认是Trigger

6、运行

触碰拾取对象时,显示绿色,

按下按键后,变红色,可以移动旋转物体

触碰对象可以触碰,按下按键变红色,但无法移动和转动

7、事件响应

vive支持以下事件

  • IColliderEventHoverEnterHandler
  • IColliderEventHoverExitHandler
  • IColliderEventPressDownHandler
  • IColliderEventPressUpHandler
  • IColliderEventPressEnterHandler
  • IColliderEventPressExitHandler
  • IColliderEventClickHandler
  • IColliderEventDragStartHandler
  • IColliderEventDragUpdateHandler
  • IColliderEventDragEndHandler
  • IColliderEventDropHandler
  • IColliderEventAxisChangedHandler
使用方法,新建脚本如下,并把脚本添加到游戏对象,即可。
  1. using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4. using HTC.UnityPlugin.ColliderEvent; 
  5. public class viveLearn : MonoBehaviour,IColliderEventHoverEnterHandler {  
  6.  public void OnColliderEventHoverEnter(ColliderHoverEventData eventData){  
  7.  Debug.Log ("hover");  
  8.  }  
  9. }  

如何把数据手套集成到VIVE开发应用里?

1.首先建立一个UNITY3D工程, 导入HTC VIVE开发包
2.导入WISEGLOVE数据手套的U3D开发包

在U3D的资源列表里可以看到项目里有WISEGLOVE_RIGHTARM.CS脚本和WISEGLOVE数据手套的调用插件程序。

3. 把WISEGLOVE的调用脚本拖到场景内的主相机/ 或者其他物体上,并选择好数据手套端口号(可以在控制面板->设备管理器)。


4. OK, 现在已经建立好了UNITY3D+VIVE环境下数据手套的功能配置。

5. 数据手套的主要源码片段

//初始化数据手套

void Start () {
ret_angle=new float[19];//存储传感器角度值,适合WISEGLOVE5WISEGLOVE14WISEGLOVE15WISEGLOVE18WISEGLOVE19传感器手套

armsensor = new float[12];   //带有手臂跟踪功能扩展的数据手套专用
feedback = new byte[5];      //带有力反馈功能能扩展的数据手套专用
openstate = wgInitManu(port);  //打开数据手套端口,并对手套标定变量初始化
Debug.Log("open state:"+ openstate.ToString());
}
//这里是刷新程序片段
void Update () {

if (openstate == 1) {
    wgGetAngle (ret_angle); //读取数据手套的角度值
    wgGetQuat (armsensor); //读取数据手套的手臂跟踪传感器值
}

//模型手臂旋转
model_uparm_right.rotation   = &armsensor[0];
model_forearm_right.rotation =  &armsensor[4];
model_hand_right.rotation     =  &armsensor[8];
//模型手关节旋转,以大拇指关节为例
Thumb_R.rotation = Quaternion.Euler (0,-ret_angle [0] ,0) ;
Thumb_R1.rotation= Quaternion.Euler(0,-ret_angle [1] ,0) ;
Thumb_R2.rotation= Quaternion.Euler(0,-ret_angle [2] ,0) ;
....此处省略其他手指的设置

//数据手套的力反馈测试设置
if (Input.GetKey (KeyCode.Alpha1)) {
feedback [0] = 16; feedback [1] = 0;feedback [2] = 0;feedback [3] = 0;feedback [4] = 0;
wgSetFeedBack(feedback);
}
if (Input.GetKey (KeyCode.P)) {
feedback [0] = 0; feedback [1] = 0;feedback [2] = 0;feedback [3] = 0;feedback [4] = 0;
wgSetFeedBack (feedback);
}

//按下R键,开始标定
if (Input.GetKey (KeyCode.R)) {
    wgResetHand();  //标定数据手套的手指传感器
    wgResetArm();  //标定数据手套的手臂跟踪传感器
}
if (Input.GetKey (KeyCode.Q)) {
Application.Quit(); //禁止自动标定    //0 - 自动标定
}
}
void OnDestroy () {
if (openstate == 1) {
wgClose ();//程序退出时,关闭数据手套调用资源,并释放所有申请的内存资源
openstate =0;
Debug.Log ("Glove is closed!");
}
else 
Debug.Log ("Glove is NOT closed!");
}
//数据手套的手势定义实现过程
//获取WISEGLOVE数据手套当前的手势,例如:0x1f-石头 0x17-剪子, 0x00-布, 0x1c-OK
int CheckGloveStatus()
{
int gesture = 0; //0x1f;  // b1 1111
//大拇指第0位,...小指第4位
if (ret_angle [0] > 150 / 2)
gesture += 0x01;  // 
if (ret_angle [1] > 270 / 2)
gesture += 0x02;  // 
if (ret_angle [2] > 270 / 2)
gesture += 0x04;  // 
if (ret_angle [3] > 270 / 2)
gesture += 0x08;  // 
if (ret_angle [4] > 270 / 2)
gesture += 0x10;  // 
return gesture;
}

}

Copyright 2019 www.fgsense.com

福感科技有限公司 版权所有 All Rights Reserved

京ICP备20002031号

010-89968230