• 您的位置:首页 > 新闻动态 > Unity3D

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

    2017/11/22      点击:

    目前很多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.导入WONGLOVE数据手套的U3D开发包

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

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

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

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

    //初始化数据手套

    void Start () {
    ret_angle=new float[19];

    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!");
    }
    //数据手套的手势定义实现过程
    //获取WONGLOVE数据手套当前的手势,例如: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;
    }

    }

    7. 本U3D工程源

    如需要本U3D工程源码,请联系我们。