Imi Unity Sdk

by HJIMI

Somatosensory API for Unity

( Crawled 5 hours ago )
+

Quick Start

Step1: 用Unity打开ImiUnitySDK文件夹。或者将imiUnitySDK_versionxxx.unitypackage,任意导入到一个新的Unity工程中,导入全部资源。

Step2: 打开Iminect/Demo/ImiExplore.unity的场景

Step3: 将摄像头和设备连接好,启动设备

注:

1)如果是Android版,无需安装驱动,但要保证关联的设备可以通过电脑进行adb调试,否则无法安装apk应用

2)如果是Windows版,则需要安装win下面的驱动,驱动文件在本目录下。安装好驱动后,打开设备管理器,检查是否安装成功(成功安装后,设备管理器列表中没有黄色的警告标志)

3)Android版本,只支持Android5.0及以上!

Step4: 点击File ----> Build Setting... , 在弹出框中选择PC/Android, 然后点击Build And Run。

注意:目前Android还不支持Debug版本的build,所以请不要勾选Development Build.

Step 5: Demo程序启动后,即可看到效果。

API使用说明

普通使用方式

1. 使用步骤

  1. 将ImiManager.prefab拖入场景
  2. 在属性面板勾选相应的功能:

配置说明

将ImiManager.prefabs拖入场景后,有几个可选配置项,说明如下:

Depth Texture : 是否显示深度图(无玩家标识)

Skeleton Data : 是否使用骨骼数据

User Depth Texture : 是否使用深度图(有玩家标识)

Color Texture : 是否使用彩色图

Start Automatically : 是否自动开启设备,默认自动开启,如果要自己开启,请调用ImiManager.OpenDevice()

Auto Upgrade : 是否自动升级设备,默认不升级。

Show Depth Detail : 是否显示精细的深度图。处理深度图需要耗费一定的资源,如果性能吃紧,建议不要勾选。

Image Resolution : 目前Android上已支持720P和1080P

Depth Resolution : 仅支持640x480

  1. 获取ImiManager的实例,调用相关接口

     ImiManager imiManager = ImiManager.GetInstance();
    

2. API调用示例

  • 打开/关闭设备

      void Start()
        {
          //Getting the instance of ImiManager
          ImiManager imiManager = ImiManager.GetInstance();
    
            //(Optional)Adding Callback when Device is Opened
          imiManager.OnDeviceOpened += OnDeviceOpened;
    
            //Open the device
          imiManager.OpenDevice();
    
      }
    
      void OnDeviceOpened(object sender, EventArgs args)
      {
          //Do something when device is opened
      }
    
  • 获取相应图像
    //Use UGUI's raw image as an example
    public RawImage colorImage;

    //use this texture2d to apply on colorImage
    public Texture2D colorTexture;

    void OnDeviceOpened(object sende, EventArgs args)
    {
        //Do something when device is opened
        if (imiManager.IsDeviceOpened())
        {    
            //Get Texture2D first
            colorTexture = imiManager.GetColorTexture();

            //You can get other type of textures as well
            //We offer 7 kinds of textures currently
            Texture2D depthTexture = imiManager.GetDepthTexture();
            Texture2D userDepthTexture = imiManager.GetUserDepthTexture();
            Texture2D mainUserColorTexture = imiManager.GetMainUserColorTexture();
            Texture2D subUserColorTexture = imiManager.GetSubUserColorTexture();
            Texture2D mainUserDepthTexture = imiManager.GetMainUserDepthTexture();
            Texture2D subUserDepthTexture = imiManager.GetSubUserDepthTexture();
        }
    }
  • 获取用户信息

      void OnDeviceOpened(object sende, EventArgs args)
      {
          if (imiManager.IsDeviceOpened())
          {
              //Needs To Get PlayerId first
              int playerId = imiManager.GetControlPlayerId();
              ImiPlayerInfo playerInfo = imiManager.GetPlayerInfo(playerId);
          }
      }
    
  • 获取骨骼信息

      void OnDeviceOpened(object sende, EventArgs args)
      {
          //Do something when device is opened
          if (imiManager.IsDeviceOpened())
          {
    
              int playerId = imiManager.GetControlPlayerId();
              ImiPlayerInfo playerInfo = imiManager.GetPlayerInfo(playerId);
    
              //Get Player's Skeleton Data
              ImiSkeleton[] skeletons = playerInfo.GetSkeletons();
              //Use skelton position/speed, etc.
              Vector3 position = skeletons[0].position;
              Vector3 speed = skeletons[0].speed;
          }
      }
    
  • 使用手势操作

