티스토리 뷰
지난 포스트에서는 머리와 양손에 대한 좌표점을 통해서 이미지를 씌우고 움직이는 건 간단하게 해봤습니다. 물론 더 활용하면 그 골격을 제외한 나머지 부분에도 이미지를 입혀서 하나의 마리오네트를 형성할 수 있을겁니다.
그런데 이런 생각은 안해 보셨나요? 지금 손의 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보다 먼저 일어나서 입니다.
'Kinect' 카테고리의 다른 글
[Kinect 프로젝트] Soccer Goal (1) | 2012.08.19 |
---|---|
[Kinect 프로젝트] On your own: Water in Africa (3) | 2012.08.12 |
[Kinect 프로젝트] Responding to Movement (0) | 2012.08.12 |
[Kinect 프로젝트] Kinect Joints and Mimicking Movement (7) | 2012.08.07 |
[Kinect 프로젝트] Sensing a Body (2) | 2012.08.07 |
[Kinect book] Start Here! Learn the Kinect API (3) | 2012.07.17 |
[Kinect 원리] Kinect의 Depth Sensing (7) | 2012.07.10 |
- Total
- Today
- Yesterday
- 한빛미디어
- TensorFlow Lite
- SketchFlow
- PowerPoint
- Offline RL
- Distribution
- ai
- End-To-End
- DepthStream
- Kinect
- Gan
- processing
- Pipeline
- Windows Phone 7
- 강화학습
- ColorStream
- Off-policy
- 딥러닝
- dynamic programming
- RL
- Variance
- windows 8
- Expression Blend 4
- Policy Gradient
- reward
- arduino
- 파이썬
- bias
- Kinect SDK
- Kinect for windows
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |