top of page
33.jpg
55.jpg

KAIST부설 한국과학영재학교 온라인 과학매거진 코스모스

  • 블랙 페이스 북 아이콘
  • 블랙 인스 타 그램 아이콘

게임의 심장, 게임엔진

최종 수정일: 2020년 9월 12일

게임엔진의 진화

게임 엔진은 게임 세계에서 일어날 수 있는 수많은 시나리오들을 미리 짜놓은 컴퓨터 프로그램을 말한다. 여러 가지 조건과 명령어들을 소스코드로 프로그래밍해놓으면 사용자가 어떤 행동을 취하느냐에 따라 적합한 이미지를 보여주거나 사운드를 들려준다. 과거 ‘갤러그’ 같은 2D 고전게임은 알고리즘이 단순하여 개발자가 직접 소스코드를 만들었지만 최근 복잡한 연산을 필요로 하는 3D게임이 등장하면서 대부분 게임엔진을 사용하고 있다.


게임 엔진에는 캐릭터와 캐릭터, 또는 캐릭터와 사물간 충돌을 보여주는 ‘충돌 시스템’, 충돌 후 반응이나 움직임, 관성 같은 물리법칙을 구현하는 ‘물리 엔진’과 3D구조를 실감나게 보여주는 ‘렌더링 엔진’, 캐릭터가 살아 움직이듯 자연스럽게 움직이는 ‘애니메이션 엔진’, 게임 속 이미지가 움직일 때 적당한 소리를 들려주는 ‘사운드 엔진’ 등이 있다. 즉, 게임엔진은 게임의 세계를 만들어주는 알고리즘의 라이브러리이다.


가장 대표적인 물리 엔진으로는 게임 엔진인 언리얼 엔진과 유니티 엔진에 기본 채용되고 있는 PhysX 엔진과 헤일로 시리즈 등 유명 게임에 쓰인 하복 물리 엔진이 있다. 게임에 있어서 현대적인 의미의 물리 엔진이 게이머들에게 널리 알려지게 된 계기는 하프 라이프 2의 테크 데모였다. 물론 원시적인 충돌·탄도 계산 등은 그 이전 게임들에도 존재해왔고, 래그돌 등을 포함한 현대적인 물리 효과도 1998년 작인 트레스패서를 시작으로 여러 게임에서 먼저 선보이긴 했다. 하지만 하프 라이프 2가 물리 엔진에 끼친 가장 큰 업적은 게임 내 대부분의 오브젝트에 물리 엔진을 도입한 것이다.


하프라이프2가 최초 공개된 2002년 당시까지만 해도 오브젝트는 이동하는 엔티티를 부여받은 것이 아닌 이상 물리적으로 고정되어있는 게 당연시되어있었다. 하지만 하프라이프2는 이런 고정관념을 깨고 물리적인 오브젝트가 중력을 갖고 낙하하면서 밑에 있던 적을 깔아죽이는, 당시로서는 혁신적인 모습으로 게이머들에게 충격을 줬다.

게임 물리엔진 속 운동

게임 물리 엔진을 기본적으로 고전역학을 다룬다. 고전역학은 물체에 작용하는 힘과 운동의 관계를 설명한다. 즉, 물리엔진은 게임 속 물체에 힘이 작용했을 때 물체의 운동을 시뮬레이션하는 역할을 한다. 물체에는 형태가 고정되어 변하지 않은 강체(Rigid Body)와 형태가 변형되는 연체(Soft Body)가 있는데, 물리엔진에서는 대부분 강체만 다룬다.


강체의 운동은 크게 병진 운동(Translational Motion)과 회전 운동(Rotational Motion)으로 나뉜다. 병진 운동은 강체의 모든 부분이 한 방향으로 움직이는 것이다. 병진 운동의 결과로 물체의 위치가 변하게 된다. 물체가 얼마나 빠르게, 또 어떤 방향으로 이동하는지 나타내는 물리량이 속도, 시간에 따라 속도가 변하는 정도를 나타내는 물리량이 가속도이다.