Step 1.创建一个新类,此类继承ImiGesture(如果使用自带姿势跳过此步骤)

    class MyGesture :ImiGesture
    {
    }

Step 2.在新类中实现CheckGesture方法

    class MyGesture : ImiGesture
    {
        public State CheckGesture(ImiPlayerInfo playerInfo, float timestamp)
        {
            ImiSkeleton[] skeletons = playerInfo.GetSkeletons();
            switch (state)
            {
                case UNCHECKED:
                    if(skeleton[1].speed > 0.1f)
                    {
                        state = CHECKING;
                    }
                    break;
                case CHECKING:
                    if(skeleton[1].speed > 0.1f)
                    {
                        state = FINISHED;
                    }
                    break;
                default:
                    break;
            }
            return state;
        }

    }

Step 3.使用姿势

    //获取ImiGestureManager实例
    ImiGestureManager gestureManager = ImiGestureManager.GetInstance();
    //添加姿势举起右手,以及处理回调事件
    gestureManager.AddGesture(typeof(RaiseRightHand),(gesture,playerInfo,gestureEvent)=> 
    {
        switch (gestureEvent)
        {
            case GestureEvent.Complete:
                break;
            case GestureEvent.Start:
                break;
            case GestureEvent.Moving:
                break;
            case GestureEvent.Cancel:
                break;
            default:
                break;
        }
    });
  • 自定义深度数据处理

      //depthDataProcessor is the custom processing method
      ImiManager.GetInstance().SetDepthDataProcessor(depthDataProcessor);
    

自定义深度图处理代码较为复杂,请参见ImiExplorer.cs的CustomDepthDataProcessor相关示例

高级使用方式(TODO)

如果你是高级的开发者并且希望使用原始的接口来自行封装,那么首先你需要使用 ImiManager 来打开设备。在打开设备后,你可以从 ImiManager 获取到 ImiDevice 。然后调用 ImiDevice 所提供的接口来获取原始数据并自行处理。使用结束后调用 ImiManager 来关闭设备。

  • 获取ImiDevice设备

      //Handles device manually
      ImiDevice imiDevice;
      ImiManager imiManager;
      void Start()
      {
          //Getting the instance of ImiManager
          imiManager = ImiManager.GetInstance();
    
          //(Optional)Adding Callback when Device is Opened
          imiManager.OnDeviceOpened += OnDeviceOpened;
    
          //Open the device
          imiManager.OpenDeviceManually();
      }
    
    void OnDeviceOpened(object sender, EventArgs args)
    {
        //Do something when device is opened
        if(imiManager.IsDeviceOpened())
        {
            imiDevice = imiManager.GetDevice();
        }
    }
  • 打开相应的流
    void OnDeviceOpened(object sender, EventArgs args)
    {
        //Do something when device is opened
        if(imiManager.IsDeviceOpened())
        {
            imiDevice = imiManager.GetDevice();

                       //Open Color Stream
                imiDevice.OpenStream(ImiWrapper.ImiFrameType.IMI_COLOR_FRAME,
                        ImiWrapper.ImiImageResolution.IMI_IMAGE_RESOLUTION_640x480,
                        ImiWrapper.ImiPixelFormat.IMI_PIXEL_FORMAT_IMAGE_RGB24));
               //Open other Stream is the same...

        }
    }

