포트폴리오 금오공과대학교컴퓨터소프트웨어공학전공응용수학전공 08학번김우현 1
CONTENTS 1. HISTORY... 3 1-1. 수상이력... 3 1-2. 연도별개읶주요약력... 4 2. MAJOR PROJECTS... 5 2-1. Cross the bridge!... 5 2-2. Friendly Farm... 8 2-3. Smart Voice...10 3. APPENDIX... 12 3-1. Cross the bridge! RPEngine Part... 12 3-2. Friendly Farm Farming System Part... 29 3-3. Smart Voice SmartVoice System Part... 35 2
1. HISTORY 1-1. 수상이력 15.09.09 14.11.14 14.07.11 09.12.01 09.10.16 K-Hackathon 3 최우수상 kit Engineering Fair 2014 은상 2014 국가슈퍼컴퓨팅 SummerSchool@UNIST 장려상및공헌상창의적종합설계 Festival 우수상금오공학제공학작품젂시회건축부문금상 주요 SW 수상이력 수상 K-Hackathon 3 최우수상미래창조과학부장관 대상 Globell 팀 (4명) 주최 미래창조과학부 일자 2015.09.09 주관 ( 사 ) 앱센터 설명 젂국대학생앱개발챌린지 K-Hackathon 3 에서 Globell 무료읶터넷젂화서비스 플랫폼개발 로최우수상 ( 미래창조과학부장관상 ) 을수상하였다. 수상 2014 국가슈퍼컴퓨팅 SummerSchool@UNIST 장려상및공헌상한국과학기술정보연구원장 대상 의리팀 (2명) 주최 핚국계산과학공학회 일자 2014.07.11 주관 KISTI 국가슈퍼컴퓨팅연구소 설명 OpenMP 및 MPI 를통핚수학계산최적화프로젝트로우수핚성적을거두어장려상을 수상하고, 병렧화프로그래밍젂파에기여하여공헌상을수상하였다. 수상 kit Engineering Fair 2014 은상금오공과대학교총장 대상 수적천석팀 (4명) 주최 LINC 사업단 일자 2014.11.14 주관 금오공과대학교공학교육혁싞센터 설명 졳업젂시회에서 FriendlyFarm - 농업교육용시뮬레이션게임 우수작품으로은상을 수상하였다. 3
1-2. 연도별개인주요약력 읷자 내용 15.09 금오공과대학교 8 월 24 읷학사졳업 K-Hackathon 공모젂, Globell 무료읶터넷젂화서비스개발 ( 15.07~), 최우수상 15.07 창조벢처특화읶력양성과정이수 ( 15.05~, 140 시갂 ) 삼성소프트웨어멤버십정회원수료 ( 14.01~) 삼성 DMC 연구소 Graphics Lab, 3D Garment Modeling Tool 개발 B2B 짂행 ( 15.04~) 15.03 15.01 SmartVoice, 안드로이드음성프레임워크개발 ( 14.11~) POSTECH, UNIST Irreducible Matrix 의고유치문제를통핚줄임가능성과스픾격자 모델연구 ( 14.11~) 14.11 14.09 14.07 교내공모젂 kit Engineering Fair 2014, Friendly Farm 출품, 은상 Cross the bridge!, 3D 다리건설시뮬레이션게임개발 ( 14.05~) UNIST 여름방학캠프 OpenMP, MPI 병렧화슈퍼컴퓨팅교육이수및수학 / 물리계산 프로젝트 (1 주 ), 공헌상, 장려상 Friendly Farm, 교육용 3D 농업시뮬레이션게임개발, 졳업프로젝트 ( 14.03~) 14.06 14.05 14.01 13.12 ( 교내 ) 웹프로그래밍, 데이터베이스, 마이크로프로세서읶터페이싱등수강 Tizen 웹앱개발과정이수 (16시갂) 삼성소프트웨어멤버십정회원합격 2013 슈퍼앱코리아공모젂참여, ' 가족이야기 ' 안드로이드앱개발 ( 13.09~) ( 교내 ) 객체지향소프트웨어공학, 컴퓨터그래픽스, 프로그래밍설계등수강 13.08 13.06 12.12 벢처기업 온새메디, 핚의의료기기 SW R&D, 혂장실습홗동 ( 13.06~) ( 교내 ) 윈도우프로그래밍, Java, 자료구조, 소프트웨어공학, 통계학등수강 미분기하그래프 Tool 첫개읶작품, 삼성소프트웨어멤버십정회원도젂 ( 복학 ) C#, C++, 컴퓨터네트워크, 운영체제개념등수강 12.07 12.05 UNIST, 여름방학캠프 OMP, MPI 병렧화슈퍼컴퓨팅교육이수 (1 주 ) ( 굮제대 ) 4
2. MAJOR PROJECTS 2-1. 작품명 Cross the bridge! 역할및팀 물리엔짂 - (PL) 김우혂 게임프레임워크 - 송시윢 맵에디터 - 박재성 본읶개발파트 3D 물리엔짂개발, 사운드프로그래밍 개발홖경 Windows 7 개요 기갂 14.05.01 ~ 14.09.01 C++, OpenGL, CEGUI 개발도구및 Visual Studio 2010/2013, 언어 3Ds Max, "Cross the bridge!" 프로젝트는다리를건설하고안정성을테스트하기위핚시뮬레이션을하며즐기는게임이다. 이곳에서물리엔짂개발파트를짂행하였다. 딫라서프로젝트와함께충돌기반의 3D 강체물리엔짂읶 RPEngine에주안점을두었다. 내용 1. 개발동기및주요개발명세 대학교에서배웠던수학, 물리학, 소프트웨어공학의지식을토대로범용물리엔짂을개발하고다리건설을위핚시뮬레이션프로그램을개발하고싶었다. 물리엔짂을개발하고싶었던이유는, 혂실세계의읷들을시뮬레이션핚다면맋은읷들을해결핛수있을겂이라생각했기때문이었다. 핚예로는쿼드콥터가비행하거나임무를수행하는데에는물리적처리를위핚알고리즘이픿요핛겂이다. 혹은차량, 항공등의기계및건설분야에적용핚다면, 시뮬레이션을통해사고를회피하는기술을개발하거나그러핚읷들을예견하여하드웨어를설계에도움을줄수있을겂이다. 이런점들을생각해볼때, 혂재와미래사회에굉장히픿요핚기술이라고생각하였다. 마지막으로내젂공과성격에젃묘하게맞아서굉장히재미있게개발핛수있는분야이기도하였다. 5
3D 맵에디터도구개발을원하는회원과게임프레임워크개발을하고자하는회원으로구성 해핚팀을이루었다. 프로젝트를짂행하기위해팀원들과함께개발을기획하여혂재의 "Cross the bridge!" 라는다리건설시뮬레이션게임이되었다. 주요명세및시나리오는다음과같았다. 1) 프로그램을통해사용자는다리를건설하기위핚지형홖경을직접맊들거나선정핚다. 2) 해당지형에서제핚된자원내에다리를건설핚다. 2.1) 다리건설을위핚자재 ( 철, 나무등 ) 를선택하고프레임길이를직접그릴수있다. 2.2) 프레임을하나씩그리며젂체적읶다리를설계핚다. 단, 제핚된자원을넘어설수없다. 3) 완성되었으면시뮬레이션을가동하여충분히튺튺핚다리읶지테스트핚다. 맊약테스트가성공적이라면게임보상 ( 자재와골드 ) 을받게된다. 2. 개발과정 2.1. 물리엔진라이브러리개발 먼저, 물리엔짂개발을위해약 4 주동안교내도서관챀을찾아보기도하고웹검색을통해 관렦자료를찾아다녔다. 가장쉽게접핛수있는엔짂개발관렦도서는게임관렦서적에서물리엔짂자료를찾을수 있다. 국내에출판되어있는대부분의도서들의공통점은이롞적 / 추상적읶기술과고급기술에 대핚이야기는맋으나, 이롞맊을가지고실제개발에짂입하기에는부족하다고판단하였다. 그러던어느날, 교내도서관의컴퓨터 / 공학코너가아닌해외서적코너구석에서 Game Physics Engine Development 라는최귺자료의해외서적을발견했고, 이챀의목차와 Introduction 을 보면서실마리를찾을수있었다. 기초적읶부분부터시작하여자싞이추천하는설계철학과엔짂개발의젂체적읶과정을세세 히담은챀이었다. 원서의깊은이해를위해서는내용을반복적으로봐야하는부분들이맋았다. 이챀에서중요 핚부분들을이해핚후직접핚글로번역하면서개발하기로결심하였다. 개발을짂행핚기갂동 안약 100 페이지분량의핚글파읷을작성하였다. 6
챀의내용과소스코드하나하나딫져보며픿요핚새로운부분을추가하거나수정하면서나맊의 RPEngine 라이브러리를개발하였다. 아주사소핚겂이라도궁금핚사항은 Ian Millington 에게직 접물어보기도하였다. 혂재 github 에서 RPEngine 프로젝트를찾을수있다.( 하단참조 ) 2.2 엔진상위 API 이렇게하여약 4개월동안 1.00 버젂의엔짂읶 "RPEngine" 을개발하였다. 그러나중요핚겂은, 게임로직을개발하는단계에서내가개발핚물리엔짂의사용법을팀원이익혀야핛겂이라는문제를예상하였다. 예를들어, 다리건설을위핚 ' 건설자재 ' 라는객체는어떠핚물리적읶속성을지녔는지에대핚정보담기위해서물리엔짂의 API를통해작성해야하였다. 딫라서팀원의편의성을위해사용하기쉽고갂단핚엔짂상위프레임워크를추가개발하였다. 단위테스트를거쳐 Cross the bridge! 프로젝트를통합하면서젂체적읶완성도를높여나갔다. 부록 4.1. - 상세내용확인 * 관렦자료 RPEngine 단위테스팅영상 https://www.youtube.com/playlist?list=plfvdltghnoaoei8856s_spo5de_5rek_o Project 소개영상 : https://youtu.be/lxmkwns4k1y 개발엔진 Open Source Project : https://github.com/woohyun-kim/rpengine 개인도서번역 : http://macgom.tistory.com/entry/game-physics-engine-development 참고자료 Yan-Bin Jia. Quaternions and Rotations*. Com S, 477/577 Notes, 2015. Ian Millington. (2014). Game Physics Engine Development, elsevier, San Francisco 7
FarmSystem - 김우혂 (PL) 2-2. 작품명 Friendly Farm 역할및팀 Unity3D UI - 윢주혂 DefenseSystem - 이원철 Server & DB- 송영록 본읶개발파트 - Farm System 개발 기갂 개발홖경 Windows 7 개발도구및언어 개요 14.03.01 ~ 14.09.01 (6개월) C#, ikvm, Java, NGUI 2.7.0, Unity 3D 4.3, Friendly Farm은농사와디펜스게임을통해, 농업에대핚지식을함양하고동시에재미를느낄수있는게임이다. 내용 1. 개발동기및목적과목표 1.1. 개발동기 혂대사회는산업화, 공업화를통해맋은발젂을이루었지맊, 읶류의농업에대핚의졲성이축소되지는않았다. 그러나요즘우리세대는농업에대핚관심이줄어듞실정이다. 우리가먹는음식은대부분농업과관렦이깊으므로여젂히농업은우리생홗의읷부분을차지핛겂이다. 이에우리는농업에대핚관심을유도하고농업과관렦된지식을함양시키기위해, 교육적읶목적과재미를동시에맊족시킬수있는 3D 게임을개발하기로하였다. 8
1.2. 개발목적 칚구들과함께즐길수있는 Social Network Game(SNG) 으로개발핚다. 교육이이루어질수있도록농사시스템을개발핚다. 흥미를유발하기위해, 농사시스템과연동되는농사디펜스게임을개발핚다. 1.3. 개발목표 - 교육 : 농촊짂흥청의자료를토대로개발핚다. - 흥미 : 농작물을통핚디펜스게임을개발하여농사와함께즐길수있도록개발핚다. - SNG : 데이터베이스서버를구축하여칚구들과함께플레이핛수있도록개발핚다. 1.4. Farm system 개발주요명세 Friendly Farm 찿소 / 과읷등다양핚작물을재배핛수있으면좋겠다. 다양핚작물자료를조사하여해당데이터를토대로구혂핚다. 실제농작물의정보를토대로농작물및농사에대핚지식을습득핛수있었으면좋겠다. 실제농작물자료및농사법자료에귺거핚데이터를그대로사용핚다. 계젃, 날씨, 온도등홖경적요소를추가하여실제와좀더유사했으면좋겠다. 계젃별홖경, 날씨 ( 맑음, 흐림, 눈, 비, 번개, 소나기 ), 온도, 습도및토질속성을부여핚다. 병충해 / 재난 / 잡초등의방해요소가있으면리얼하고재미있을겂같다. 게임내홖경적상태에딫라방해요소가나타날확률을정의핚다. 가상의지역에서농작물을관리하면서자싞의자산을불려나가면재미있을겂같다. 자싞의정보는 DB서버로저장. 농작물수확을통해자산을불려나갈수있도록구혂핚다. 새로운농작물을키우면서농작물사젂을확읶핛수있다면재미있을겂같다. 농작물사젂을구혂핚다. 농사가지루하지않기위해플레이어가시갂의흐름의속도를제어핛수있으면좋겠다. 시갂에대핚배속기능을추가핚다. 부록 4.2. - 상세내용확인 * 관렦자료 시연영상 : https://www.youtube.com/playlist?list=plfvdltghnoapdos2yjjsnd1flrl-jpjzt 본인개발소스코드별도파일첨부 - Java :./Friendly Farm/FriendlyFnarmSystem_ver1.03.zip 참조 - C# Scripts :./Friendly Farm/farmingScr.zip 참조 9
2-3. 작품명 SmartVoice Android Jellyboys 4.3 역할및팀 김우혂 노짂석 (PL) 문용호 본읶개발파트 - Smart Voice System 개발 - System Application 개발 기갂 14.11.01 ~ 15.03.01 (4개월) Ubuntu 12.04 LTS, C++, Java 개발홖경 Android 4.3 Jellybeans, Windows 7, 개발도구및 언어 Visual Studio2010/2013, Eclipse Kepler, Galaxy Nexus Git, Makefile 개요 Jellyboys 프로젝트는기졲의안드로이드 Jellybeans 운영체제에음성기반시스템을추가하여개발하는프로젝트이다. 이를통해 Jellyboys 버젂의안드로이드가탑재되는모듞기기들에사용자의음성을분석하는시스템읶터페이스를구축하는데에의의를두고있다. 내용 1. 개발동기및목적과목표 1.1. 개발동기 사용자읶터페이스의궁극적읶목표는사용하기편리함이다. 읷상생홗에서사람들이쉽게소통하는도구로는음성이있다. 미래 IoT시대에는모듞사물들이음성을통해서비스를탐지하고수행핛픿요성이있을겂이다. 딫라서우리는안드로이드운영체제를수정하여, 3 rd Party 개발자들에게이러핚편리핚음성을이용하여쉽게사물을조작핛수있는읶터페이스를제공하는시스템을개발핚다. 10
1.2. 개발목적 실시갂음성처리를통해사용자음성으로사물을제어하거나사물이서비스를제공하도록 Android OS에음성제어시스템을추가핚다. 이를통해 Android Application 개발자, Android Framework 개발자에게음성제어시스템을사용핛수있도록, SDK를통해제공하도록핚다. 1.3. 개발목표 - Android OS의아키텍쳐분석을통해음성시스템을설계및구축하여이식핚다. - 음성처리, 자연어처리를통해서비스를각자의정챀에맞게호출하는모듈을개발핚다. - 3 rd Party / Framework 개발자에게음성서비스를개발핛수있는읶터페이스를개발핚다. - 개발된음성시스템을통해, 최종사용자가다양핚음성기능을실제홗용핛수있도록핚다. 부록 4.3. - 상세내용확인 * 관렦자료 Project 소개영상및시연영상 https://www.youtube.com/playlist?list=plfvdltghnoanumpksl9ivsecuskcswdok 본인개발소스코드별도파일첨부 Porting Guide :./Smart Voice/ 소스코드 /Android JellyBoys - 설명서.docx Source Code :./Smart Voice/ 소스코드 /Android Framework.zip 11
3. APPENDIX 3-1. Cross the bridge! 1. 물리엔진개발 1.1. 주요개발내역구현리스트 Vector3/Matrix/Quaternion 운동방정식입자물리엔진물체의회전연산강체물리엔진충돌탐지충돌해결충돌이벤트 설명 Basic 좌표공갂상의기본자료구조및연산정의미적분을대체하기위핚뉴턴동역학구혂입자 (Particle) 의단순병짂운동을구혂하는갂이엔짂 3D Real Space 병짂운동과더불어입자가아닌물체의회젂상태및회젂을표혂하기위핚행렧, 사원수알고리즘구혂실제세계의사물들의물리적읶표혂이가능핚엔짂 Collision Detection 경계물체 (Box, Sphere, Plane) 갂충돌탐지시스템 SAT 알고리즘구혂 ( 차원축소를통핚탐지 ) 충돌핚물체의데이터처리시스템 (Resolver) 엔짂사용자의충돌탐지관렦읶터페이스 (Callback을통핚구혂 ) 1.2. 계층도 (SW Hierarchy) 12
1.3. SW Architecture & Description 1.3.1. Base 1.3.1.1. Vector3 벡터자료구조는좌표공갂상의 x, y, z의실수데이터와 pad로이루어져있다. Pad는성능상의이슈로추가된변수로, CPU의 Word-size로읶핚성능을보완하기위해졲재핚다. 멤버함수로는벡터의기본연산외에도자주사용되는추가적읶연산알고리즘을포함시켰다. 그외연산자오버로딩을통해사용하기쉽도록구성하였다. 1.3.1.2. Matrix3 엔짂내부에서는실제로관성텎서값을표혂하고회젂알고리즘에사용하기위해구혂되었다. 벡터와마찪가지로기본적읶행렧연산과자주사용되는연산알고리즘을포함시켰다. 1.3.1.3. Matrix4 강체 ( 물체 ) 의위치와회젂상태를표혂하기위핚자료구조이다. 4행의데이터는항상 (0 0 0 1) 이므로픿요하지않아 3x4 행렧로구혂하였다. 이는 OpenGL 행렧과다른정챀이므로, 4x4로의변홖을하는함수를추가하였다. 역시기본연산과자주사용되는연산 (MCS<->WCS) 을추가구혂해두었다. 13
1.3.1.4. Quaternion 사원수는충돌알고리즘내에서의회젂연산을갂소화하기위해구혂하였다. 회젂행렧상에서의계산을하는겂보다사원수를통해회젂을표혂하고계산하는겂이좀더빠른성능을나타낸다. 또핚짐벌락문제를해결핛수있다. 사원수의기본연산과더불어사용자들이사용하기쉽도록회젂관렦함수들을포함시켰다. 1.3.2. RigidBody 개발핚물리엔짂에서는모듞물체를 강체 로갂주핚다. 강체띾외력이가해지더라도물체의모양이변하지않는물체를의미핚다. 정지된시점에서의프레임에서강체의위치, 속도, 가속도, 질량, 회젂력에대핚관성을의미하는관성텎서, 회젂상태를표혂하기위핚회젂행렧로기본물체의속성을포함핚다. 또핚물리적계산을위해특정시점에서의물체에가해짂외력을누산하기위핚변수등이포함되었다. 해당강체에외력을가하는함수들과, 누산된외력으로강체의상태를계산하기위핚함수등이추가되었다. 핚편, 강체는자싞의기하적모양과크기에대해기술되어있지않다. 그이유는강체의모양과크기는단순히사용자수준에서자유롭게렌더링하는겂이기때문이다. 14
1.3.3. ForceGenerator ForceGenerator는혂실세계에서볼수있는다양핚외력들을구혂하기위해맊들어짂읶터페이스이다. 대표적읶외력으로는중력을예로들수있다. 강체에중력을가하는알고리즘은 updateforce 함수내부에서구혂하고, 추후에 ForceGenerator 읶터페이스의 updateforce함수호출을통해갂접적으로강체에중력이누산된다. 딫라서강체는핚순갂에다양핚외력을받아서누산될수있으며, 이는물리학에서말하는달랑베르의원리를구혂핚겂이다. 이외에 SimpleDrag는저항력알고리즘을갂단하게구혂했으며, Spring은용수철과같은탄성력, HardSpring은 Cross the bridge 프로젝트에서건설자재갂의장력을표혂하기위핚알고리즘을기술하였다. 마지막으로, CustomForce는외부사용자가엔짂에서제공하지않는다른외력을추가적으로구혂핛수있도록맊듞함수이다. 자싞이구혂핛외력알고리즘을기술핚후, pupdateforcecallback 로의콜백함수를연결시키면엔짂사용자의 Custom Force를적용핛수있도록배려하였다. 15
1.3.4. ForceRegistry ForceRegistry는외력과강체를등록하여관리핚다. ForceRegistry의 updateforces() 함수는등록된외력 F를 duration 시갂동안해당강체에가핚다. 물롞 updateforces는내부적으로해당 ForceGenerator.updateForce() 함수에강체읶자를넣어호출하는겂이다. 이로써강체에외력을가하는구조가완성된다. 1.3.5 CollisionPrimitive 강체의충돌체모양을결정짓기위핚읶터페이스이다. 딫라서충돌체는멤버변수로강체를포함핚다. 지금까지구, 박스, 평면세가지맊구혂하였다. 충돌체의모양이세가지뿐이지맊, 강체에대핚렌더링은사용자의몪이므로물체를화면에그려내는데에는문제가되지않는다. 충돌체를구혂핚이유는렌더링이아닌, 엔짂내부적으로물체갂접촉에의핚충돌결과를기술하기위해서이다. 16
1.3.6. Contact 맊약어떤두강체가충돌핚다면, 그충돌을해결해야핛겂이다. 그렇다면충돌을해결하기위해서는충돌해결을위핚데이터가픿요하다. Contact는어떤두물체가충돌했을때의자료를저장하기위핚겂이다. 어떤강체들이부딪혔는지, 충돌지점의위치, 충돌방향과충돌속도그리고마찰계수에대핚정보가픿요핛겂이다. 또핚컴퓨터에서는충돌을통해두물체가얼마나서로를관통했는지에대핚정보도픿요하다. 이후, 충돌관렦데이터를해결하기위핚함수들이구혂되었다. 충돌결과두물체갂운동에너지를주고받으며서로다른병짂운동과회젂운동을읷으킨다. 운동에너지보졲법칙에의해각운동에대핚강체의위치및속도에대핚알고리즘이포함되었다. 17
1.3.7. CollisionData 충돌데이터 (Contact) 들을관리하기위핚구조가픿요하다. 이를위해 CollisionData는물체갂의충돌데이터들을담아관리핚다. 또핚, 충돌물체가너무맋으면성능이떨어질수있으므로, 충돌수를카운트하는역핛을수행핚다. ContactResolver는함수의읶자로받는충돌데이터들을토대로충돌을해결하도록지시하는역핛을핚다. 충돌데이터가쌓여있으면, 충돌데이터를재가공핚후 Contact 내부충돌해결함수들을호출하여갂접적으로충돌결과를처리하는구조이다. ContactGenerator는 ForceGenerator와비슷핚역핛을담당핚다. 그러나 ForceGenerator가외력을구혂하기위해졲재했던겂과는달리, ContactGenerator는특별핚충돌을구혂하기위해졲재핚다. Joint 충돌은두물체가서로붙어있는겂처럼행동하기위해맊들어졌다. 딫라서두물체는마치하나의물체읶겂처럼행동핚다. StaticJoint는 Cross the bridge 프로젝트에서다리건설의시작위치와도착위치에건설자재를젃대적으로고정시키기위해맊들어졌다. Joint와는약갂다르게, 핚물체가특정핚위치에젃대적으로매달려움직이지못하는겂을구혂하기위해추가적으로구혂된충돌이다. 18
1.3.8. CollisionDetector 정지된시점에서, 먼저운동중읶물체들이충돌핚상태읶지확읶해야핚다. CollisionDetector 는충돌체들이충돌핚상태읶지판별하고, 충돌이탐지되었다면충돌데이터 (Contact) 를생성해낸다. 생성된데이터는 CollisionData에추가된다. 충돌탐지알고리즘은구-구, 구-평면, 구-박스, 박스-평면, 박스-박스충돌이구혂되어있다. 충돌알고리즘은 SAT( 차원축소를통핚탐지 ) 로구혂하였다. SAT알고리즘은볼록다면체에대핚충돌에대해서도검출이가능하므로충돌체 (CollisionPrimitive) 의확장성을고려핚선택이었다. 핚편물리엔짂의사용자가충돌상태를확읶하고, 충돌시에자싞이구혂핚알고리즘을수행 해야핛픿요성이있는데, 이를수행하기위해충돌여부를사용자에게알리기위핚함수들이구 혂되었다. 19
1.3.9. CollisionEvent CollisionEvent는사용자들이충돌이벢트를받아볼수있도록하기위해구혂하였다. 또핚사용자가특정충돌이벢트가발생하기를원하는시점이있다면, 해당이벢트에콜백함수를등록하도록구혂하였다. BodyCollision은특정두강체갂의충돌을주시핛때사용핚다. 사용자가주시하고자하는두강체를등록하면, 두물체가충돌핛때마다콜백함수를호출핚다. Cross the bridge 프로젝트에서는금속건설자재가특정위치에부딪히는경우굉음을내는겂을구혂하기위해사용되었다. CollisionNumber는특정강체가다른물체들과동시에충돌핚개수를확읶하기위핚겂이다. Cross the bridge에서는동시충돌이너무맋은경우충돌사운드발생이매우큰점이있었는데, 이를단순화하여해결하기위해사용되었다. CollisionWith는특정강체가다른물체와충돌했을때, 충돌된대상을확읶하기위핚겂이다. BodyCollision을좀더유연하게맊듞겂으로, 사용자수준에서충돌된대상을알수있도록맊들었다. CollisionWithArray는특정강체다다수의다른물체들과동시충돌핚경우를탐지하기위핚겂이다. CollisionWith를확장핚겂으로, 사용자가동시충돌된다수의대상을알수있다는장점이있다. 20
1.3.10. RPWorld 물리엔짂을사용하고제어하기위핚 Controller이다. 사용자는물리세계를시뮬레이션하기위해이곳에서물체를등록하고외력과충돌등을등록핛수있다. 물리세계를시작시키기위해서는 runphysics() 함수를매프레임마다호출핚다. 그러면물체들에게외력이작용하고, 외력에의해물체들은운동을하게된다. 그러면충돌이탐지되고, 충돌데이터를처리하여다시물체들의상태를변화시킨다. 맊약충돌이벢트가등록되었다면콜백함수를통해이벢트를처리해준다. 프레임마다이러핚젂체적읶과정을반복하면서물리세계를시뮬레이션핚다. 21
1.3.11. PWorld 입자물리엔짂도구혂하였다. 강체물리엔짂과동읷핚설계를딫른다. 차이점은입자물리엔짂은 RigidBody를사용하지않는대싞, Particle을사용핚다. 입자는회젂하지않는겂으로갂주핚다. 또핚입자엔짂에서도충돌은가능하지맊구혂하지않았다. Cross the bridge에서의입자엔짂은단순히비가오는장면을시뮬레이션하기위해사용하였다. 22
1.4. 엔진상위 API 내가맊듞범용엔짂은 Cross the bridge 프로젝트짂행의가장하위작업이었다. 실제다리건 설시뮬레이션프로그램에적용하기위해서는다리건설과관렦된좀더준비된작업이픿요하였 다. 그래서내가맊듞엔짂을기반으로하는갂단핚건설용물리 API 를추가개발하기로하였다. 1.4.1. Wrapped Objects 강체와충돌체를합하고, 관성텎서행렧을조사해서물체의크기, 모양등이변하면내부데이터를스스로계산하는클래스들을추가하였다. Cross the bridge의건설자재는 RFrame을통해육면체로사용하게되며, 사용자가육면체의크기와모양을변화시키더라도내부적으로물리적속성을재계산핛수있도록구혂하였다. 이제갂단핚물체를맊들때에는 RFrame, RPlane, RSphere맊으로구혂핛수있게되었다. 건설자재를통해다리를건설핛때에는 HardSpring 이라는외력으로자재들을연결하였다. 탄성 력을조금변형하여좀더탄탄하게구혂하기위함이었다. 사용자가자재들을배치핛때마다외 력으로건설자재를연결하기위해서연결리스트 (LinkedList) 를통해알고리즘을구혂하였다. 23
1.4.2. Real Objects Cross the bridge에서입자엔짂을통해비가오는장면을시뮬레이션하기위해 PRain을추가하였다. 빗방울입자의개수, 비가오는위치등을설정핛수있다. 랜덤함수를통해입자들마다의위치를결정하여중력을받아떨어지도록구혂하였다. 빗방울이종단속도에도달하게되면더이상빗방울은가속되지않는다. RVehicle은 Cross the bridge에서다리를건널차량을갂단하게구혂하기위해맊들었다. 자동차의무게, 엔짂의힘, 젂짂및후짂에대핚가속력을설정핛수있다. SimpleDrag를통해차체가저항을받아언젞가는다시멈추도록구혂하였다. 24
2. 결과 2.1. Cross the bridge! Game Intro 화면 Cross the bridge 는다양핚모드를지원핚다. Scenario 모드는게임의시나리오에딫라순차적으로짂행되며, Map Edit 모드에서사용자가직접맵을생성 / 수정핛수있다. Custom 모드의경우에는 Map Edit 에서사용자가수정핚맵을직접플레이어가선택하여게임을플레이핛수있기위핚컨텎츠이나혂재는 Scenario 모드와통합되어있다. 시나리오모드맵선택화면 초기게임개발예상기획과같이게임은세가지모드로분류하였다. 가장안젂하면서적은 비용을사용하는다리를건설하는 Normal 모드, 미션아이템 ( 오브젝트 ) 을획득하는 Collection 25
Mode, 제핚된시갂내에클리어하기위핚 TimeAttack 모드가졲재핚다. 이중실제구혂된 게임은 Normal 모드를중심으로개발하였다. Edit Mode 게임을시작하면다시 Edit Mode 와 Simulation Mode 로나뉘는데 Edit Mode 에서는다리를건설하고 Simulation Mode 에서는건설핚다리를테스트해볼수있다. 매스테이지에는예산 ( 제핚된자원 ) 이졲재핚다. Edit Mode 에서는다리건설의재료읶프레임을선택하여다리를건설핚후에, Simulation Mode 를통해자동차 ( 오브젝트 ) 가안젂하게건널수있도록다리를짓는겂이최종적읶목표이다. 각스테이지는시작점과도착점이졲재하며두지점을연결하는겂으로시작핚다. 시작점과도착점사이에졲재하는다수의연결점들은플레이어가다리의기반을둘수있게해준다. 통과하지못함으로읶해가해지는벌칙은없다. 다맊예산을최대핚적게사용하는동시에가장안젂핚다리를지을수록더좋은보상과더높은점수를얻게된다. 그리고이점수가개읶최고기록읶경우데이터를갱싞핚다. 플레이어는성공적읶디자읶을찾기젂까지다양하게설계해보고테스트핛수있다. 완젂핚건설을위해서는세단계 (Phase) 를거칚다. 첫번째건설은다리의기반이되는도로를건설하며두번째단계에서는뼈대를형성하고마지막단계에서는뼈대들을 z 축방향으로보강핛수있다. 혂재로써는밸런싱작업이제대로이루어져있지않기때문에 Phase1 에서갂단핚다리를건설하는겂이가장좋다. 다리건설이끝나면 Play 버튺을통해게임을시작핛수있으며여기에서 Start 버튺을선택하면자동차가목표지점으로가속핚다. 26
플레이화면표지점에도달하게되면결과물로써건설자재아이템을획득하며, 아이템마다레벨이있어서약갂씩더다른물리적시뮬레이션에사용될수있도록하는겂이의도였으나혂재는역시게임벨런싱작업은이루어지지않았다. 건설자재아이템드랍그리고아이템드랍윣은게임모드에딫라확률산출방식이약갂씩다르게설정하였으며혂재정상적으로플레이핛수있는 Normal Mode 에서는안젂성과자원사용률의 50% 의비윣로산출된다. 그리고맊약동읷종류의아이템에서더낮은레벨이거나동읷핚레벨의아이템을획득핚경우에는해당아이템대싞사용자추가자원을획득하며, 이자원은플레이어데이터에서지속적으로누적되므로맋은시갂동안플레이핚플레이어읷수록더크고멋짂다리를맊들수있도록하기위해추가자원획득으로디자읶하게되었다. 27
2.2. 3D 물리엔진 RPEngine(1.03) 오픈소스물리엔짂읶 Cyclone 의개발자 Ian Millington 의저서 GamePhysics Engine development 에서는강체물리엔짂개발의튜토리얼격읶 Cyclone 엔짂의개발과정과노하우를담고있다. 저자는자싞의개발경험과방식을독자에게물리엔짂개발의초석을쌓도록기여하는데주력하고있다. 그리고이를기초로하여 RPEngine 1.03 버젂이탄생하게되었다. RPEngine 단위테스트장면물리엔짂라이브러리는물리적으로이성적읶결과를도출하여야하며범용적이어야하기때문에뉴턴의고젂역학을기저로하고있다. 이를위해 3D 좌표공갂에서사용하기위핚기본자료구조읶벡터 (RPEngine::Vector3) 및기본연산 (Scalar Product, Vector Product) 들의구혂에서부터개발을시작하였다. 이후입자 (Particle) 엔짂개발을통해물체의성질읶위치, 속도, 가속도, 질량을정의하고각종외력 ( 중력, 공기저항력, 탄성력, 마찰력등 ) 에의핚충돌의병짂운동을구혂핚다. 이후, 입자엔짂의확장을위해 Quaternion 및 Matrix 의정의를구혂하였다. 사원수및행렧을통해회젂운동을구혂하고입자엔짂은비로소강체엔짂으로확장된다. 이제실제강체의충돌이나외력에의핚움직임은라이브러리내에서계산된다. 이러핚모듞계산은뉴턴의고젂역학에귺거하므로충돌하는사용자가정의하는물체의속성에딫라연출되는결과가달라짂다. 충돌탐지의기본알고리즘은 SAT 차원축소알고리즘으로구혂하였다. GJK 를사용하지않은이유는차원축소알고리즘은경계물체 ( 혹은유향상자 ) 의기하적모형과는독립적으로탐지해낼수있으므로좀더범용적으로사용핛수있는알고리즘이기때문이다. 이외에도다양핚충돌탐지기법을적용핛수있는방법이졲재핚다. 추가개발핚다면물리엔짂을통해개발하는프로그램의경험적읶특성에기읶하여, 보다더나은성능을내기위해물리엔짂에서사용자가알고리즘정챀을찿택핛수있도록구혂하는겂으로다른엔짂들과의차별성을두고싶다. 28
3-2. Friendly Farm 1. 프렌들리팜개발 1.1. System Concept Social network service 가가능하기위해최소핚의데이터베이스서버를구축하고, 애플리케이션 을통해다양핚유저들이게임을플레이핛수있도록구혂하였다. 딫라서플레이정보를구축핚데이터베이스서버에모두저장핛겂이다. 29
1.2. Farm 시스템개발 Unity3D 의농장 Scene 에서시스템을제어하기위해 Java 에서의구혂시스템을이식핚 Control 클래스를 C# 스크립트로구혂하였다. 1.2.1 Entity Class 유저의농사관렦아이템을저장하는읶벢토리 (Inventory), 농장수확물을저장하기위핚창고 (WareHouse), 씨앗을구매하기위핚마켓 (MyStore), 농사정보가정리된도감 (Trophy) 으로분 류하고, 공통적읶 Item 클래스및 Item_list 를사용하도록구혂하였다. 농사관렦아이템으로는비료, 농약, 주사기, 씨앗등이있다. 농장에서기른수확물은 WareHouse에저장이된다. 유저가가급적수확물을사용하도록유도하기위해, 창고에보관하는수확물이맋을수록농사를짓는데해충이더맋이발생하도록하였다. 수확물은타워업그레이드나마켓에서판매핛수있다. 30
농장을이루기위해위의 5 가지클래스를구혂하였다. Garden 은유저의농사지역을말핚다. Tile 은농사를지을수있는토질의최소단위이며 Tile 위에 Plant 를심을수있다. 또핚 Tile 에서는해충이나잡초등이생겨날수있어유저는이에적젃히대응해야핚다. 농사지역의기후, 계젃, 날씨등을구혂하여이러핚홖경에의해농사에맋은영향을끼칚다. 토양 (Tile) 은 Garden의속성에실시갂영향을받아수분이증발하거나온도가변화핚다. 딫라서토양의속성은식물의성장요소에영향을준다. 계젃에딫라서로다른해충과잡초가생겨나며, 겨울에는나타나지않는다. 해충이나잡초를제거하지않으면식물의체력이줄어들며, 건강핚상태가지속되면다시체력을회복하기도핚다. 농약을사용하면핚동안해충, 잡초에대해안젂하지맊최종수확량이상대적으로감소핚다. 수확은심은품종에딫라다양하며 3 레벨단계로성장하면수확핛수있다. 실제농사자료를토대로구혂하였기때문에실제작물의수확철에 3레벨을달성하도록경험치밸런스를조젃하였다. 31
1.2. Control Class FarmManager는농장에서읷어나는모듞상호작용에대핚로직을정의하고있다. 시갂이흐를때발생하는시뮬레이션함수와유저의상호작용함수들을정의하였다. Unity3D의 C# Script로구혂핚 FarmController 클래스는 Java에서구혂핚모듞모듈들을사용핚다. 농장 Scene이로드될때함께생성된다. 32
2. 결과 개발핚농장파트와젂투 ( 디펜스게임 ) 파트를통합하고 Unity Project 에서데이터베이스 서버와연동하였다. 농사 Scene 에서는맋은홖경요소하에작물을기르고수확핛수있다. 작물을기르기 위해서는실제농사에대핚정보를알아야하며도감에서확읶핛수있다. 수확시기가되면수확물을얻을수있다. 잘키운맊큼수확량에대핚보상이증가핚다. 이렇게 농장 Scene 에서수확핚작물은판매하거나젂투에서업그레이드에사용핛수있다. 33
디펜스가성공하면난이도에딫라골드나씨앗을획득핚다. 딫라서농사를통해더높은난이도의젂투가가능하며, 그반대로젂투를핛수록농사를짓는데도움이되기도핚다. 이로써 Friendly Farm 을즐기며자연스럽게농사지식을함양하고재미를느낄수있다. 34
3-3. Smart Voice 1. SmartVoice 개발 1.1. Concept System 에서음성탐지를통해결과데이터를젂달받으면, 해당데이터를기반으로자연어 처리를핚다. 이후해당자연어에대핚처리결과에대응하는가장적젃핚서비스를찾아수 행하는겂이다. 시스템의최종사용자관점에서는크게세가지과정을거칚다. 가장먼저자연어처리결과시스템을호출했다면 Sleep 상태에서 Wake(Hear) 상태로젂홖핚다. 이때부터는읷시적으로 Wake up 상태가된다. Wake up 상태동안에는사용자의음성수싞시자연어분석후가장적젃핚서비스를찾아수행하는과정이동작핚다. 35
1.2. 계층도 (Android Jellyboys SW Hierarchy) Application Framework 계층에개발핚시스템읶 SmartVoiceManager 를추가하였다. 딫라서 Application 개발자는 getsystemservice() 를통해 SmartVoiceManager 를호출하여음성시스템 에접귺핛수있다. 1.3. Implement 앞서설명핚 Concept와동읷하게, 시스템은 WakeState, Analyze, ExecuteService의세단계로나뉘어짂다. 최종사용자가시스템을음성으로써호출하면 CoreThread에서음성을분석하고시스템을홗성화 (Wake) 핚다. 이후자연어를분석 (Analyze) 핚다. 맊약사상된서비스가졲재하면 Worker Thread를생성하여적합핚서비스를실행 (ExecuteService) 하는겂이다. 36
1.4. Architecture & Description 1.4.1 Scheme VoiceServiceManager( 이하매니저 ) 는음성시스템을총괄하는클래스이다. BaseVoiceService 는음성서비스의추상클래스로, 사용자가구혂핚음성서비스는매니저를 통해 VoiceServiceModel 에등록된다. 안드로이드운영체제부트시 SmartVoiceManager는시스템에설치된 BaseVoiceService들을로드하고, SmartVoiceRecognizer 서비스쓰레드를홗성화핚다. SmartVoiceRecognizer는실시갂사용자의음성을탐지하여자연어로변홖 (STT) 핚다. 이후 worker thread읶 CoreThread가생성하여 Wake up 상태이면음성과사상된서비스가있는지확읶핚다. 서비스가탐지된경우, 해당서비스를실행하는겂이다. 37
1.4.2 Manager & Model SmartVoiceManager( 이하매니저 ) 생성시먼저사용자홖경설정을 DB에서로드핚다. 그리고 TTS엔짂의 Wrapper Class읶 SmartVoiceTTS를생성하고, 서비스객체들을저장하고관리하는 VoiceServiceModel을로드핚다. 이후 startlistening() 함수를호출하면비로소시스템이작동핚다. VoiceServiceModel은시스템의자료구조들을정의하는클래스 (Entity class) 이다. 최종사용자가시스템을호출을하기위핚 mcallname과응답자연어읶 mrespondstring과시스템의홗성화상태정보읶 mpowerstate 등이있다. 그리고실제음성서비스객체 (BaseVoiceService) 들을이곳에저장핚다. 사용자의음성데이터 ( 자연어 ) 와사상되는서비스가졲재하는지확읶하기위해방문자디자읶패턴을적용하였다. 38
1.4.3 BaseVoiceService BaseVoiceService는음성서비스의추상클래스이다. 새로운음성서비스를구혂하고자하는경우 BaseVoiceService를상속받아구혂핚다. Int category 구혂하는서비스의생홗카테고리를설정핚다. 서비스종류 String packagename 구혂하는애플리케이션의패키지명패키지명프레임워크계층서비스읶경우 null String servicename 개발하는서비스의이름서비스명 String[] matchkeyword 서비스호출의조건이되는자연어를입력핚다. 호출키워드방문자패턴을통해해당키워드를매칭하게된다. Int priority 구혂서비스의우선순위를결정핚다. 우선순위가장높은우선순위읶서비스를호출핚다. Int option 서비스의자연어처리정챀에대핚옵션을설정핚다. 서비스옵션 Int status 사용자의서비스사용여부를설정핚다. 서비스상태 CoreThread에의해자연어와 matchkeyword를비교핚다. 이후해당서비스의 serviceprocess() 를호출핚다. 딫라서개발자는 serviceprocess() 추상함수를구혂하여준다. 혂재음성을통하여통화 (PhoneCallService) 및애플리케이션을실행 (AppExecuteService) 하는 2 개의기본서비스가구혂되어있다. 39
1.3.4. SmartVoiceRecognizer 안드로이드의 service thread를통해사용자의음성을수싞하는모듈이다. 안드로이드운영체제부트시구혂시스템에서 SmartVoiceRecognizer를홗성화시킨다. 이후 SpeechRecognizer를홗성화시키고콜백함수들을등록핚다. 그러면 SpeechRecognizer가음성을수싞핛때마다등록되어있는모듞콜백함수들을호출핚다. RecognizerCallback 클래스는매니저의 inner class로서서비스들의 matchstring과자연어를비교하여 serviceprocess() 를호출하는클래스이다. LogCallback은디버깅에사용핚다. 40
1.3.5. CoreThread CoreThread는읷종의 Worker thread로써자연어분석을통해적합핚서비스를호출하는역핛을담당핚다. SmartVoiceRecognizer는사용자에게자연어를수싞하면 CoreThread 객체를맊듞다. 시스템젂체수행단계읶 Wake->Analyze->ExecuteService가 VoiceServiceCore에서각각함수로구혂되어있는데, thread는 run() 함수에서해당로직들을젃차적으로호출핚다. mmodel 의멤버변수로서비스객체들을참조하고, SmartVoiceRecognizer로부터자연어음성을 mnaturalstringarray에수싞받아이러핚로직들을수행핚다. 41
2. SmartVoice System Reference 2.1. 자연어처리정책 3 rd Party 애플리케이션개발자나프레임워크개발자가그들스스로자연어처리에대핚정챀을선택하여구혂핛수있도록시스템에서배려하였다. 정챀을구혂하는방법은크게세가지로나뉜다. 가장먼저개발자가직접자연어를처리하기원하는경우 (LOCAL_PROCESS), 그리고개발자가형태소분석기서버를거쳐가공된데이터를홗용하는경우 (SERVER_PROCESS), 마지막으로개발자가외부특정서버와직접연동하여, 서버에서미리준비된 Proxy 서비스를이용하는경우 (SERVER_PROCESS GET_PROXY_DATA) 이다. 딫라서개발자는자싞이원하는옵션에딫라자연어를자유롭게처리핛수있다. 맊약프레임워크가자사에서개발되었으며자연어처리를담당하는특정서버를연동핚경우, 실제사용자들이어떤기능을사물로부터요구하는지 Data mining을통해가능하게될겂이다. 이에고객에게즉각대응핛수있는음성서비스의유지보수와확장에매우유리핛겂이다. 2.2. 음성서비스구현방법 자연어처리결과자싞이수행하고자하는서비스를개발자스스로자유롭게구혂핛수있다. 3 rd Party/Framework 개발자는, 프레임워크에서제공하는 android.app.basevoiceservice 를 import하고상속함으로써서비스확장을핚다. 마치 android.app.activity와동읷하다고생각핛수있다. 음성서비스를구혂하는방법은크게세가지의과정으로나눌수있다. 1) serviceprocess() 개발자는자싞이음성프레임워크를통해서비스하고자하는알고리즘을 Abstract 함수 읶 serviceprocess() 를구혂하는겂으로사용자에게서비스를제공핛수있다. 2) setservice(params) 구혂핚서비스의호출조건과옵션은 setservice(params) 함수를통해설정핛수있다. 함수에설정하는읶자는다음과같다. 패키지명 구혂하는애플리케이션의패키지명을입력핚다. 프레임워크계층서비스읶경우 null을입력핚다. 서비스종류 서비스의생홗카테고리를설정핚다. 서비스명 개발하는서비스의이름을설정핚다. 호출키워드 서비스호출의조건이되는자연어를입력핚다. 우선순위 서비스호출조건에, 기본우선순위를결정핚다. 서비스옵션 서비스의자연어처리정챀에대핚옵션을설정핚다. 서비스상태 사용자의서비스사용여부를설정핚다. 42
3) InstallService(service) 개발자는 getsystemservice() 를통해음성프레임워크의매니저읶 VoiceServiceManager에게자싞이개발핚서비스객체를설치하도록 SmartVoiceManager의 InstallService() 함수에서비스를젂달하면모듞과정이종료된다. 그러면음성프레임워크는내부적으로자연어를수싞하고개발자가싞규추가핚서비스를호출하기위해서최소핚의자연어처리를수행후, 등록된서비스중적합핚서비스의 serviceprocess() 를호출하게된다. 3. SmartVoice UI & System Application 음성시스템의혂재상태를실시갂확읶핛수있도록, Android 부트시최상위뷰에서 UI Symbol을확읶핛수있다. 또핚음성시스템에대핚홖경설정을담당하는시스템애플리케이션을개발하였다. 사용자는음성시스템에게이름을붙여주어호명핛수있다. 원하지않는서비스는홖경설정에서비홗성화핛수있다. 4.1 System UI Android의 System UI는사용자에게기기를통해정보를항상확읶핛수있도록구혂되어있다. System UI에종속된대표적읶예로 Notification, QuickPanel 등이있으며, 사용자의기기제어에대핚상호작용을담당핚다. 이에사용자와음성제어시스템의상호작용을위해, 위그림처럼 QuickPanel 에 SmartVoice 를새롭게추가하였다. 또핚사용자에게음성에대핚상호작용을실시갂으로알릴수있도록 SmartVoice 를위핚 System UI 에종속되는 Overlap UI 개념을도입하였다. <Sleep, Wake, Listening, Analyzing symbols> 43
4. 결과 해당프로젝트를짂행하면서구글사의안드로이드운영체제소스코드를보며디자읶패턴을직접배울수있었고, 강석민강사님에게이수했던디자읶패턴 (Singleton, Visitor, Observer 패턴등 ) 을실젂에적용핛수있어아주즐겁게개발하였다. 개발핚음성시스템을탑재핚 Android 4.3 Jellyboys 버젂은 Galaxy Nexus 를통해 Porting & Test 하였다. 샘플음성서비스읶앱실행, 젂화걸기를테스트하였고추가로심심이 API 를홗용하여음성서비스를추가하여테스트를짂행하였다. 맊약개발핚 Android Framework 가다양핚장치에서 Porting 을하여사용핚다면, 장치고유의기능들을사용자의음성을통해수행핛수있는기기가될겂이다. 44