티스토리 뷰

Kinect

[Kinect with Unity3D] Kinect - Unity3D Plugin

생각많은 소심남 2012. 11. 13. 17:00

한분이 제 방명록에 Unity3D에서 쓸 수 있는 키넥트 플러그인에 대해서 문의를 하셨습니다. 하지만 제가 전에 소개해드린 Gadget Accelerator Kit (GAK)은 라이선스에 대한 제약이 걸려있어서 제가 임의로 드릴 수가 없습니다.그래서 대신 다른 플러그인에 대해서 잠깐 소개해드리고자 합니다.

사실 구글에서 찾아보시면 아시겠지만 매우 다양한 플러그인이 나와있습니다. 그중 가장 보편적으로 쓰이고 기능이 제일 많이 제공되는 것이 바로 ZigFu라는 겁니다.


<http://zigfu.com/>


대신 안 좋은 점이 있다면 기본의 Kinect SDK 기반이 아닌 OpenNI 기반의 플러그인이기에 이와 관련된 Dependency를 다시 설치해줘야 합니다. 물론 개발은 ZDK를 이용해서 진행되는데 기본적으로 Skeleton과 Color Depth에 대한 정보를 넘겨주기 때문에 쉽게 키넥트 기반 Unity3D 게임을 만들 수 있습니다.

 하지만 역시 OpenNI라는 것 때문에 접근하기 힘든 점이 있고, 이 외에 Kinect SDK위에서 돌아가는 플러그인도 있습니다. 두개가 있는데 그 중에 이번 포스트에서 언급드리는 내용은 카네기멜런대 연구실에서 만든 플러그인입니다.


<http://wiki.etc.cmu.edu/unity3d/index.php/Microsoft_Kinect_-_Microsoft_SDK#Example_Code_and_Drivers>



완벽하지는 않습니다만 기본적으로 사람의 골격 정보를 넘겨주기 때문에 이를 활용해서 캐릭터의 움직임을 표현할 수 있습니다. 


 다만 몇가지 수정해야 될 부분이 있습니다. 이 플러그인이 만들어질 당시의 SDK가 Beta 버전이기 때문에 지금의 SDK로는 구동이 되지 않습니다. 그래서 사실 홈페이지 상에서는 이 플러그인을 사용하기 위해서는 기존의 SDK를 지우고 Beta 버전을 설치하라고 되어 있습니다. 하지만 그렇게 하기엔 조금 손해보는게 많아보입니다. 


 자 우선 이 플러그인을 import 해보면 몇가지 script가 딸려오는데 그중 먼저 수정해줘야 할 것은 kinectInterop.cs 입니다. 이 코드는 C로 구현되어 있는 키넥트 관련 함수를 이 unity3D에서 쓸 수 있게끔 일종의 Wrapper 역할을 수행합니다. 우선 맨 밑에 보시면 dll 파일을 import 해오는 과정이 있는데 베타때의 dll 파일 위치와 현재 버전에서의 dll 파일 위치가 바뀌었습니다. 다음과 같이 수정해줍니다.



나머지 import 과정에서의 path도 똑같이 수정해줍니다. 그리고 한가지 더 추가해야 될 메서드가 하나더 있습니다. 그래서 최종적으로 import 관련 코드는 다음과 같이 구성됩니다.



맨 마지막에 있는게 새로 추가된 메서드입니다. 추가 된 건 kinect의 연결 상태를 확인하는 콜백 메서드인데 키넥트가 최종적으로 종료될 때에는 사실 NuiShutdown()이라는 함수를 써서 프로세스를 종료합니다. 그런데 Unity3D의 특성상 프로그램내에서 실행시키게 되면 NuiShutdown()까지 호출되지 않기 때문에 게임이 종료되더라도 프로세스가 남아있게 됩니다. 이 상태에서 다시 실행시켜도 동작을 하지않는 원인이지요. 그래서 위 메서드를 정의하고 아래와 같이 빈 메서드를 놔둬서 키넥트의 상태를 감지하는 과정을 거치게 됩니다.


자 메서드를 정의했으니까 어디선가 써먹어야 겠지요. 이제 수정해줘야 할 script는 Kinectsensor.cs 입니다. 중간에 void Awake()가 있는데 맨 밑에 다음과 같이 만든 메서드를 삽입해줍니다.



이렇게 하면 끝나게 됩니다. 한번 실행시켜봅시다. 



안타깝게도 이 플러그인이 공개용으로 만들어진 바, 기타 Depth나 Color에 대한 지원이 되지 않는다고 합니다. 아무튼 골격 정보를 이용해서 무언가를 하고 싶으신 분한테는 좋은 자료가 될거라고 생각합니다. 참고로 수정한 Package는 공유하도록 하겠습니다. 


unitykinect-Modified.unitypackage


댓글