HI5-2 交互 SDK 用户手册—— HTC Vive 系列

时间:2022-10-04 16:52:30

相关文档与SDK下载地址:Hi5 2.0 插件下载 - Powered By Noitom Internet Team

 一、 Unity VR 基础环境配置

请使用 Unity 2019.x/2020.x/2021.x LTS 版本新建工程,Unity 2022 版本正在适配中。

1. 插件下载

下载最新版本 Steam VR Unity 插件。
硬件请确保应用的是 Steam VR Lighthouse 方案 2.0,并安装 steam 和 steamvr 软件。
定位基站:SteamVR Base Station 2.0
HI5-2 交互 SDK 用户手册—— HTC Vive 系列 

 追踪器:HTC Vive Tracker 2.0/3.0

HI5-2 交互 SDK 用户手册—— HTC Vive 系列

 2. 插件安装

1) 新建或打开 Unity 工程
HI5-2 交互 SDK 用户手册—— HTC Vive 系列
2) 打开插件文件夹,将 Assets 文件夹中 SteamVR 目录拷贝到 Unity 工程中的 Assets文件夹中
。(当然这还有很多插件导入的方式,比如下载Steam VR plunge,然后导入工程。或再Unity 商店中下载插件进行导入。)
3) 然后等待插件导入
HI5-2 交互 SDK 用户手册—— HTC Vive 系列
4) SteamVR 插件导入成功后,弹窗中点击 UnityXR 按钮,然后点击 Accept All 按钮,
5) 安装完成后会弹出 Project Settings,显是 OpenVR Loader 插件处于应用状态,表示
插件安装成功,(弹框选择点击 Accept All 按钮)如图所示:
HI5-2 交互 SDK 用户手册—— HTC Vive 系列 
完成以上配置后即可在窗口中找到 SteamVR Input 按钮,点击 Windows ->SteamVR Input
若弹出 Copy Examples 弹窗,点击 Yes 按钮,然后等待导入和编译。
HI5-2 交互 SDK 用户手册—— HTC Vive 系列 

二、 Hi5_2 交互 SDK 安装

Unity VR 环境配置完成后,先安装 Hi5-2 SDK ,再安装交互 SDK
1) 先导入 Hi5-2 SDK : Hi5_2_Package_Vive.unitypackage
2) 再导入交互 SDK: Hi5_2_Interaction_Vive.unitypackage
备注:导入SDK方法:点击->Assets->Importing Package->Custom Package…找到SDK文件,进行确认。

三、 Hi5_2 交互 SDK 应用

1. 工程设置

点击 Edit ->Project Settings 打开工程设置窗口,如图所示:
1.1 设置 Tags and Layers
Layer 8     Hi5OtherFingerTail
Layer 9     Hi5OtherFingerOther
Layer 10   Hi5Palm
Layer 11   Hi5ObjectGrasp
Layer 12   Hi5Plane
Layer 13   Hi5ObjectTrigger
Layer 14   Hi5IndexFingerTail
HI5-2 交互 SDK 用户手册—— HTC Vive 系列
1.2 设置 Physics
HI5-2 交互 SDK 用户手册—— HTC Vive 系列

2. 场景设置  

打开示例场景 TableScene_Vive,参考其设置,如图所示
HI5-2 交互 SDK 用户手册—— HTC Vive 系列
场景中必须包含以下内容:
1) Hi5 Interaction Manager
HI5-2 交互 SDK 用户手册—— HTC Vive 系列

2) Hi5_Interaction_Objects
HI5-2 交互 SDK 用户手册—— HTC Vive 系列

3) Hi5_Interaction_Simple_Objects

HI5-2 交互 SDK 用户手册—— HTC Vive 系列

4) Hi5_Left_Hand_C ,Hi5_Right_Hand_C ,Hi5_Left_Hand_V ,Hi5_Right_Hand_V

HI5-2 交互 SDK 用户手册—— HTC Vive 系列

3. 物体设置

3.1 普通交互物体设置
物体设置分为父级物体和子级物体设置,父级物体 Layer 要设置为 Hi5ObjectGrasp,子
级物体 Layer 要设置为 Hi5ObjectTrigger,例如 Interaction_Object_4 ->Cube,设置如
图所示:

HI5-2 交互 SDK 用户手册—— HTC Vive 系列

HI5-2 交互 SDK 用户手册—— HTC Vive 系列

3.2 组合物体设置

组合物体分为三层, 组合物体的最外层物体 Layer 设置为 Default,组合物体中的外层物体
的 Layer 设 置 为 Hi5ObjectGrasp , 组 合 物 体 中 的 内 层 物 体 的 Layer 设 置 为 Hi5ObjectTrigger,例如 Interaction_Compound_Object_10,设置如图所示:

HI5-2 交互 SDK 用户手册—— HTC Vive 系列