体感设备一共提供五种数据流

         IMI_DEPTH_FRAME    :    深度流
         IMI_SKELETONFRAME    :    骨骼流
         IMI_DEPTH_SKELETON_FRAME    :    深度骨骼流
         IMI_USER_INDEX_SKELETON_FRAME    :    用户骨骼流
         IMI_COLOR_FRAME    :    颜色流
  • 获取相应的数据
    void Update()
    {
        //Get Color Data    
        imiDevice.GetColorData(colorData, 30);

        //Get Depth Data
        imiDevice.GetDepthData(depthData, 30);

        //Get Skeleton Data
        imiDevice.GetSkeletonFrame(ref skeletonFrame, 30);

        //Get Depth And Skeleton Data
        imiDevice.GetDepthDataAndSkeletonFrame(depthData, ref skeletonFrame, 30);

        imiDevice.GetDepthPlayerDataAndSkeletonFrame(depthPlayerDataRaw, ref skeletonFrame, 30);
    }
  • 获取用户信息

      ImiPlayerInfo playerInfo
      void Update()
      {
          //Get Skeleton Frame First
          imiDevice.GetSkeletonFrame(ref skeletonFrame, 30);
    
          //Update playerInfo by skeletonFrame
          if(playerInfo == null)
          {
              playerInfo = new ImiPlayerInfo();
          }
          playerInfo.Update(skeletonFrame);
      }
    
  • 手势相关 ​

    //TODO
    
  • 关闭设备以及关闭流

    void OnDestroy()
    {
        //First you need to close the stream you opened
        imiDevice.CloseStream(ImiWrapper.ImiFrameType.IMI_DEPTH_FRAME);

        //Close Other Streams...

        //Calling ImiManager to Close Device
        imiManager.CloseDevice();
    }

API接口文档

ImiManager

说明

方便用户使用设备的主要接口类,提供如下功能:

  1. 打开设备
  2. 关闭设备
  3. 设置需要打开哪些流
  4. 设置彩色图、深度图分辨率
  5. 获取各类处理过后的图像
  6. 获取用户信息
  7. 获取原始设备,提供用户自定义操作

属性

    //获取深度图开关
    public bool DepthTexture = false;

    //获取骨骼开关
    public bool SkeletonData = false;

    //获取待用户id的深度图开关
    public bool UserDepthTexture = false;

    //获取彩色图开关
    public bool ColorTexture = false;

    //是否自动打开设备:如果不自动打开,则用户手动调用OpenDevice()
    //如果自动打开,则会在场景开始的时候由SDK调用OpenDevice()
    public bool StartAutomatically = true;

    //是否自动升级,开启后会自动检测升级
    public bool AutoUpgrade = false;

    //是否显示深度图细节
    //显示细节的情况下,深度图会有层次感,但是在性能低的机器上导致卡顿
    //不现实细节时候,只会处理识别出来的玩家,性能大大提升,默认关闭
    public bool ShowDepthDetail = false;

    //彩色图分辨率
    public ImiResolution.Type imageResolution = ImiResolution.Type._640x480;
    //深度图分辨率
    public ImiResolution.Type depthResolution = ImiResolution.Type._640x480;

