참참참 with Oculus Rift + Leap Motion
개요
오큘러스 리프트로 구현한 참참참이다. 게임은 3개의 sequence로 구성된다. 참참참 룰에 대한 자세한 설명은 생략한다
- 가위바위보 : 가위=Left / 보=Up / 바위=Right 를 눌러서 입력할 수 있다. (우리는 가위바위보지만 영어로는 Rock-Paper-Scissor)
- 공격 : 가위바위보에서 이기면 공격을 한다. 방향키를 누르거나 립모션이 있으면 손가락을 잘 흔들면 된다
- 방어 : 가쥐바위보에서 지면 방어한다. 방향키를 누르거나 오큘러스 리프트를 뒤집어 쓰고 잘 움직이면 된다. 단, 원점은 최초에 오큘러스를 뒤집어 쓰고있을때의 머리 위치다
빌드/실행 방법
-
boost 1.53.0
을cli/boost
에 적절히 압축을 출어서 집어넣는다.cli/boost/boost/config.hpp
가 존재하면 제대로 넣은거다. LeapMotion SDK를 알아서 받아서
cli/ext/leap
에 집어넣는다.cli/ext/leap/include/Leap.h
가 존재하고cli/ext/leap/lib/Leap.lib
가 존재하면 제대로 넣은거다.-
기본적인 빌드 스크립트를 돌리자
cd cli/script python res_build.py cd .. cmake CMakeList.txt
실행후 콘솔에서 w를 치면 창모드, f를 쓰면 전체화면을 실행된다. 딴거치면 알아서 대충 기존 설정으로 실행된다.
일반 렌더링/오큘러스 리프트 렌더링을 바꾸는 단축키는 F2이다.
Troubleshooting
- 컴파일을 하고 실행을 했는데 아무것도 안뜬다
- Leap Motion SDK의 버그로 추정되지만 소스가 없어서 세부파악은 실패했습니다. 임시 땜빵으로 LeapMotion 지원을 끄고 컴파일하면 됩니다.
cli/src/stdafx.h
의 6번째줄//#undef USE_LEAP_MOTION
의 주석을 해제하면 됩니다
- Leap Motion SDK의 버그로 추정되지만 소스가 없어서 세부파악은 실패했습니다. 임시 땜빵으로 LeapMotion 지원을 끄고 컴파일하면 됩니다.
- 이거 이외의 버그
- 나도 몰라. 버그 고치고 Pull Request 좀....
Post-mortem
Team
팀원의 실명/이메일/트위터를 왭에 까기는 미묘해서 상수로 썼다. 팀원은 총 3명이다
- PD : Project Destoryer. 프로젝트의 PM같은 기분의 일을 함. 오큘러스 물주.
- twitter : @if1live 사실상 유일한 연락처
- BM : Builder Machine. 인간 빌드버신. 빌드관련 내용(주로 cmake)을 주로 작업했다. 애니메이션 관련 삽질도 덤으로
- TO : Teamone. 립모션 물주
팀원 아닌 인원 1명이 도움을 줫다
- CV : 성우. 이펙트 사운드용 목소리
Project History
2013년 6월 11일
github 기록상 최초의 커밋이 등장한다. 이후 8월 11일까지 짬짬히 다음을 삽질했다
- git submodule
- 사용할 라이브러리에 cmake적용. git module로 갖다 쓸수있도록 만들기
- irrlicht engine 갖고놓기
2013년 8월 11일
집에서 뒹굴다가 충동적으로 vrjam신청. 팀원 2명은 게임잼 참가중일떄 PM이 몰래 질러버림ㅋ
2013년 8월 15일 목요일 - 광복절
처음으로 제대로 모여서 기획회의를 진행했다. 기존에 진행하는 기획으로는 VRJam 기간내에 구현하는것이 불가능하기에 기획을 바꾸기로 했다.(이 시점에 기존 기획으로 게임관련 구현을 한게 없어서 별 문제없었다) 참가가 기획의 요구사항은 다음과 같다.
- 2주일이내에 만들수 있을법한 규모
- 오큘러스를 사용할것
- 괴작을 만들수 있을법한 아이디어
게임 아이디어를 생각하기전에 괜찮은 오큘러스 데모, 기타 게임을 구경했다.
참고자료를 같이 보고 잡담하다가 뜬금없이 TO가 굴러다니는 립모션하고 합쳐서 참참참을 만들면 재밌다. 라고 해서 다들 ㅋㅋㅋㅋ하다가 뜬금없이 결정됨. 기획을 확정하고 뒹굴뒹굴하다가 해산했다
이날 밤에 작업한 내용은
- BM : 캐릭터 애니메이션 본 관련 삽질
2013년 8월 16일 금요일
PD가 휴가를 질렀다. 게임 기본 코딩을 이날 끝냈다. 현재 구현 상태는
- 오큘러스 리프트 렌더링 지원
- 키보드 입력으로 참참참 플레이
밤에는 TO가 립모션 테스트 코드를 작성했다
2013년 8월 17일 토요일
BM 집에 모였다. 오늘 구현한 내용
- BM : 키넥트로 모션캡쳐 테스트
- PD : 사운드 이펙트 추가를 위한 코드 리펙토링
- TO : 립모션의 인식 정확도를 높이기 위해서 코드 수정
- 립모션 작동 확인
- 오큘러스+립모션으로 게임하는거 생각보다 할만하겟던데요? 테스트 완료
2013년 8월 18일 일요일
CV의 지원을 받아서 게임에 사용할 효과음을 녹음했다. PD이 집에서 게임하는 동안 BM이랑 TO가 모여서 작업을 했다
- 키넥트 모션 캡쳐를 제대로 하기 위해서 넓은 집으로 쳐들어감
- 립모션으로 손모양을 잘 인식 못하는 문제 수정
2013년 8월 19일 월요일
효과음을 게임에 집어넣었다. 게임코드는 이날로 거의 완성됐다. alut + mac에서 초기화 버그 발견
2013년 8월 20일 화요일
키넥트로 활용한 모션캡쳐 데이터를 캐릭터 애니메이션에 합쳐서 X format로 export하는데 실패했다. 이것과 관련된 삽질은 며칠전부터 해왔지만 이날 완전히 포기함. 그리고 정신이 무너지고 프로젝트가 무너지고....
2013년 8월 21일 수요일
외부 발표 자료 준비 시작
2013년 8월 22일 목요일
외부 발표 자료 준비 시작
2013년 8월 23일 금요일
외부 발표. 이후 N일동안 포스트모템/게임 플레이 데모 영상/릴리즈 준비를 위한 리소스 정리 등을 작업함
개발 관련 Post-mortem
좋았던점
코드와 리소스를 다른 저장소로 관리했다. 코드는 github로 관리하고 리소스는 구글 드라이브를 이용했다. 코드 저장소가 미친듯이 커지는 문제를 막을 수 있었다.(프로젝트 도입 초기에는 이게 없어서 50MB짜리 wav파일이 github에 올라가 있었다)
res_build.py라는 안드로이드의 R.java와 비슷한것을 C/C++용으로 만들어서 사용했다.
리소스 폴더에 존재하는 리소스 파일-상수의 테이블이 있는 헤더파일을 만드는 스크립트이다.
게임 안에서 "res/texture/some.png"
를 사용하는 대신 res::texture::SOME_PNG
라고 사용할수 있는게 편했다.
슬라이드 걸즈 리소스를 사용했다(모델/배경음악) skybox 이미지도 적절히 구해서 사용했다. 이거라도 없었으면 게임이 진짜 없어보였을거다.
오큘러스 리프트와 립모션을 동시에 사용한 데모를 만들었다. 이런 미친짓을 저지른 데모가 몇개나 있을까? 플레이해본 소감은 좋은 시도였으나 제대로된 인식이 어렵다. 오큘러스 뒤집어쓰면 립모션 위치가 안보인다
맨날 쳐노느라 바쁜 직장인 3명이 모여서 제한된 시간안에 뭔가를 만들었다(!)
cmake를 사용했다. irrlicht engine의 경우는 그런거 솔루션 파일을 8벌이나 만든다(!) vs7/8/9/10/11 + dev-c++ + codeblock + makefile. -_-...... irrlicht engine같은 미친꼴은 볼지 않았다
quake console같은걸 만들어서 달았다. irrlicht console 개발단계에서는 있으니까 여러모로 유용하더라.
F2을 누르면 오큘러스모드/일반모드로 렌더링을 바꿀수 있도록 했다. 개발할때 유용하더라
사운드 라이브러리를 자작하다가 귀찮아서 cocos2d-x안에 있는 CocosDehension을 뜯어다 사용했다. openal도 지원하는데 원래 만들면 사운드 라이브러리가 alut기반이라서 몇줄만 고치니까 잘 돌아가더라
일리히트라는 게임엔진을 사용한거. 추가 라이브러리 없이 그냥 대충 돌아간다.
일리히트는 크로스 플랫폼 엔진이다. 덕분에 vs빠돌이인 PD와 맥유저인 BM이 같이 작업할수 있엇다.
나빴던점
irrlicht engine이 애니메이션으로 X 포멧을 지원한다길래 추가적인 테스트 없이 그냥 진행했다. 나중에 멀쩡한 X포맷용 익스포터가 없다는 것을 알고 절망했다. 게다가 irrlicht engine의 X format Reader도 그렇게 멀쩡하지는 않더라.
오큘러스 관련 기능을 대충, 혹은 안 만들었다. 영점 초기화라든가, 참참참 인식하는 방법이라든가....
좋앗던점 + 나빴던점
git submodule을 도배했다. 모듈을 고칠 때는 보통 그 모듈 자체에 에러가 있는 경우여서 재사용을 생각해보면 모듈로 쪼개 놓은 것이 좋았던 듯 함. 나쁘다고 느낌건 라이브러리를 고치지 않고 사용만 할라고 했더니 결국은 라이브러리를 고쳐야되더라. 근데 모듈로 쪼개놓으면 귀찮...
c++11을 적극적으로 사용했다. 개발 환경이 windows/mac이어서 clang과 vs12를 썻다. 근데 두개의 C++11 지원범위가 달라서 좀 귀찮았다. 하지만 역시 C++11이 안쓰는것보다 있는편이 편하다
아쉬운점
2013/06/11부터 이어지는 기간동안에는 기술삽질만 했다. 게임과 직접 관련된 실제 결과물이 없다(하지만 나중에 기획을 엎엇지!)
2013/08/15 ~ 2013/08/18 외에는 전부 원격으로 작업했다. 그래서 소통에 어려움을 느꼈다.
오큘러스 데모는 시연하기 어렵다. 시연자 모니터+프로젝터+요큘러스 전부 보여야하는데 노트북으로 이런 사치스러운게 될리가.... 나중에 추가 구현을 한다면 네트워크를 집어넣어서 시연용/발표용 컴퓨터 각각에 똑같은 화면이 보이도록 하는건 어떨까?
진행이 붕 떠있었다. 언제까지 뭘 할지, 우리가 뭘 만들지에 대한 자세한 계획이 없었다. 프로젝트 계획은 6월인데 맨날 채팅으로만 모여서 떠들다가 진짜로 얼굴본게 8/15인거에서 말 다했지.. 그래서 그런지 TO가 작업한 분량이 적다. 좀더 체계적으로 굴렸으면....
프로젝트 마무리가 부실하다. x포맷 앞에서 절망하고 GG를 쳐서 더이상 할 의욕이 안나더라. 이게 다 X 포맷때문입니다. 까려면 마소를 깝시다.
디버깅 관련 도구는 공들여 만들었는데 막상 쓴거는 텍스트 출력밖에 없다
발표 관련 Post-mortem
좋았던점
그런거 없다
나빴던점
- 준비가 개판
- 시간부족
- 발표자료에는 드립으로 가득. 근데 내용은 없ㅋ엉ㅋ(오죽하면 참참참 이라는 단어조차....)
NEXT?
irrlicht engine을 개조없이 그냥 갖다쓰는건 무리라는걸 확인했다. 위에서 느낀 문제점을 해결하는 방향으로 엔진을 만들기로 했다
- 기본 설계는 irrlicht engine을 따간다. 즉, 라이브러리형 엔진
- 지원 플랫폼은 DX11/GL/GLES 2.0
- OIS(object-oriented input system)을 사용. irrlicht engine의 입력시스템은 게임패드 진동을 지원하지 않는다(하지만 실제 게이에서 게임패드를 안써서 포스트모템에서는 생략)
- 기반은 oculus sdk 기반을 뜯어서 사용
- 인터페이스와 구현체 클래스를 분리해놓은거 합치기(DLL도 안쓰면 의미가 없으니까)
- FBX 지원
- 게임 모델 포맷/익스포터 직접 만들기
- 모델과 애니메이션 분리한다. 본박힌 모델 + 본 애니메이션
- irrlicht engine에 도배된 ifdef제거
- lint강화
- 유닛테스트 강화
- travis ci 적용