UNITY3D 與 HTC VIVE 數據手套VR應用開發
目前很多(duō)VR客使用UNIYT3D做VR應用開發時,*新的SteamVR1.2.1在Unity5.4.4下狂報錯,這是因為vive的sdk SteamVR在(zài)升級,會有些改動。
下麵的內容是在以下環境完成的 unity5.6.2f1
1、導入SDK:SteamVR Plugin和Vive Input Utility
2、將CamerRag拖入場景(jǐng)
3、添加(jiā)拾取對象(xiàng)
添加一個3d對象,並添加腳本BasicGrabbables即可,則物體可以被拾取。物體要被拾取,還需要添加剛體組件
4、添加觸碰對象
添加(jiā)一個(gè)3d對象,默認即(jí)可觸碰
5、添加(jiā)接觸效果
在3d物(wù)體上添加(jiā)腳本MaterialChanger,設置其參數
Normal:默認貼(tiē)圖
Heightlight:觸碰後的(de)貼圖
Pressed:按下按鈕時的貼圖
Heighlight Button:指定(dìng)按鈕,默認是Trigger
6、運行
觸碰拾取對象時,顯示綠,
按下按鍵後,變紅,可以移動旋轉物(wù)體(tǐ)
觸碰對象可(kě)以觸碰,按下按鍵變紅,但無法移(yí)動和(hé)轉(zhuǎn)動
7、事件響應
vive支持以下事件
- IColliderEventHoverEnterHandler
- IColliderEventHoverExitHandler
- IColliderEventPressDownHandler
- IColliderEventPressUpHandler
- IColliderEventPressEnterHandler
- IColliderEventPressExitHandler
- IColliderEventClickHandler
- IColliderEventDragStartHandler
- IColliderEventDragUpdateHandler
- IColliderEventDragEndHandler
- IColliderEventDropHandler
- IColliderEventAxisChangedHandler
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using HTC.UnityPlugin.ColliderEvent;
- public class viveLearn : MonoBehaviour,IColliderEventHoverEnterHandler {
- public void OnColliderEventHoverEnter(ColliderHoverEventData eventData){
- Debug.Log ("hover");
- }
- }
如(rú)何把數據手套集成到VIVE開(kāi)發應用裏?
1.首先建(jiàn)立一個UNITY3D工程, 導入(rù)HTC VIVE開(kāi)發包
2.導入WONGLOVE數據手套的(de)U3D開(kāi)發包
在U3D的資(zī)源列表裏(lǐ)可以看到項目裏(lǐ)有WONGLOVE_RIGHTARM.CS腳本和WONGLOVE數(shù)據手套的(de)調用插件程(chéng)序。
3. 把WONGLOVE的調用腳本拖到場景內(nèi)的主相機/ 或者其他物體上,並選擇好數據(jù)手(shǒu)套端口號(可以在控製麵板->設備管理器)。
4. OK, 現(xiàn)在已經建立好了UNITY3D+VIVE環境下數據手套的功能配置。
6. 數據(jù)手套(tào)的主要源碼片段(duàn)
//初始化數據手(shǒu)套
void Start () {
ret_angle=new float[19];
armsensor = new float[12]; //帶有(yǒu)手臂跟蹤功能擴展的(de)數據手套專用
feedback = new byte[5]; //帶有力反饋(kuì)功能能擴展的數據手套專用
openstate = wgInitManu(port); //打開數據手(shǒu)套端口,並對手套標定變量初始化
Debug.Log("open state:"+ openstate.ToString());
}
//這裏是刷新程序片段
void Update () {
if (openstate == 1) {
wgGetAngle (ret_angle); //讀取數據手套(tào)的角度值
wgGetQuat (armsensor); //讀取數(shù)據手套的手臂跟蹤(zōng)傳感(gǎn)器值
}
//模型手臂(bì)旋轉
model_uparm_right.rotation = &armsensor[0];
model_forearm_right.rotation = &armsensor[4];
model_hand_right.rotation = &armsensor[8];
//模型手關節旋轉,以大拇指關節為(wéi)例
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(); //標定數據手(shǒu)套的手指(zhǐ)傳感器
wgResetArm(); //標(biāo)定數(shù)據手套的(de)手(shǒu)臂跟蹤傳感(gǎn)器
}
if (Input.GetKey (KeyCode.Q)) {
Application.Quit(); //禁止自(zì)動標定 //0 - 自動標定
}
}
void OnDestroy () {
if (openstate == 1) {
wgClose ();//程序退出時,關閉數據手套調用資源,並釋放所有申請的(de)內存資源
openstate =0;
Debug.Log ("Glove is closed!");
}
else
Debug.Log ("Glove is NOT closed!");
}
//數(shù)據手套的手勢定義實現過程
//獲取WONGLOVE數據手套當(dāng)前的手勢(shì),例如(rú):0x1f-石頭 0x17-剪子, 0x00-布, 0x1c-OK
int CheckGloveStatus()
{
int gesture = 0; //0x1f; // b1 1111
//大拇指第0位,...小(xiǎo)指(zhǐ)第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工程源碼,請聯係我們。
- 上一篇:一些HTC Vive Tracker開(kāi)發者要注意的問題 2017/11/28
- 下一篇(piān):Unity支持為macOS開發VR及AR內容 2017/11/15