티스토리 뷰

Kinect

[Kinect 프로젝트] Movement: Chemistry!

생각많은 소심남 2012. 9. 2. 01:13

계속해서 골격 정보를 이용해서 간단한 프로젝트를 진행해보고 있습니다. 이번에 진행 할 것은 키넥트를 활용한 화학 결합입니다. 


저도 고등학교 교육과정에서 화학을 배운거 빼고는 한번도 책을 들춰본 적이 없어서 기억이 잘 안 나기는 하지만 어쨌든 가장 기본적인 사실은 모든 물질은 원자의 형태를 띄고 있다는 겁니다. 그 중에서도 물이라는 분자는 수소원자 2개와 산소원자 1개로 구성되어 있다는 것은 누구나 다 아시는 사실이라고 생각합니다. 그래서 이번에 할 것은 만약 수소원자와 산소원자가 결합하면 물이 되는 과정을 키넥트를 이용해서 진행해보고자 합니다. 물론 마찬가지로 이전에 사용했던 프로젝트를 계속 활용할 예정이며 이미지는 다음 첨부파일들을 추가시키면 됩니다. 


moleclue.zip


맨날 같은 이야기만 하는 것이겠지요. Content 프로젝트에 위의 이미지를 추가합니다. 물론 이전의 이미지는 손 이미지를 제외하고는 사용하지 않을 것이니까 다 지워주세요. 참고로 왼손도 사용할거니까 이전 프로젝트 첨부 파일을 찾아서 추가해주세요. 그렇게 되면 총 프로젝트에 포함되는 이미지는 5개가 되겠네요.



이에 해당하는 Texture2D 변수를 맨 앞단에 선언해줍니다. 



물론 이작업이 되면 LoadContent()에서 이미지들을 넣어주는 작업이 이뤄져야 합니다.



이제 무엇이 필요한가 보니까 손의 위치와 각 원자의 위치가 초기화되어야 할 것 같습니다. 뭐 어디에 두든 상관은 없지만 다음과 같이 정의해보도록 합니다. 



자 이전에 한 것중에 손이 바켓에 닿으면 손의 이미지가 바켓의 이미지로 바뀌는 것을 구현했었습니다. 그때가 아마 물을 전달하는 프로젝트였는데 이번에도 그걸 비슷하게 적용해보려고 합니다. 그래서 손이 만약 수소 이미지에 닿으면 손의 모양이 수소로 바뀌게 되고 그걸 산소 이미지에 넣게 되면 물이 딱 되게 하는 겁니다. 그러면 일단 닿는다는 이벤트를 위해서는 계속 소개했던 충돌이벤트를 생성해야 되겠지요. 

 그보다도 일단 골격 인식 이벤트내에서 오른손과 왼손의 좌표가 입력되게끔 수정해야 됩니다. 저전 프로젝트에서는 양손을 썼기 때문에 상관없는데 바로 이전프로젝트에서는 오른손만 사용했었지요. 그래서 그 부분을 다음과 같이 수정해줍니다.



앞에서 언급한대로 충돌이벤트를 만들어야 합니다. 그전에 충돌 개체에 대한 사각형을 만들어주는 것이 좋겠지요. 이부분은 Update에서 이뤄집니다.



참 충돌이 되었는지 안 되었는지를 확인하기 위해서 그에 대한 변수를 bool형으로 선언하는 것은 지난 포스트에서 다뤘습니다. 이번에 충돌이 되었는지를 확인해야 될 요소는 3가지입니다. 손이 수소원자1에 닿았는지, 손이 수소원자2에 닿았는지, 그리고 마지막으로 수소원자1과 2가 산소원자와 닿았는지 말입니다. 그래서 아까 변수 선언하던 부분에서 다음과 같이 선언해줍니다.



이제 충돌했을 때 해당 변수를 딱딱 true로 바꿔주면 되겠습니다.



자 이제 해당 변수가 true였을때 위치를 손 위치로 해주면 됩니다. 그런데 사실 오른쪽에 있는 수소는 오른손이 잡기 쉽고 왼쪽에 있는건 왼손으로 잡기가 쉽겠지요. 그래서 그에 대한 조건문을 선언해줍니다.



그런데 사실 이렇게 짜면 안됩니다. 예외의 경우도 생각해줘야 합니다. 만약 오른손으로 왼쪽 수소를 잡을 수도 있는건데 위와 같이 짜면 아무 동작도 안일어납니다. 물론 그를 위해서는 다른 예외구문을 넣어줘야겠지요. 저같은 경우에는 bool변수를 더 줘서 오른손이 왼쪽 수소를 건드렸을때 왼손이 오른쪽 수소를 건드렸을 때의 변수를 더 지정하는 걸 생각해보았습니다. 물론 그부분은 해보시는 분들이 수정해볼 사항입니다. 

 자 일단 손의 위치가 닿았을때 수소가 손을 따라다니게 했습니다. 이제는 물로 변하는 과정을 표현해봐야겠지요.

그럴려면 어떻게 하는 좋을까요? 생각해볼 조건은 h1Grab도 참이고 h2Grab도 참이면서 h1이 o1과 충돌을 일으키고 h2도 역시 o1과 충돌을 일으키면 되지 않을까 합니다. 그걸 구현하면 다음과 같습니다.



자 이제 구성해야 될 것은 Draw()부분인데  두가지 조건으로 나눠집니다. 첫번째는 makewater가 true일때, 그리고 false일때를 나눠지겠지요. 그래서 makewater가 참이 되면 다음과 같이 표현됩니다.



거짓일때도 위와 같이 표현하면 되겠지요. 스크린샷과 동작영상은 다음과 같습니다.


<반응 전>


<반응 후>



어떤가요? 이런식으로 효율적인 교육자료도 만들어볼 수 있습니다. 여기까지가 관절정보를 이용한 프로젝트들이었고 아마 다음 프로젝트 부터는 조금더 다른 정보로 여러분들께 알려드리고자 합니다. 


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

댓글