【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2662|回复: 1

[体感与外设] Kinect v2.0 for Unity---彩色帧

[复制链接]
发表于 2016-2-1 15:15:06 | 显示全部楼层 |阅读模式
一、使用方式:
彩色帧获取需要两个脚本,ColorSourceManager和ColorSourceView,使用时新建一个空物体,并为其添加ColorSourceManager,在新建一个plane或者cube,添加ColorSourceView作为输出展示载体。ColorSourceView需要一个公共变量,将ColorSourceManager所在的空物体拖入即可。
二、脚本执行过程:
ColorSourceManager脚本:
该脚本成员变量及含义如下:
[mw_shl_code=csharp,true]public int ColorWidth { get; private set; }                 //彩色帧宽度
public int ColorHeight { get; private set; }                //彩色帧高度
        
private KinectSensor _Sensor;                               //传感器对象
private ColorFrameReader _Reader;                           //彩色帧阅读器对象
private Texture2D _Texture;                                 //纹理对象
private byte[] _Data;                                       //LoadRawTextureData的参数,用于临时存储彩色帧数据[/mw_shl_code]

脚本拥有一个公共接口,用于返回脚本的_Texture,该变量包含了需要ColorSourceView输出的纹理
[mw_shl_code=csharp,true]/// <summary>
    /// 公共接口,用于向ColorSourceView返回ColorSourceManager获得的Texture2D对象
    /// </summary>
    /// <returns>ColorSourceManager获得的Texture2D对象</returns>
    public Texture2D GetColorTexture()
    {
        return _Texture;
}
[/mw_shl_code]
脚本Start函数用于读取数据工作的初始化,具体执行过程如下:
[mw_shl_code=csharp,true]   void Start()
    {
        //获得默认的传感器对象
        _Sensor = KinectSensor.GetDefault();
        
        if (_Sensor != null)
        {
            //打开彩色帧阅读器对象
            _Reader = _Sensor.ColorFrameSource.OpenReader();

            //创建FrameDescription对象,对象中包含彩色帧的宽度高度等信息
            var frameDesc = _Sensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Rgba);
            ColorWidth = frameDesc.Width;//1920
            ColorHeight = frameDesc.Height;//1080
            
            //根据彩色帧高度宽度等值创建纹理对象
            _Texture = new Texture2D(frameDesc.Width, frameDesc.Height, TextureFormat.RGBA32, false);
            //FrameDescription对象中包含每一个像素的byte值和总共的像素值,相乘得到总的byte值作为数据区的长度,在LoadRawTextureData函数中使用
            _Data = new byte[frameDesc.BytesPerPixel * frameDesc.LengthInPixels];
            
            //打开传感器
            if (!_Sensor.IsOpen)
            {
                _Sensor.Open();
            }
        }[/mw_shl_code]

脚本在Update函数中获取有效帧,再从有效帧中得到彩色帧数据,放进_Data中,通过LoadRawTextureData函数得到纹理,具体代码解释如下:
   [mw_shl_code=csharp,true] void Update ()
    {
        if (_Reader != null)
        {
            //这个称为轮询模式,有空的时候来问一下Kinect有没有新的彩色帧,这个模式适合游戏
            var frame = _Reader.AcquireLatestFrame();
            
            if (frame != null)
            {
                //调用ColorFrame中的CopyConvertedFrameDataToArray,将转换之后的彩色帧数据放进_Data数据区
                frame.CopyConvertedFrameDataToArray(_Data, ColorImageFormat.Rgba);
                //根据_Data数据区中的数据内容加载纹理对象
                _Texture.LoadRawTextureData(_Data);
                //应用更改过的纹理数据
                _Texture.Apply();
               
                //释放并关闭帧数据
                frame.Dispose();
                frame = null;
            }
        }
}[/mw_shl_code]

最后,在引用程序退出时,释放资源,关闭对象:
  [mw_shl_code=csharp,true]  /// <summary>
    /// 在应用程序退出的时候,该释放的释放,该关闭的关闭
    /// </summary>
    void OnApplicationQuit()
    {
        if (_Reader != null)
        {
            _Reader.Dispose();
            _Reader = null;
        }
        
        if (_Sensor != null)
        {
            if (_Sensor.IsOpen)
            {
                _Sensor.Close();
            }
            
            _Sensor = null;
        }
}
[/mw_shl_code]
ColorSourceView脚本:
该脚本的成员变量即为ColorSourceManager对象:
[mw_shl_code=csharp,true]public GameObject ColorSourceManager;
private ColorSourceManager _ColorManager;[/mw_shl_code]

Start函数设置初始纹理大小:
[mw_shl_code=csharp,true]    void Start ()
    {
        //初始设置纹理大小
        gameObject.GetComponent<Renderer>().material.SetTextureScale("_MainTex", new Vector2(-1, 1));
}[/mw_shl_code]

Update函数实时调用ColorSourceManager中的GetColorTexture函数,用于得到纹理数据,再将它显示出来,其余则是防御性代码:
   [mw_shl_code=csharp,true] void Update()
    {
        if (ColorSourceManager == null)
        {
            return;
        }
        
        _ColorManager = ColorSourceManager.GetComponent<ColorSourceManager>();
        if (_ColorManager == null)
        {
            return;
        }

        //调用ColorSourceManager中的GetColorTexture函数,将返回的纹理对象赋值给ColorSourceView对象的纹理属性
        gameObject.GetComponent<Renderer>().material.mainTexture = _ColorManager.GetColorTexture();
    }[/mw_shl_code]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-5-5 21:39

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表