HMD, Kinect 그리고 직접 제작한 방향 컨트롤러를 통하여 익스트림 스포츠 중 하나인 바이크를 실감나게 체험할 수 있는 게임을 제작하여 몰입감 있는 VR 콘텐츠를 제작하는 것을 목표로 시야부터 손동작, 발동작까지 모두 활용하는 몰입감있는 게임을 만드는 것이 목적이었다.
오큘러스는 기본적으로 연결만 되면 유니티에서 지원해주므로 시야각을 조절하여 몰입감을 높이는 작업을 하였고
Kinect를 통하여 발동작을 검출하였다.
처음으로 시도한 것은 Unity Engine Asset Store에서 무료로 공개되어 있는 Kinect Framework를 이용하여 발 Joint Vector를 검출해 높이를 측정, 발 구르는 동작을 감지하려 했으나 앉은 상태에서 상체를 감지하는 것은 간단히 성공한 반면 정작 다리는 제대로 감지하지 못했다. 따라서 Depth map을 직접 사용해 Labelling, Haar cascade를 적용하려 했지만, 이 둘은 너무 연산량이 많아 게임의 진행이 심각하게 방해되었고, Haar cascade는 본 프로젝트와 같은 케이스처럼 측면에서 다리위치만을 검출하는 학습법을 찾지 못해 제대로 다리영역을 검출하기 어려웠다. 게임이라는 특성 상 사용성을 저해하는 과도한 연산은 사용하기 힘들었기에, 최적화를 위해 발 위치에 해당하는 영역의 평균 depth를 이용했다. 이 때, 가로 영역의 최소 depth를 구하는 방식을 처음 시도해봤으나 주위의 사물 depth가 위치에 맞지 않게 0으로 측정되는 경우가 잦아, 뎁스맵을 직접 가져와 다리부분의 평균값을 계산하여. 다리 움직임을 검출하였다.
또한 라즈베리파이와 회전인코더 그리고 직접만든 자전거 모델을 통하여 핸들부를 구현하였다.
상용화된 컨트롤러는 주로 자동차의 핸들이나 페달을 본떠 만든 것이 주를 이룬다. 허나 본 프로젝트에서 요구되는 실감나는 주행을 위해 바이크의 핸들을 본뜬 전용 핸들이 필요해, 3D 프린팅을 하게 되었다. 너무 큰 크기의 모델은 출력하지 못하는 3d 프린터의 특성에 맞게 조립 가능한 각기 다른 봉 모양의 모델을 각각 출력하여 조립했다. 이에 사용된 모델은 팀 내부에서 자체적으로 제작해 무료로 프린트 가능한 곳에서 대여해 출력했다.
다음으로는 Rotary Encoder(KY-040)을 구매하여 데이터 시트를 이용해 라즈베리파이에 연동하였다. Python으로 제작된 GPIO TCP 서버 프로그램을 이용하여 게임이 켜지면 자동적으로 접속되 이후 회전 인코더에서 입력된 방향 값을 클라이언트에게 뿌려주도록 하였다.
하지만 처음 부딪힌 난관은 주기적으로 Polling하여 값을 가져오는 Polling 방식 I/O를 사용해 CPU 사용량에 크게 영향을 받아서인지 CPU 사용량이 많아지면 데이터가 변질되는 것과, 열악한 네트워크 상황상 데이터가 정상적인 프레임에 전송되지 않는 문제가 있었다.
CPU 사용량 문제를 해결하기 위해 Unity Frame 간 시간을 적절히 이용해 전송 간격을 조절했으며, TCP 대신 UDP를 사용했다. 네트워크는 결과적으로 완전히 해결할 순 없었지만, 여러 번의 테스트를 통해 공유기의 문제였음이 검증되었다.
'프로그래밍 기록 > 교내 프로젝트' 카테고리의 다른 글
CUDA 코어를 활용한 JEM 디블로킹 필터 병렬화 (0) | 2018.09.14 |
---|---|
스마트폰을 활용한 VR 게임 컨트롤러 (0) | 2018.09.14 |
Chai 3D 활용한 프로그램 제작 (0) | 2018.09.06 |
OGRE 3D 를 통한 미니게임 (0) | 2018.09.06 |