方法

    /**
     * 获取ImiManager的单例
     */
    public static ImiManager GetInstance();

    /**
     *
     * 判断设备是否打开
     * 返回值:true  打开
     *        false 未打开
     */
    public bool IsDeviceOpened();

    /**
     *
     * 打开设备
     * 该方法会打开默认的流,默认的流由开关控制
     */
    public void OpenDevice();

    /**
     *
     * 打开设备,并指定打开相应的流;该方法等同于先在Unity里面勾选相应的流,然后调用Opendevice()
     * 参数:
     * openDepthTexture: 需要深度图
     * openSkeletonData: 需要骨骼数据
     * openUserDepthTexture: 需要包含用户id的深度图
     * openColorTexture: 需要彩色图
     *
     */
    public void OpenDevice(bool openDepthTexture, bool openSkeletonData, bool openUserDepthTexture, bool openColorTexture);

    /**
     *
     * 关闭设备,该方法会关闭所打开的流以及释放内存
     *
     */
    public void CloseDevice();

    /**
     *
     * 获得ImiDevice,让用户自行打开相应流以及获取、处理数据
     * 只有调用OpenDeviceManually();
     * TODO该接口尚未实现
     *
     */
    public ImiDevice GetDevice();

    /**
     *
     * 获取彩色图分辨率
     *
     */
    public ImiResolution GetColorResolution();
    /**
     *
     * 获取深度图分辨率
     *
     */
    public ImiResolution GetDepthResolution();

    /**
     *
     * 获取彩色图
     *
     */
    public Texture2D GetColorTexture();


    /**
     *
     * 获取指定玩家彩色抠图(TODO)
     *
     */
    public Texture2D GetColorTexture(int userId);

    /**
     *
     * 获取指定玩家列表的彩色抠图(整合到一张图中)(TODO)
     *
     */
    public Texture2D GetColorTexture(List<int> ids);

    /**
     *
     * 获取指定玩家的彩色抠图并居中显示(TODO)
     *
     */
    Texture2D GetUserColorTextureInCenter(int userId);


    /**
     *
     * 获取深度图(不含用户标志)
     *
     */
    public Texture2D GetDepthTexture();


    /**
     *
     * 获取含有用户标识的深度图
     *
     */
    public Texture2D GetUserDepthTexture()

    /**
     *
     * 获取指定用户的前景抠图(TODO)
     *
     */
    public Texture2D GetUserDepthTexture(int userId);


    /**
     *
     * 获取指定用户列表的前景抠图(TODO)
     *
     */
    public Texture2D GetUserDepthTexture(List<int> userId);


    /**
     *
     * 获取主控玩家的彩色抠图
     *
     */
    public Texture2D GetMainUserColorTexture()

    /**
     *
     * 获取副控玩家的彩色抠图
     *
     */
    public Texture2D GetSubUserColorTexture()

    /**
     *
     * 获取主控玩家的前景抠图
     *
     */
    public Texture2D GetMainUserDepthTexture()

    /**
     *
     * 获取副控玩家的前景抠图
     *
     */
    public Texture2D GetSubUserDepthTexture()


    /**
     *
     * 设置跟踪玩家的模式(最近或者挥手),被跟踪到的玩家会有骨骼信息返回(TODO)
     *
     */
    public void SetUserTrackingMode(UserTrackingMode mode);

    /**
     *
     * 设置跟踪的UserId,强行跟踪该玩家的骨骼(TODO)
     * 参数:
     * userId 玩家的id
     * 返回:
     * 跟踪成功或失败
     *
     */
    public ErrorCode SetTrackingUserId(int userId);

    /**
     *
     * 获取所有玩家的信息
     *
     */
    public Dictionary<uint, ImiPlayerInfo> GetPlayerInfos()


    /**
     *
     * 获取用户信息
     * 参数:
     * userIndex: 用户Id,可以通过GetControlPlayerId()等方法获取
     *
     */
    public ImiPlayerInfo GetPlayerInfo(int userIndex)

    /**
     *
     * 获取标准化骨骼,骨骼坐标以 Hip Center为原点,根据玩家远近进行相应缩放
     * 参数:
     * userIndex: 用户Id,可以通过GetControlPlayerId()等方法获取
     *
     */
    ImiSkeleton[] GetNormalizedSkeleton(int userIndex);

    /// <summary>
    /// 
    /// </summary>
    /// <param name="userIndex"></param>
    /// <returns></returns>
    /**
     *
     * 获取居中的玩家彩色抠图,玩家抠图位于图片正中,并且根据玩家远近进行缩放
     * 参数:
     * userIndex: 用户Id,可以通过GetControlPlayerId()等方法获取
     *
     */
    Texture2D GetNormalizedColorTexture(int userIndex);

    /**
     *
     * 设置主控玩家;该方法可能会触发主控玩家变更的回调
     *
     */
    public void SetControlPlayerId(int userId)

    /**
     * 
     * 获取主控玩家Id
     *
     */
    public int GetControlPlayerId()

    /**
     *
     * 获取副控玩家Id
     *
     */
    public int GetSubPlayerId()


    /**
     *
     * 设置主控玩家变更的Observer
     *
     */
    public void SetControlPlayerChangeListener(OnControlPlayerChanged observer)

    /**
     *
     * 设置新玩家进入的Observer
     * TODO该接口尚未实现
     *
     */
    public void SetPlayerEnteredListener(OnPlayerEntered observer)


    /**
     *
     * 设置玩家丢失的Observer
     *
     */
    public void SetPlayerLostListener(OnPlayerLost observer);

    /**
     *
     * 设置自定义深度数据处理方法
     *
     */        
    public void SetDepthDataProcessor(DepthDataProcessor processor);

    /**
     * 自定义彩色图数据处理
     */
    public void SetColorDataProcessor(ColorDataProcessor processor);

    /**
     * 自定义彩色+深度数据处理(抠图用)
     */
    public void SetRawDataProcessor(RawDataProcessor processor);

