| 
 | 
 
一、使用方式: 
彩色帧获取需要两个脚本,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] |   
 
 
 
 |