2014-09-16 2 views
0

Хорошо так, чтобы лучше объяснить себе:Kinect One & Unity - проблема BodyIndexSource рама, рисунок "тело-тень" с помощью BodyIndexSource

Цель: Making "теневые фигуры" в единстве Использование: Kinect One, Unity, C#

Я использую источник примера Windows, который они предоставляют для Unity.


В основном то, что я сделал это сделать BodyIndexSourceManager.cs и BodyIndexSourceView.cs таким же образом они сделали данные показывают цвет/глубина/Infrared/BodySource в единстве. Я не вижу проблемы, но это также связано с тем, что я никогда не работал с байтовыми данными в глубину, и мало что известно о том, какие данные фактически получены из потока BodyIndexSource.


Пример кода:

public class BodyIndexSourceManager : MonoBehaviour 
    { 

    public int IndexWidth { get; private set; } 
    public int IndexHeight { get; private set; } 

    private KinectSensor _Sensor; 
    private BodyIndexFrameReader _Reader; 
    private Texture2D _Texture; 
    private byte[] _Data; 

    public Texture2D GetTexture() 
    { 
     return _Texture; 
    } 
    void Start() 
    { 
     _Sensor = KinectSensor.GetDefault(); 
     if (_Sensor != null) 
     { 
      _Reader = _Sensor.BodyIndexFrameSource.OpenReader(); 
      var frameDesc = _Sensor.BodyIndexFrameSource.FrameDescription; 
      IndexWidth = frameDesc.Width; 
      IndexHeight = frameDesc.Height; 
      _Texture = new Texture2D(frameDesc.Width, frameDesc.Height, TextureFormat.RGBA32, false); 
      if (!_Sensor.IsOpen) 
      { 
       _Sensor.Open(); 
      } 
     } 
    } 

    void Update() 
    { 
     if (_Reader != null) 
     { 
      var frame = _Reader.AcquireLatestFrame(); 
      if (frame != null) 
      { 
       Debug.Log("frame not null"); 
       frame.CopyFrameDataToArray(_Data); 
       _Texture.LoadRawTextureData(_Data); 
       _Texture.Apply(); 
       frame.Dispose(); 
       frame = null; 
      } 
     } 
    } 

    void OnApplicationQuit() 
    { 
     if (_Reader != null) 
     { 
      _Reader.Dispose(); 
      _Reader = null; 
     } 
     if (_Sensor != null) 
     { 
      if (_Sensor.IsOpen) 
      { 
       _Sensor.Close(); 
      } 
      _Sensor = null; 
     } 
    } 
    } 

Следующая класс:

public class BodyIndexSourceView : MonoBehaviour 
{ 
    public GameObject BodyIndexSourceManager; 
    private BodyIndexSourceManager _bodyIndexManager; 

    void Start() 
    { 
     gameObject.renderer.material.SetTextureScale("_MainTex", new Vector2(-1, 1)); 
    } 

    void Update() 
    { 
     if (BodyIndexSourceManager == null) 
     { 
      return; 
     } 

     _bodyIndexManager = BodyIndexSourceManager.GetComponent<BodyIndexSourceManager>(); 
     if (_bodyIndexManager == null) 
     { 
      return; 
     } 

     gameObject.renderer.material.mainTexture = _bodyIndexManager.GetTexture(); 
    } 
    } 

Я, вероятно, просто делать неправильные вещи или наблюдением за что-то. Надеюсь, кто-то может показать мне некоторое понимание, чтобы я мог продолжить!^_^Спасибо заранее за любой ответ.

Резюме: Если вы знаете, что лучший подход нарисовать «только» пиксельные-данные отслеживаются тел в Unity через Kinect One, пожалуйста, дайте мне знать, или сказать мне, что я делаю неправильно для начала @ приведенный выше код.

ответ

1

А, я узнал, что главный вопрос, почему это не сработало. Поток BodyIndexSource всегда находится в КОМБИНАЦИИ с помощью DepthSource.


Так короче:

Метод

Start() требует MultiSourceReader, то метод Update() "рассекает" на _reader.AcquireLatestFrame() в DepthFrame и BodyIndexFrame. Без DepthFrame вы не сможете получить значения из BodyIndexFrame. Или, по крайней мере, это так.

Затем вы «просто» заполняете логику, чтобы на самом деле написать Texture2D и voila, у вас есть что-то пригодное для использования в Unity3D.