事件

    /**
     * 设备打开后回调
     */
    public event EventHandler OnDeviceOpened;

    /**
     * 设备关闭后回调
     */
    public event EventHandler OnDeviceClosed;

    /**
     * 设备连接口回调
     */
    public event EventHandler OnDeviceConnected;

    /**
     * 设备断开连接回调
     */
    public event EventHandler OnDeviceDisConnected;

    /**
     * 主控玩家变更回调
     * 参数:
     * userIndex: 变更后主控玩家的id
     */
    public delegate void OnControlPlayerChanged(int userIndex);

    /**
     * 新的玩家进入
     * 参数:
     * userId: 进入的新玩家的Id
     * TODO该接口尚未实现
     */
    public delegate void OnPlayerEntered(int userId);

    /**
     * 丢失玩家
     * 参数:
     * userId: 丢失玩家的id
     * TODO该接口尚未实现
     */
    public delegate void OnPlayerLost(int userId);

    /**
     * 自定义深度数据处理
     * 参数:
     * depthData: 原始深度数据
     */
    public delegate void DepthDataProcessor(ushort[] depthData);

    /**
     * 自定义彩色数据处理
     * 参数:
     * colorData: 原始彩色数据
     */
    public delegate void ColorDataProcessor(byte[] colorData);

    /**
     * 自定义彩色+深度数据处理(抠图用)
     * 参数:
     * colorData: 原始彩色数据
     * depthData: 原始深度数据
     */
    public delegate void RawDataProcessor(byte[] colorData,ushort[] depthData);

ImiGestureManager

说明

姿势管理类,负责添加姿势和删除姿势

