립모션 개발 기술 및 LEAM 프로젝트 공개 2부

웨드_ |

2부에서는 립 모션을 활용한 개발에 있어서 보다 기술적인 설명을 나누었다. 립 모션에서 기본적으로 제공하는 API는 손이나 손가락에 대한 구분이 없이 가공되지 않는 좌표값만을 (정말) 미친듯이 던져준다. 이를 어떤 알고리즘으로 가공하여 개발에 성공할 수 있었는지 자세히 답변해주었다.





4. 립 모션을 사용한 개발에서 기술적인 부분을 좀 자세히 설명해주세요.


 처음엔 단순히 X축으로 손가락을 정렬하여 왼쪽 끝부터 오른쪽 끝까지 손가락을 하나하나 구별하려고 했습니다. 하지만, 사람의 손가락 움직임에는 정말 많은 변수가 존재했습니다. 아직은 기계적 한계라고 생각되지만, 약지와 중지는 움직임이 조금만 커져도 립 모션(Leap Motion)이 손가락을 잃어버리고, 엄지가 움직일 경우 손바닥 전체가 로테이션을 하기 때문에 이 부분에서 많은 인식 오류가 있었습니다. 


 그리고 또, 오른손과 왼손이 위치를 바꿨을 때도 어느 쪽이 왼손이고, 오른손인지 인식하지 못했습니다. 그래서 저희는 엄지와 검지의 방향 벡터를 이용하여 해결해보았습니다. 보통의 사람은 생리적으로 엄지와 검지의 방향이 특정 다른 방향을 가르키게 되는데요. 이렇게 해서 왼손과 오른손을 구별한 후 Pitch, Yaw, Roll을 이용하여 기울기를 얻었습니다.





 각각의 손가락을 구분하는 것은 몇 가지 공식이 들어갔습니다. z축에서 가장 긴 중지를 기준으로 새끼와 엄지 손가락을 정렬 한 후, 손에 대하여 손가락들의 y축 각도를 정렬했습니다. 그리고 손가락 방향에 대하여 z와 xy의 ATAN2를 취하여 손가락의 y각도를 계산 한 다음, 손의 z방향에 ASIN을 구하면 손의 y각도가 나오게 되는데, 이것을 빼준 후 x축을 기준으로 약지와 검지를 정렬 시켜 주게 되면 각각의 손가락을 구별 할 수 있게 됩니다.


 공식을 말로 설명하려니, 쓰고 나서도 무슨 소리인지 모르겠네요^^;; 간단하게 정리하자면 삼각함수와 sort를 이용하여 구별을 했다고 말 할 수 있겠습니다. 그리고 포럼에서 얻은 아이디어인데, 엄지손가락을 기준으로 손가락과의 거리를 계산한다면 더 완벽하게 손가락을 구별 할 수 있는데, 시간상 이번 프로젝트에 추가하지는 못했습니다. ㅠㅠ 



영상2 : 손가락 인식




손가락을 구별하는 알고리즘에 대해 좀더 자세히 설명을 부탁해보았다.


 z축을 기준으로, 가장 긴 중지를 기준으로 왼쪽 끝과 오른쪽 끝을 새끼와 엄지로 구별한 후, (오른손일 경우 반대) atan2(z,x) - asin(z) 이렇게 되면 손가락의 y축 각도 들이 구해 지는데 값이 가장 큰 중지를 기준으로 4번째 5번째가 각각 새끼와 엄지입니다. (이 부분은 왼손과 오른손 동일) 마지막으로 x축을 기준으로 약지와 검지를 구별해주면 됩니다.


 위의 두 가지 경우를 같이 적용시키면 손의 로테이션이 변한 상태에서 손가락을 움직이게 되더라도 각각의 손가락을 구별 할 수 있게 되는 것이지요. 처음 x축 만으로 구별을 했을 땐 립 모션이 손가락을 잃어버렸을 경우 문제가 되었고, z축을 기준을 기준으로 중지를 구별하고 나서 sort를 했을 땐 손가락을 4개만을 사용 할 때 문제가 되었습니다. (LEAM 프로젝트에서는 많은 동작을 사용하기 위해 손가락 5개일때와 4개일때 동작이 다르게 해놨었습니다.)