회전 운동은 어떠한 기준 축을 중심으로 물체가 도는 운동이다. 병진운동으로 물체의 위치가 변하듯 회전운동을 통해서 물체의 각도가 변한다. 속도와 마찬가지로 물체의 각도가 얼마나 빠르게 변했는지를 나타내는 물리량이 각속도, 각속도가 얼마나 빠르게 변하는지를 나타내는 물리량은 각가속도이다.


이제 힘과 회전운동의 관계를 살펴보면 회전운동에서 물체를 회전시키게 하는 힘은 토크이며 뉴턴의 운동 2법칙과 형태와 비슷하게 이는 관성 모멘트와 각가속도의 곱으로 나타낼 수 있다. 관성 모멘트는 물체를 이루는 입자들의 질량과 회전축과의 거리 제곱의 합이다. 관성 모멘트는 질량과 같이 단일 수치로 나타낼 수 없고 회전축에 따라서 달라진다. 회전축을 특정하면 단 하나의 값이 나오지만 회전축은 임의로 잡는 것이 가능하다. 모든 관성 모멘트의 값을 관성 텐서(Inertia tensor)라는 행렬에 넣는 것이 가능하다. 3차원 공간에서 강체의 관성 텐서는 3*3 행렬이며 대각선 방향 원소는 X축, Y축, Z축을 중심으로 회전할 때의 관성 모멘트이며, 나머지 부분은 관성곱이다.


이제 강체의 운동을 계산하는 함수 Integrate를 살펴보면 다음과 같다.


여기까지가 힘에 의한 강체의 운동이었다. 하지만 강체에 작용하는 물리적 현상이 모두 외력인 것은 아니다. 서로 다른 두 물체가 서로의 운동에 간섭하는 충돌이 일어날 수도 있다.


운동량 보존 법칙에 의해 외력이 없다면 물체의 총 운동량은 변화하지 않으며, 두 물체가 충돌할 때 운동량의 합은 일정하다. 물체의 충돌 전후 상대속도의 비율은 반발계수라고 한다. 반발계수는 0에서 1 사이의 값을 가지며 0일 경우 완전 비탄성 충돌, 1일 경우 탄성 충돌, 그 이외에는 비탄성 충돌을 한다. 충격량(Impulse)은 정해진 시간 동안 운동량이 변화한 정도를 나타내는 물리량이다. 그리고 시간에 대해 힘이 일정하다면 힘과 시간의 곱으로도 나타낼 수 있다. 충격량 또한 각 충격량이 있으며 앞선 방식과 비슷하게 질량은 관성 모멘트로, 속도는 각속도로, 가속도는 각가속도로 변환하면 된다. (물리학 및 실험 1을 듣는 1학년도 배운 개념이므로 따로 수식을 적지는 않겠다)


충격량을 계산하기 위해서는 추가적으로 3가지의 정보를 계산해야 한다.


첫 번째는 contact normal, 충돌 점에서의 법선 벡터이며 두 번째는 contact point, 충돌점이다. 세 번째는 penetration, 관통 깊이이며 겹침 해소 과정에서 필요하고 충격량 계산에서는 사용하지 않는다. 이 정보를 토대로 단위 충격량당 속도의 변화, 요구되는 속도 변화량을 기반으로 발생해야 하는 충격량을 계산하고 충격량을 선 성분과 각 성분으로 분리하여 이를 각각에 물체에 반영하면 된다.

물리엔진의 실사용

강체는 간단한 물리 법칙을 그대로 사용할 수 있으나, 물과 같은 유체는 미적분방정식을 그대로 사용하기 어렵다. 컴퓨터는 미적분방정식을 풀 때 사람처럼 간단한 공식을 외워서 하는 것이 아니라, 미적분을 유도하는 공식부터 연산 과정에 포함시키므로 시간이 훨씬 많이 걸린다. 그래서 사용할 때에는 복잡한 수식을 간소화시켜 사용하는 경우가 많다. 수식뿐만 아니라 숫자를 간소화하기도 하는데, 가령 중력가속도를 편의상 1로 설정할 수도 있는 것이다. 실제 세계와 완벽하게 같지는 않지만 비슷하게 만들기 위함이다. 이를테면, ‘마비노기영웅전’에서는 공기저항을 아예 없앤 대신, 떨어지는 물체의 최대속도를 지정하여 속도를 제한한다. 그래서 실제로 물체가 떨어지는 것처럼 보인다.