方法

    /**
     * 获取实例
     */
    public static ImiGestureManager GetInstance();


    /**
     * 添加姿势到所有玩家
     * gesture   姿势类别
     * listener  姿势事件触发回调
     */
    public void AddGesture(System.Type gesture,ImiGesture.OnGestureEvent listener);

    /**
     * 添加姿势到主控玩家
     * gesture   姿势类别
     * listener  姿势事件触发回调
     */
    public void AddGestureToMainPlayer(System.Type gesture,ImiGesture.OnGestureEvent listener);

    /**
     * 添加姿势到所有副控玩家
     * gesture   姿势类别
     * listener  姿势事件触发回调
     */
    public void AddGestureToSubPlayer(System.Type gesture,ImiGesture.OnGestureEvent listener);

    /**
     * 添加Pro姿势到所有玩家
     * gestureType   姿势类别
     * listener      姿势事件触发回调
     */
    public void AddGesturePro(ImiGesturePro.GestureType gestureType,ImiGesture.OnGestureEvent listener);

    /**
     * 添加Pro姿势到主控玩家
     * gestureType   姿势类别
     * listener      姿势事件触发回调
     */
    public void AddGestureToMainPlayerPro(ImiGesturePro.GestureType gestureType,ImiGesture.OnGestureEvent listener);

    /**
     * 添加姿势到副控玩家
     * gestureType   姿势类别
     * listener      姿势事件触发回调
     */
    public void AddGestureToSubPlayerPro(ImiGesturePro.GestureType gestureType,ImiGesture.OnGestureEvent listener);


    /**
     * 从所有玩家身上移除姿势
     * gesture   姿势类别
     */
    public void RemoveGesture(System.Type gesture);

    /**
     * 从主控玩家身上移除姿势
     * gesture   姿势类别
     */
    public void RemoveMainPlayerGesture(System.Type gesture);

    /**
     * 从副控玩家身上移除姿势
     * gesture   姿势类别
     */
    private void RemoveSubPlayerGesture(System.Type gesture);

    /**
     * 从所有玩家身上移除Pro姿势
     * gestureType   姿势类别
     */
    public void RemoveGesturePro(GestureType gestureType);

    /**
     * 从主控玩家身上移除Pro姿势
     * gestureType   姿势类别
     */
    public void RemoveMainPlayerGesturePro(GestureType gestureType);

    /**
     * 从副控玩家身上移除Pro姿势
     * gestureType   姿势类别
     */
    public void RemoveSubPlayerGesturePro(GestureType gestureType);

ImiGesture

说明

姿势检测的类,抽象类,所有姿势类的父类

实现自定义姿势的时候,需要继承该类并实现CheckGesture方法。

如果重写了GestureEvent方法,则该方法会在姿势触发的时候被回调。

属性

    //姿势的名称
    public string name;
    //姿势的类别,包括两种:持续性和触发性
    public Type type;
    //Gesture的状态
    public State state;
    //姿势开始的时间戳
    public float startTime;
    //姿势当前的时间戳
    public float currentTime;
    //姿势当前持续多久
    public float progress;

    public enum GestureEvent
    {
        Complete,//姿势完成
        Cancel,//姿势取消
        Start,//姿势开始
        Moving//姿势进行中
    }

    public enum Type
    {
        //持续性姿势,如跑步
        LASTING,
        //瞬时性姿势,如举手
        IMMEDIATE,
    }

    public enum State
    {
        //未检测到姿势
        UNCHECKED,
        //检测到姿势开始,正在检测中
        CHECKING,
        //检测到姿势完成
        FINISHED,
        //检测到姿势取消
        CANCELLED,
    }

方法

    /**
     * 检测姿势, 抽象函数,继承ImiGesture必须实现,参数:
     * PlayerInfo 用户信息
     * TimeStamp  当前时间戳
     */
    public abstract State CheckGesture(ImiPlayerInfo playerInfo, float timestamp);


    /**
     * 检测到姿势后回调函数,参数:
     * gesture  姿势对象
     * player   玩家信息
     * gevent   姿势事件类别
     */
    public virtual void GestureEvent(ImiGesture gesture, ImiPlayerInfo player,GestureEvent gevent);

事件

    /**
     * 检测到姿势事件发生
     * gesture  姿势对象
     * player   玩家信息
     * gevent   姿势事件类别
     */
    public delegate void OnGestureEvent(ImiGesture gesture, ImiPlayerInfo player,GestureEvent gevent);

ImiPlayerInfo

说明

打开设备、关闭设备(相应的流、分辨率为参数),以及回掉

获得相应的Texture 添加手势监听,以及回掉 获得用户信息ImiPlayerInfo

属性

    //玩家的userId
    public uint userId;

    //玩家的位置
    public Vector3 playerPosition;

    //玩家所处的平面
    public Vector3 playerGround;

    //玩家所关注的姿势列表
    public List<IminectGestures> playerGestures;

    //玩家所有骨骼信息
    public ImiSkeleton[] skeletons;

