티스토리 뷰

지난 포스팅에서는 순전히 게임에 대한 이야기만 다루고 Kinect의 기능을 활용하는 것은 없었었는데 이번 포스팅에서 한번 다뤄보도록 하겠습니다. 물론 지난 시간에 생성한 프로젝트를 그대로 활용해서 말이지요.


우선 다들 알다시피 Kinect를 활성화시키기 위해서는 Kinect 변수를 초기화시켜줘야 합니다.


이제 LoadContent 부분에서 쓸 기능들에 대한 활성화를 시켜줘야 합니다. 지난 포스팅에서 잠깐 언급했었지만 이번 프로젝트에서는 Color, Depth, Skeleton에 대한 정보를 모두 사용한다고 했습니다. 따라서 그에 따른 기능들을 활성화시켜주면 됩니다. 


이제는 각 기능에 대한 활성화단계를 거쳤으니 어떤 이벤트를 사용하느냐를 결정해줘야 합니다. 사실 정식버전이 나오기 이전 베타버전에서는 위와 같이 3가지 기능을 모두 사용하기 위해서는 그에 이벤트들을 모두 열어줬어야 하지만  정식버전에서는 모두 쓸 수 있는 이벤트가 있습니다. 바로 AllFrameReady 이벤트입니다. 이를 사용하면 되는 것이죠.


이벤트를 만드는 것과 마찬가지로 +=을 해준 후에 탭키를 두번 눌러주면 자동으로 이벤트가 생성됩니다. 이제 이 안을 채워넣어야 합니다. 이 이벤트에서 해줘야할 내용은 이겁니다. 일단 ColorStream으로부터 Color Image를 뽑아옵니다. 물론 이 안에는 사용자도 들어가 있겠지요. 이 이미지에서 사용자의 Skeleton 정보를 뽑아옵니다. 그리고 DepthStream으로부터 사람의 직접적인 DepthData를 받은 후에 그에 해당하는 사용자의 정보를 종이에다가 뚫을겁니다. 이런 것을 다른말로는 Masking이라고 하지요. 반도체에서 마스킹이라는 과정을 거쳐야 하는데, 이 과정은 뻥 뚫어진 틈위로 색을 입히는 형식이라고 보시면 됩니다. 가까운 예로는 스텐실 하는 걸로 이해하시면 될까요? 다만 그 구멍아래로 사람의 ColorStream과 SkeletonStream 이 있어서 위로 보여지는 겁니다. 물론 DepthFrame에 의해서 마스킹된 틀은 계속 사람의 모습을 따라가야 하겠구요..

우선 colorStream을 뽑아오는 작업을 먼저 해보겠습니다. 이 과정은 전에 다뤘던 내용과 거의 동일합니다. 우선은 colorData를 복사해오는 작업이 우선되어야 하겠습니다. 그 후에 새로운 Texture2D에 그 정보를 삽입하는 과정이 지난 번 XNA로 ColorFrame을 뽑을 때 사용하던 내용이었습니다.


이제 이렇게 복사한 Data를 색으로 표현하는 과정이 필요합니다. 이 역시 지난 포스팅에서 다뤘던 내용이었습니다. 


자 이제 테스트를 한번 해볼까요? 우선 Draw에서 spriteBatch.Draw 메서드를 쓰기위해서 그림을 그릴 Texture2D, 그리고 Texture2D가 들어갈 Rectangle, 그리고 색상 정보가 필요합니다. 그런데 지금 위에서 Texture2D인 KinectvideoTexture는 생성했습니다. 그렇기 때문에 Rectangle을 만들어줘야 합니다. 우선 변수부터 선언해줘야 하겠지요.


그다음 지난번 ColorStream을 뽑을 때와 같이 Rectangle을 Initialize 메서드에 작성해줍니다. 크기는 당연히 지금 보여지는 GraphicDevice의 Viewport겠지요.


자 Rectangle도 생성되었기 때문에 Draw 메서드에서 spriteBatch.Draw를 채워주면 되겠습니다. 


자 실행해보시면... 어 오류가 뜹니다. 


자세히 보시면 Texture가 제대로 입력으로 들어오지 않아서 발생하는 오류입니다. 실상 Draw를 해야하는데 그릴 주체가 없으니 오류가 발생하는 겁니다. ColorImage를 받아올때 잠깐의 순간동안을 이 Draw 메서드에서 인식해서 오류를 출력하게 되는 겁니다. 이때는 Texture2D가 있을 때만을 예외처리로 해주면 되겠습니다. 


이렇게 Texture가 있을때만 그리게 해주면 되겠습니다. 다음이 결과 영상입니다. 


이제  이미지를 띄웠으니 다음은 Skeleton을 뽑을 차례입니다. 조금 늘어진 감이 있으니 다음 포스팅에서 이어서 하겠습니다.

댓글