영상3 : 손바닥 인식


 영상2와 영상3은 손가락 구분과, 손과 손가락 모두 구분 후 포럼사이트에 올렸던 동영상들 입니다. 다른 해외 개발자들도 영상을 보고 잘 되는 것(ㅋㅋ)같다고 말해 줬습니다.


영상4 : 캐릭터 컨트롤


 개발한 API를 이용하여 간단한 3D캐릭터를 만들어 움직임만 체크해 보았습니다. 뼈의 유기적인 움직임을 잘 구현했더라면 더 자연스러웠을 텐데, 그쪽 부분(키네틱)의 선행 연구를 참고하지 못한 것이 아쉽습니다. 아마도 경험상의 문제였겠죠.. 하지만 이번 프로젝트를 통하여 배운 부분이라고 생각하겠습니다.






5. 프로젝트 및 립모션에 대해 아쉬운 점이 있다면 써주세요.


 프로젝트가 비트컴퓨터 교육의 한 부분이다 보니, 그 제약 안에서 개발을 진행해야만 했던 점이 아쉬웠었습니다. 그리고 그래픽 디자인 부분에 대하여 저희는 교육을 받지 않았기 때문에 3D아바타의 허접함이 전체적인 비주얼을 떨어뜨렸습니다. ㅠㅠ 하지만, 전문 디자이너가 만든 캐릭터를 저희 프로그램 뼈 정보와 일치시키면 그대로 가져다 쓸 수는 있습니다!

 립 모션(Leap Motion)의 경우, 아직 부족한 하드웨어와 완벽하지 못한 SDK가 아쉬웠습니다. Kinect, Wii 컨트롤러와 더불어 립 모션(Leap Motion)을 통하여 더 많은 모션 컨트롤 컨텐츠들이 제작될 것이라고 생각합니다. 립 모션(Leap Motion)을 주축으로 모션 컨트롤러들이 계속해서 발전 할 수 있기를 바랍니다.






6. 립모션으로 한번 더 개발을 한다면, 무엇을 개발하고싶은지 써주세요.


영상5 : 비행기 시뮬레이션


 영상5는 립 모션(Leap Motion)에서 기본 제공하는 데모 프로그램인데, Unity3D를 이용하여 만든 것 입니다. 립 모션(Leap Motion)을 Unity3D와 연동하면, 개인이 만들어도 엄청난 그래픽 작업을 할 수 있습니다. 기능이 강력하기에 가격이 비쌉니다.ㅎㅎ 그래도 학생들은 등록 후 무료로 사용해 볼 수 있습니다.


 조금 더 시간이 있고 이를 빨리 알았다면, Unity3D를 포함하여 프로젝트를 진행했을 수도 있었을 것 같습니다. 내부 기술도 중요하지만, 프로젝트 발표에서는 겉으로 보여지는 비주얼적 측면이 굉장히 중요한데, 다른 사람들이 보았을 때 완성도가 더 높아 보였을 거라 생각합니다. 한번 더 프로젝트를 진행한다면 2~3명의 인원으로 Unity3D를 이용하여 AirSpace(립 모션의 앱스토어)에 등재 할만한 간단한 게임을 만들어 보고 싶습니다. ^^


 이상으로 립 모션(Leap Motion)을 사용한 개발 후기를 마치도록 하겠습니다. 김평화(Heiswed)님께 매우 감사하고, 짧은 개발 기간이었지만 즐거웠습니다.




서두에도 말했지만, 학부 학생들에게 좋은 경험의 기회를 주었다는 점이 참 기쁘다. 내가 학부 마지막 학년에 살았던(?) 연구실과 열정을 다했던 프로젝트들이 다시 기억나는 듯하다..


학생들이 소감에서 아쉽다고 말했듯이, 다음 프로젝트에서는 실제 사용자에게까지 전달될 수 있는 프로젝트를 권해본다. 목표는 더 높아야겠지만 프로젝트의 크기를 훨씬 줄여야할 것이고, 스스로 개발하는 부분보다 오픈소스나 기존 도구를 사용하는 양이 더 많아질지도 모르겠다.


또 단순히 완성도 있는 소프트웨어를 넘어, 비즈니스적인 관점에서 보면 그렇게 열심히 개발한 소프트웨어(제품)가 얼마나 많은 비즈니스적 요소들 중에 하나일뿐인지.. 세상엔 참 배울게 많아서 좋다 :)