HI5-2 交互 SDK 用户手册—— HTC Vive 系列HI5-2 交互 SDK 用户手册—— HTC Vive 系列

3.3 简单物体设置

简单物体只有抓握等功能,自身不会产生运动,当抓住释放后会停留在原位置,其 Layer
要设置为 Hi5ObjectGrasp,例如 Interaction_Simple_Object_2,设置如图所示:

HI5-2 交互 SDK 用户手册—— HTC Vive 系列

3.4 桌面物体

桌面放置物体的 Layer 要设置为 Hi5_Plane,例如 Box001,设置如图所示:

HI5-2 交互 SDK 用户手册—— HTC Vive 系列

 4. 按钮设置

例如 Button_Interaction_3,设置如图所示:

HI5-2 交互 SDK 用户手册—— HTC Vive 系列

之后就可以点击运行啦

HI5-2 交互 SDK 用户手册—— HTC Vive 系列 

四、 相关接口

1. 手相关接口

Hi5_Interface_Hand 脚本 

一、手状态

enum E_Interface_Hand_State
{
    ERelease = -1,
    EPinch = 2,
    ELift = 4,
}
E_Interface_Hand_State GetHandState(out int interactionObjectId)
E_Interface_Hand_State 返回手部状态,interactionObjectId 返回交互物体 Id 索引

二、手姿态识别状态

enum Hi5_Glove_Gesture_Recognition_State { 
    ENone = 0, 
    EOk, 
    EFist, 
    EIndexPoint, 
    EHandPlane 
}
Hi5_Glove_Gesture_Recognition_State GetRecognitionState()
Hi5_Glove_Gesture_Recognition_State 返回手当前状态

2. 手事件接口

public void MessageFun(string messageKey, object param1, object param2) 
{ 
    if (messageKey.CompareTo(Hi5_Glove_Interaction_Message.Hi5_MessageMessageKe y.messageHandEvent) == 0) 
    { 
        Hi5_Glove_Interaction_Hand_Event_Data data = param1 as Hi5_Glove_Interaction_Hand_Event_Data; 
        switch (data.mEventType) 
        { 
            case EEventHandType.EClap: 
            { 
                //拍击事件 
            } break; 
            case EEventHandType.EPoke: 
            {
                //戳事件 
            } break; 
            case EEventHandType.EPinch: 
            { 
                //抓取事件 
            } break; 
            case EEventHandType.EThrow: 
            {
                //抛出事件 
            } break; 
            case EEventHandType.ELift: 
            {
                //托举事件 
            } break; 
            case EEventHandType.ERelease: 
            {
                //释放事件 
            }break; 
        } 
    } 
}

 3. 交互物体接口

Hi5_Interface_Object

交互物体状态

enum E_Object_State { 
    ENone = -1, 
    EStatic = 1, 
    EPinch = 3, 
    EMove = 2, 
    EClap = 4, 
    EFlyLift = 5, 
    EPoke = 6, 
}
E_Object_State GetObjectItemState();获取交互物体状态
int GetObjectId();返回交互物体 Id

交互物体事件

public void MessageFun(string messageKey, object param1, object
param2){ 
    if (messageKey.CompareTo(Hi5_Glove_Interaction_Message.Hi5_MessageMessageKe y.messageObjectEvent) == 0) 
    { 
        Hi5_Glove_Interaction_Object_Event_Data data = param1 as Hi5_Glove_Interaction_Object_Event_Data; 
        if (data.mObjectId == ObjectItem.idObject) 
        { 
            switch (data.mEventType) 
            { 
                case EEventObjectType.EClap: 
                {

                }break; 
                case EEventObjectType.EPoke: 
                {

                }break;
                case EEventObjectType.EPinch: 
                {

                }break;
                case EEventObjectType.EMove: 
                {

                }break;
                case EEventObjectType.ELift: 
                {

                }break;
                case EEventObjectType.EStatic: 
                if (mItem != null) { 
                    mItem.ResetCorlor(); 
                }break; 
            } 
        } 
    } 
}

 4. 按钮接口

Hi5_Interface_Button virtual public void MessageFun(string messageKey, object param1, object param2) 
{ 
    if (messageKey.CompareTo(Hi5_Glove_Interaction_Message.Hi5_MessageMessageKe y.messageObjectEvent) == 0) 
    {
        Hi5_Glove_Interaction_Object_Event_Data data = param1 as Hi5_Glove_Interaction_Object_Event_Data; 
        if (data.mObjectId == ObjectItem.idObject) 
        { 
            if (data.mEventType == EEventObjectType.EClap) 
            {
                
            }else if (data.mEventType == EEventObjectType.EPoke) 
            { 
                
            }else if (data.mEventType == EEventObjectType.EStatic) 
            {    
                
            } 
        } 
    } 
}

备注:

 运行时,电脑防火墙要关闭。