方法

    /**
     * 获取玩家所有骨骼信息
     */        
    public ImiSkeleton[] GetSkeletons();

    /**
     * 获取玩家所有骨骼被跟踪的状态
     */        
    public bool[] GetPlayerJointsTracked();

    /**
     * 获取玩家所有骨骼位置
     */        
    public Vector3[] GetPlayerJointsPos()

    /**
     * 获取玩家所有骨骼速度
     */        
    public Vector3[] GetPlayerJointsSpeed()

    /**
     * 获取玩家id
     */        
    public int GetUserId();

    /**
     * 获取玩家是否被检测到
     */        
    public bool GetPlayerTracked();

    /**
     * 获取玩家现实坐标的位置
     */        
    public Vector3 GetPlayerPosition();

    /**
     * 获取玩家所有肘关节的角度
     */
    public Vector3[] GetPlayerLimbsAngular();

ImiSkeleton

说明

封装了骨骼的位置、速度、朝向等信息

属性

    //该骨骼是否被追踪到
    public bool isTracked;

    //骨骼位置
    public Vector3 position;


    //骨骼速度
    public Vector3 speed;

    //从设备传来的原始数据
    public ImiWrapper.ImiVector4 positionV4;

    //每个骨骼
    public Quaternion orientation;

ImiDevice(TODO)

说明

提供体感设备原始的功能,如打开流、关闭流,获取数据信息等,封装了ImiWrapper的原始接口。

属性

方法

    /**
     * 打开相应的数据流
     */
    public ErrorCode OpenStream(ImiWrapper.ImiFrameType frameType, ImiResolution.Type imageResolution, ImiWrapper.ImiPixelFormat pixelFormat);

    /**
     * 关闭相应的数据流
     */
    public ErrorCode CloseStream(ImiWrapper.ImiFrameType frameType);

    /**
     * 获得深度图信息
     */
    public ErrorCode GetDepthData(ushort[] depthData, uint timeOut);

    /**
     * 获得深度图信息和骨骼信息
     */
    public ErrorCode GetDepthDataAndSkeletonFrame(ushort[] depthData, ref ImiWrapper.ImiSkeletonFrame skeletonFrame, uint timeOut);

    /**
     * 获得骨骼信息
     */
    public ErrorCode GetSkeletonFrame(ref ImiWrapper.ImiSkeletonFrame skeletonFrame, uint timeOut);

    /**
     * 获得包含玩家id的深度图数据和骨骼信息
     */
    public ErrorCode GetDepthPlayerDataAndSkeletonFrame(ushort[] depthPlayerData, ref ImiWrapper.ImiSkeletonFrame skeletonFrame, uint timeOut);

    /**
     * 获得彩色信息
     */
    public ErrorCode GetColorData(byte[] colorData, uint timeOut);

    /**
     * 开启骨骼平滑
     * 参数:isEnable 是否开启
     */
    public void EnableSmoothSkeletonFrame(bool isEnable);

    /**
     * 获得设备状态(连接、未连接)
     */
    public ImiWrapper.ImiDeviceState GetDeviceState();

事件

ImiResolution

说明

设备所支持的各类分辨率,并且提供相应便捷的方法。支持的分辨率如下:

    public enum Type
    {
        INVALID = -1,
        _320x240 = 0,
        _640x480 = (_320x240+1),
        _1280x720 = (_640x480 + 1),
        _1920x1080 = (_1280x720 + 1)
    }

属性

    //分辨率是多少,上述type中的一个
    public Type type; 

    //分辨率高度
    public int Height;

    //分辨率宽度
    public int Width;

    //分辨率大小:宽x高
    public int Size;

方法

事件

Utils

说明

提供常用的方法

属性

