티스토리 뷰

Kinect

[Kinect 프로젝트] On your own: Water in Africa

생각많은 소심남 2012. 8. 12. 22:57

계속해서 골격정보를 이용한 프로그램을 다루고 있습니다. 특히 지난 포스트에서 이야기한 내용을 써먹으면 화면상에서 자유롭게 이동할 수 있는 네비게이션을 할 수 있다는 것이 좋은거지요.

 여러분 혹시 이매진컵이라는 대회를 들어보셨나요? 이매진컵이란 MS에서 주최하는 세계 소프트웨어 공모전이며 세상의 난제를 해결하기 위한 솔루션들을 겨루는 대회입니다. 보통 난제라 하면 해결하기 힘든 문제들을 통칭하며 UN에서는 8가지 주제에 대한 난제를 제시하고 있습니다.

http://staging.ic12.fasttrackteam.com/Downloads/DownloadableDocuments/UN%20MDG%20PDF/United_Nations_MDGs.pdf

 이 중 가장 흔하게 다뤄지는 주제가 바로 기아 해소입니다. 아프리카같은 경우는 물이 부족해서 기아 현상이 발생한다는데 이번 포스트에서는 간단하게 키넥트를 이용해서 물부족을 해소하는 프로그램을 만들어보고자 합니다. 기존과 마찬가지로 이전 프로젝트를 계속 활용할 예정이고 역시 새로운 이미지를 다운로드받아서 컨텐츠 프로젝트에 추가시켜줍니다.


AfricaImage.zip


먼저 첨가시킨 이미지에 대한 변수를 선언하고 LoadContent부분에서 정의해줘야겠지요. 참고로 이번 프로젝트에서는 손을 제외한 기존의 Texture2D는 사용하지 않을 것이기 때문에 이를 수정해줍니다.



LoadContent 부분에서도 수정해줍니다.



이미지들을 보시면 아시겠지만 그림이 다음과 같이 있습니다.



우리가 생각하는 시나리오는 강에서 waterbucket으로 물을 긷어서 poverty 이미지나 village elephant에 갖다놓으면 bucket이 고정되는 겁니다. 그러면 손에는 waterbucket의 위치에 대한 정보가 있어야 할겁니다. 그걸 선언해줍시다.



우선은 Draw에서 배경으로 삽을 이미지를 정해주는게 좋겠지요.



당연하게 waterPic의 위치는 유동적이어야 하므로 앞에서 선언한 변수들을 위치로 받는 것이 필요할겁니다. 일단 실행시켜보면



위와 같은 이미지가 나옵니다. 손이야 기존에 사용한 코드를 그대로 활용하므로 자유롭게 움직일 것이고 wbx와 wby는 정의되지 않았기 때문에 저 위치에 있습니다. 이제 지난 포스트에서 언급한 것처럼 이 프로그램에 대한 로직을 구성해야 되겠지요.

일단 이때 필요한 건 충돌이벤트입니다. 손이 평소에는 자유롭게 움직이다가 waterPic을 선택하면 이벤트가 발생하게끔 말입니다. 보통은 하나의 사각형을 만든 후에 거기에 충돌했을 때 충돌이벤트가 발생하도록 합니다. 그런 와중에 사용하는 속성이 바로 Intersects 입니다. 그래서 사각형을 만들고 그 충돌 이벤트를 형성합니다. 당연히 나중에 이 사각형 안을 아까의 waterPic 이미지로 그리면 됩니다. 

자 그전에 손이 그 WaterPic을 집었는지 안 집었는지에 대한 확인이 필요합니다. 보통 게임프로그래밍에서는 bool 변수로 선언해서 집었으면 true, 안집었으면 false로 정의해주는데요. 그것에 대한 변수를 전역적으로 선언해줍니다. 



그리고 나서 Update로 넘어와서 이 bucketPickedUp 값이 변하게 하는 조건문을 구성합니다. 일단은 WaterPic 자체가 물쪽에 있고 사람이 그걸 건드렸을때 움직이게 해줘야 하겠지요.


그리고 집었을 때는 손의 위치와 wbx,wby값이 같아야 하겠지요.



그 후에 물을 긷고 나서의 조건문을 작성해줍니다. 이때는 bucketPickedUp의 값이 바뀌어야겠지요.


자 실행시켜보면 됩니다.... 가 아니네요.



겉보기에는 이상이 없어보이지만 지금 좌측 상단에 저렇게 waterPic이 위치하면 조건문에 따라서 움직이지 않습니다. 그렇죠. bucketPickedUp도 False일 뿐더러 wbx값이 100 이하이기에 intersects 이벤트가 발생해도 절대로 안 움직이지요. 물론 코드를 수정해도 좋겠지만 그것보다도 waterPic의 위치를 처음에 고정을 시켜주겠습니다. 



지금 고정된 값은 프로그램의 Width와 Height입니다. 따라서 그값을 통해 wbx와 wby을 선언해주면 될겁니다. 결과는 다음과 같습니다.



간단한 게임을 만들어봤습니다. 물론 더 수정할 여지도 있고 개선사항도 있겠지요. 이를 테면 왼손도 사용해서 왼손으로는 다시 가져오는 모션을 취해볼 수 있다던가 아니면 물에 가져다대면 waterPic안에 물이 차는 애니메이션을 보여줄 수 있다던가 말입니다. 그건 여러분의 상상력에 달려있습니다. 

 실상 이매진컵에 나오는 주제는 어떻게 보면 심각한 내용이지만 다르게 보면 정말로 간단한 주제입니다. 단순히 생활속에서 모두가 불편함을 느낄 일에 대해서 해답을 제시할 수 있고, 어쩌면 앞에서 언급한 세계의 난제를 해결하기 위한 솔루션을 보여줄 수 있습니다. 제가 나갔던 것처럼 이매진 컵에 키넥트를 활용한 분야도 있으까 관심있으신 분들이 많이 도전해보셨으면 좋겠습니다. 이번도 마찬가지로 프로젝트가 드롭박스를 통해서 공유됩니다.

https://dl.dropbox.com/u/96808368/Kinect/Lab-4C.zip





댓글