hwankee@pulppixel:~/portfolio
3d-world
cat ~/portfolio/projects/spody.md
back (esc)
PROJECT

SPODY

SOLO

깊이 센서와 OpenCV 기반의 XR 유아 교육 플랫폼. 유일한 개발자로 시작해 양산 체계를 구축하고 매달 2~3개 콘텐츠를 납품했습니다. 유치원과 공공기관 다수에 공급하고 인도네시아에 수출했습니다.

2020.01 - 2021.06
역할: 설계부터 구현, 납품까지 (초기 1인, 최종 5인) : 초기 1인, 최종 5인 미니게임 하러 가기
# 배경

빔프로젝터로 바닥에 콘텐츠를 투사하고, 깊이 센서로 아이들의 발과 손 터치를 인식하는 시스템입니다. 첫 직장이었고, 입사해 보니 회사의 개발자는 저뿐이었습니다. 물려받은 것은 외주로 만들어진 Kinect 코드와 간단한 게임 3종이 전부였습니다. 그 외주 개발자가 이 분야 전문가여서, 이메일로 기술 자문을 주고받으며 코드를 인수하고 기능을 확장해 나갔습니다.

그렇게 1인 개발로 시작한 프로젝트를 총 432개 스크립트(약 6만 줄) 규모까지 키웠고, 양산 체계를 구축한 뒤에는 매달 2~3개씩 총 25개 이상의 교육 모듈을 납품했습니다.

SPODY 현장 - 벽면에 투사된 콘텐츠와 상호작용하는 사용자들
# 센서 파이프라인

프로젝트의 핵심인 KinectTouchManager는 깊이 센서의 입력을 Unity UI 터치로 변환하는 파이프라인입니다. 참고할 레퍼런스가 거의 없는 조합이라 직접 실험하며 길을 찾아야 했습니다. 특히 깊이 데이터의 노이즈를 실사용 수준으로 잡는 것과, 센서→컬러→스크린으로 이어지는 좌표계 변환 체인을 정확히 맞추는 데 시행착오를 많이 겪었습니다.

  • -Kinect V2 DepthFrameReader로 매 프레임 깊이 데이터를 읽음
  • -Body Tracking으로 양손 좌표를 추출하고, CoordinateMapper로 깊이->컬러 좌표 변환
  • -OpenCV PerspectiveTransform으로 센서 좌표 -> 스크린 좌표로 최종 매핑
  • -EventSystem.RaycastAll로 Unity UI 이벤트를 시뮬레이션
  • -커스텀 인터페이스 IKinectTouchClick으로 터치 이벤트 전달
# 캘리브레이션 - 비개발자용 자동 세팅

설치 현장에는 개발자가 없습니다. 유치원과 기관마다 천장 높이와 투사 환경이 제각각이고, 기기를 재부팅하거나 옮길 때마다 보정이 다시 필요했습니다. 그래서 세팅을 개발자 없이 끝낼 수 있게 만들었습니다.

  • -자동 캘리브레이션 - OpenCV FindChessboardCorners로 체스보드 패턴을 자동 인식, 4점 좌표를 PerspectiveTransform으로 매핑
  • -수동 캘리브레이션 - 폴백용. 화면 4개 꼭짓점을 직접 터치해서 보정
  • -캘리브레이션 결과를 ModelManager에 영속 저장, 재시작 시 자동 로드
SPODY 콘텐츠 - 다트 게임. 캐릭터가 다트판을 향해 던지는 교육 콘텐츠
# 양산 체계

매달 2~3개 모듈을 납품하는 주기를 혼자 버티려면 콘텐츠 하나하나를 새로 설계할 수 없었고, 개발자 충원도 예정되어 있어 온보딩 비용을 미리 줄여야 했습니다. 그래서 콘텐츠 제작을 구조로 정리했습니다.

  • -각 콘텐츠 모듈이 자기 네임스페이스로 격리 - 모듈 간 충돌 방지
  • -Manager / Controller / Data 폴더 구조를 공유 - 새 콘텐츠 시작 시 템플릿 복사
  • -이 구조 덕분에 이후 합류한 개발자들이 빠르게 콘텐츠 제작에 투입 가능 (최종 5인)
# 성과
  • -누리 교육 과정 콘텐츠를 성남, 수원 유치원 다수에 납품
  • -광주 광산구청, 광명 하안도서관 등 공공기관 납품
  • -인도네시아 수출 버전 출시
  • -영업에 동행해 유아와 교사가 실제로 사용하는 모습을 관찰하고, 그 피드백을 개발에 반영
SPODY - VR 광산구청 시연식