方法

    /**
     * 把骨骼坐标转化为深度坐标
     */
    public static void ConvertSkeletonPointToDepthPoint(ImiWrapper.ImiVector4 skeletonPosition, ref int depthX, ref int depthY, ref int depthZ, ImiResolution.Type depthReslution);

    /**
     * 把深度坐标转化为彩色坐标
     */
    public static void ConvertDepthPointToColorPoint(int depthX, int depthY, int depthZ, ref int colorX, ref int colorY, ImiResolution.Type depthReslution, ImiResolution.Type colorReslution);


    /**
     * 把深度坐标转化为骨骼坐标
     */
    public static void ConvertDepthPointToSkeletonPoint(int depthX, int depthY, int depthZ, ref ImiWrapper.ImiVector4 skeletonPosition, ImiResolution.Type depthReslution);

事件

版本号说明

版本号形式构成位vA.B.C

其中,

A 代表大版本,每次大的更新递增1

B 代表小版本,大版本中,小功能增加,每次递增1

C 代表bug修复号,没有功能增加的情况下,仅修复bug,每次递增1

常见问题

0. 为何无法在Editor里面直接运行起来?为何在Editor中运行起来了却不展示彩色图?

对于64位的UnityEditor,缺少相应的dll文件,请将EditorSupport文件夹下面的所有dll文件,拷贝到Unity项目的根目录,就是Assets的平级目录,然后就可以在Editor中运行起来的。目录结构看起来像这样的:

Unity工程目录结构

Assets/

Library/

ProjectSettings/

avcodec-56.dll

avutil-54.dll

...其他的dll文件...

1. 新版的各个类都是干什么用的?

ImiManager.cs

这个类目前只提供了一个安卓上权限管理的功能。以后会作为一个帮助类,扩展功能并且提供一些方便操作的方法。

ImiAndroidHelper.cs

提供一些Android方法的调用,包括获取Usb读写权限、阻止锁屏等。通常开发者无需手动调用该类。

ImiWrapper.cs

这个类,可以认为是一个头文件,里面包含了一些数据结构的定义,以及摄像头最基础的接口。这个类所定义的方法均有C++实现,通过这个类可以获取摄像头所提供的最原始数据,并且任由开发者调用和处理。通常开发者无需手动调用该类。

2. ImiDemo,ImiManager与以前版本中的IminectManager有何关系?

其实是IminectManager被重新命名为ImiDemo。因为之前IminectManager本来就是为了给开发者使用ImiWrapper提供实例写法,并非让开发者调用的。

ImiManager是今后会不断扩充接口方便开发的主要类。ImiDemo仍然是一个ImiWrapper调用示例。

如果你的程序已经调用了IminectManager.cs里面所提供的一些方法,没有关系,可以继续调用,但是以后SDK里面将不会继续提供IminectManager。可以作为开发者自己项目中的脚本自行修改维护。

3. 是否可以通过玩家坐标来判断是否为玩家一或者玩家二?

设备上是不区分玩家一或者玩家二的。开发者可以调用ImiManager.SetControlPlayerId()来手动设置主控玩家。如果开发者没有设置,目前玩家一(主控玩家)的规则是,userId小的是玩家一。

4. 我获取的图像显示的是镜像,左右翻转,如何反过来?

镜像图像从底层传过来的就是如此,如果想要左右翻转来使用,参考ImiExplorer里面的处理方法。把显示图像的GameObject的Scale中x设置为负的即可。

5. 项目是否支持Unity4.x版本?

不支持Unity4.x版本。如果非要在Unity4.x版本中使用,需要自己动手来做。可以到Unity4.x文件夹中找到相应的方案。注意:Unity4.x中使用到了NGUI,但是我没有添加进去,请使用者手动添加NGUI的包来显示。

目录说明:

Doc/

使用文档

Release/

最新发布的版本都放到这里

ImiUnitySDK/

Unity工程

Unity4.x/

支持Unity4.x的代码,但是不进行维护;开发者需自行维护

开发者可以直接到Release目录下下载最新的发布包

[email protected]