티스토리 뷰

Kinect

[Kinect 프로젝트] Interpreting and Evaluating Movement

생각많은 소심남 2012. 8. 9. 23:25

지난 포스트에서는 머리와 양손에 대한 좌표점을 통해서 이미지를 씌우고 움직이는 건 간단하게 해봤습니다. 물론 더 활용하면 그 골격을 제외한 나머지 부분에도 이미지를 입혀서 하나의 마리오네트를 형성할 수 있을겁니다.


그런데 이런 생각은 안해 보셨나요? 지금 손의 x,y 좌표를 구할 수 있으니까 이 걸 통해서 하나의 제스처를 만들 수 있지 않을까 하고 말입니다. 물론 손가락으로 간단하게 하는 제스처는 힘들겠지만 단순하게 손을 움직이면서 하는 제스처는 만들어 낼 수 있습니다. 참고로 제가 나갔던 이매진 컵 키넥트 분야에서도 그런 부분을 바탕으로 게임을 구성했습니다.

2012/07/10 - [About Me] - Imagine Cup 2012 Certification

 그래서 이번 포스트에서는 그런 제스처를 활용해서 이벤트를 만들어보도록 하겠습니다. 프로젝트는 지난 시간의 프로젝트를 계속 이어서 사용할 겁니다. 우선 다음의 이미지를 다운 받습니다. 



만약 정상적인 제스처를 했다면 이 이미지가 뜨게끔 하게 하려고 합니다. 우선 이미지를 Content 프로젝트에 삽입하고 지난 시간에 했던 내용을 조금 수정해보겠습니다. 지난 포스트까지는 Initialize에서 Content를 Load 하는 작업을 수행했었는데 사실 이 부분은 LoadContent 라는 부분이 따로 있어서 그 안에다가 삽입해주는 것이 좋습니다. 그래서 Initialize 부부의 Load는 삭제하고 LoadContent에 적용해줍니다.



그런데 기존의 프로젝트에서 약점이 하나 있었습니다. 분명 손이랑 얼굴은 있는데 만약 왼손이 오른손을 넘어가는 경우, 우리는 알 수 있었을까요? 만약 뼈대 역할을 하는 게 있었으면 서로 겹쳐졌다는걸 알 수 있겠지만 그런게 없는 한 모릅니다. 그래서 그걸 안내해주는 구문을 삽입해주고자 합니다.

 그런데 그 경우를 생각해보세요. 그 안에서 손이 서로 겹쳐졌을때 명백한 사실을 하나 찾을 수 있습니다. 바로 그 동작에서 왼손의 x좌표는 오른손의 x좌표보다 항상 크다는 겁니다. 그래서 그 조건을 맨 밑에 표현해주고 문자로 표현하게끔 해줍니다.


 

한번 결과를 보겠습니다.


이렇게 손이 교차했을 때는 문구가 뜨는 것을 확인할 수 있습니다.

 자 다른 조건문을 삽입해보겠습니다. 이번에는 다른 골격을 하나 만들고자 합니다. 골격은 총 20개가 있는데 그중에서 엉덩이 골격을 뽑을 수 있습니다. 그래서 손이 엉덩이 골격보다 높게 있으면 또 메세지를 출력하도록 하겠습니다. 그러면 또 엉덩이의 위치에 대한 변수 지정이 필요하겠지요?



그리고 Nui_SkeletonFrameReady 부분에서 엉덩이 골격에 대한 정의가 이뤄져야 됩니다. 물론 기존의 내용과 동일합니다.


이제 조건문을 작성할 차례인데 높이를 비교하니까 아무래도 y를 활용하는게 좋을 것 같습니다. 그래서 오른손의 y좌표보다 엉덩이 y좌표가 더 크면 이벤트가 발생하도록 말입니다. 



계속 보시면 아시겠지만 거의 코드 구조가 비슷합니다. 

조금더 수정해보겠습니다. 지금 이 코드는 단순히 허리 위만 감지할 수 있는 건데 허리 위에 있는 것 또한 표현할 수 있을 겁니다. 혹시 이런 수식은 다들 아시겠죠?

|X| < A

이런 식으로 표현하면 최종적으로 범위는

-A < X < A

가 될겁니다. 이걸 활용해보자는 겁니다.



이렇게 하면 허리 부분에 있을 때 해당 메세지가 뜰 겁니다. 

아까 삽입한 이미지 있지요? 그건 손이 머리 위에 올라갔을 때 나타나도록 해봅시다. 비슷하게 하면 됩니다.


결과를 보면 참 괜찮게 나옵니다.


 

보면 오른 손을 머리에 갖다 대었을 때 Good Idea 이미지가 뜹니다. 그것도 사람이 이동하면서 따라다니는 걸 확인할 수 있지요.

조금 뭔가 안 맞기는 한데 이런 로직을 잘 구현한다면 재미있는 게임도 구현할 수 있을겁니다. 역시 예고한대로 드롭박스에 프로젝트를 올려드리겠습니다.

https://dl.dropbox.com/u/96808368/Kinect/Lab%204A.zip


참고하셨으면 좋겠습니다.


--------------------------------------------------------------------------------------------------------------

참고로 왜 컨텐츠 호출을 왜 LoadContent에서 하냐. Initialize에서도 할 수 있지 않느냐에 대한 의문 때문에 여기저기 찾아봤는데 http://oddly.tistory.com/27 여기에 힌트가 있네요. 정확히 말하자면 Initialize가 LoadContent보다 먼저 일어나서 입니다.

댓글