물리엔진은 게임에서만 필요한 것은 아니다. ‘트랜스포머’ 등과 같은 영화 특수효과에서도 물리 법칙 구현은 필수적이다. 그런데 영화 특수효과에서 사용되는 물리엔진과 게임 물리엔진 사이에는 차이점이 있다. 1초에 24장의 화면을 보여주는 영화에서 고품질 영상을 얻기 위해 한 화면을 만드는 데 많은 시간이 걸려도 이를 감수한다. 반면 게임은 그 자리에서 1초에 들어갈 30장 이상의 화면을 생성해야 한다. 따라서 복잡한 물리 공식을 30분의 1초마다 풀어내는 것은 어려운 일이다. 초기 물리엔진은 포탄 탄도 계산 등 간단한 기능만을 제공했으나 지속적으로 기능을 확장했다. 덕분에 지금은 약간 어색한 수준이나마 옷과 같은 변형체, 연기와 같은 유체도 처리할 수 있다. 이는 컴퓨터 하드웨어와 소프트웨어의 발달 덕분에 가능해졌다. 특히 눈부시게 진화하는 CPU와 그래픽 카드에 힘입은 바가 크다. 복잡한 변형체와 유체 등을 처리하는 이론은 이미 ‘캐러비안의 해적’ 등과 같은 영화의 특수효과 제작에 이용되고 있다. 또 최근 공개된 디즈니 실사 영화 ‘라이언킹’에서는 유니티 엔진으로 세트 및 기본 애니메이션을 생성하고, 배우의 목소리 연기를 디지털 캐릭터와 동기화했다.


물리엔진은 PC의 탄생과도 밀접한 관계가 있다. 최초의 컴퓨터 에니악(ENIAC)은 탄도 계산을 위해 개발 됐다. 수학자들이 지도와 각도기로 했던 탄도 계산을 에니악이 처리했다. 당시 에니악이 계산했던 탄도의 궤적은 이제 스마트폰으로도 쉽게 측정할 수 있는 수준이지만, 시간이 흘렀기 때문에 더 복잡한 계산을 해야하는 SW가 필요하게 되고, 이 SW를 물리엔진이 담당하고 있다. 1980년대부터 슈퍼컴퓨터가 등장해 대기와 해류, 날씨 등은 시뮬레이션되어 사용되었다. 오늘날 물리엔진은 더 영역이 넓어지고 있다. 제품을 만들 때 발생할 수 있는 일들을 SW로 시뮬레이션함으로써 오차와 비용을 줄이고, 개발 기간을 단축할 수 있다. 자동차 업체와 항공기 제작업체 경우 막대한 개발 비용을 줄이기 위해 이같은 방법을 쓰고 있다.


이처럼 궁극적으로 게임 엔진은 단순한 게임 제작 도구에 머물지 않고 하나의 콘텐츠 제작 ‘플랫폼’으로 진화하는 추세다. 많은 게임 개발자들이 처음엔 ‘게임이 좋아서, 직접 만들고 싶어서’ 게임 엔진을 접하고 개발자의 길을 걷게 됐다고 말한다. 그러나 이젠 게임 엔진을 배워서 게임만 만들 수 있는 게 아니다. 활용하기에 따라 훨씬 다양한 영역에서 유용하게 사용할 수 있는 환경이 마련되고 있다. 개발에 관심 있는 사람이라면 취미로 게임 엔진 하나 정도는 입문해 보는 것도 좋을 듯하다.


 

참고문헌

[1] https://www.slideshare.net/xtozero/game-physics-engine-development

[2] http://www.epnc.co.kr/news/articleView.html

[3] http://www.ndsl.kr/ndsl/search/detail


첨부 이미지 출처

[1] https://gameabout.com

 

KOSMOS PHYSICS 지식더하기

작성자│신연재

발행호│2020년 여름호

키워드 | #게임 #물리엔진



조회수 6,606회댓글 2개

최근 게시물

전체 보기
bottom of page