구글 태그

2006년 3월 15일 수요일

물리 엔진

다음 글은 월간 게이머즈 2005년 9월호에 실렸던 내용입니다..

8월호에 들어간 Shader에 대한 내용은 자료도 많은데다 이미 알고 있던 내용을 알아보기 쉽도록 정리하는 수준이라 별 어려움이 없었지만, 물리엔진은 직접 써본 일도 없고 해서 꽤 난감했습니다.. 결국 공개 물리 엔진인 ODE와 상용인 NovodeX의 평가판을 받아다 돌려보고서야 대충 원고의 틀을 잡을 수 있었습니다.. 나름대로 꽤 노력해서 쓴 글인데, 개발자 대상의 잡지가 아니어서인지 아무런 피드백이 없더군요.. 그리고 이 글을 끝으로 '미래시대' 코너 자체가 없어졌습니다;; -_-;;

미래시대 (월간 게이머즈 2005년 9월호 수록 내용)
글 / 토끼털 두른 셋쇼마루님

Physics Engine
[물리 엔진]

게임 내의 오브젝트를 대상으로, 질량ㆍ속도ㆍ마찰ㆍ공기 저항 등의 수치를 이용하여 뉴턴 역학 모델을 시뮬레이트하는 프로그램을 통칭한다.

물리 엔진이란 무엇인가
최근의 게임계 기술에 관심이 있는 사람이라면, 근래에 들어 각광받기 시작한 '물리 엔진'이라는 고유명사를 들어본 일이 있을 것이다. 『하프라이프 2』나 『헤일로 2』에 현실적인 물리 연산을 위해 하복(Havok) 물리 엔진이 사용되었다더라는 등의 얘기를 들으며, 한번쯤은 물리 엔진이 과연 게임 내에서 어떤 기능을 하는 프로그램인지 궁금하게 여긴 사람도 있을지 모른다. 만약 이러한 궁금증을 느낀 적이 있다면, 이번 회에서 해답을 찾을 수 있을 것이다.

'물리 엔진(physics engine)'이라는 명칭을 바탕으로 생각해보면, 게임에 있어 물리 엔진이란 곧 '자연계의 물리 현상을 게임 내에서 흉내 내는(simulate) 프로그램'일 것이다. 그렇다면, 물리 엔진을 이용하여 어떤 종류의 물리 현상을 시뮬레이트하는 것일까?

CPU의 연산 능력에는 한계가 있으므로, 모든 물리 현상을 게임 내에서 완벽하게 구현하거나 범지구적인 거대한 자연계의 현상까지 시뮬레이트하는 것은 물론 불가능하다. 앞서 정의한대로, 물리 엔진은 다양한 변수에 기초하여 게임 내의 오브젝트의 운동에 뉴턴 역학(Newtonian mechanics; 주 1)을 적용하여 시뮬레이트하는 프로그램이다. 즉, 현재의 물리 엔진은 실시간으로 '게임 내'라는 국지적인 범위 안에서 뉴턴 역학 모델을 시뮬레이트하는 것이 주목적이다. 물리학의 발전에 따라 뉴턴 역학과 상대성 역학은 '고전 역학'이 되었고, 현재의 물리학에서는 양자역학(quantum mechanics)에 따라 복잡한 물리 현상을 설명하고 있지만, 우리 눈에 보이고 우리 주변의 생활 속에 있는 사물들의 운동은 일반적인 뉴턴 역학으로도 충분히 설명할 수 있다. 물리 엔진은 이러한 뉴턴 역학을 실시간으로 계산하여, 게임 내에서 다양한 오브젝트에 가해지는 힘과 운동 상태와의 관계를 계산하는 프로그램인 것이다.

하나의 게임 내에는 게임 논리, 렌더링 엔진(rendering engine), 네트워킹, 물리 엔진, 사용자 입력 처리 등의 수많은 프로그램이 결합되어 있다. 물리 엔진은 이중 게임 내부에 논리적으로 뉴턴 역학 공간을 구성하고, 이 공간 안에서 일어나는 물리 현상을 시뮬레이트하는 일을 하게 된다. 즉 물리 엔진은 논리적으로만 공간을 구성하기 때문에 물리 엔진이 연산한 움직임을 화면에 그려주는 작업은 다른 부분에서 맡아서 하게 되는데, 이 부분이 우리가 흔히 그래픽 엔진이라고 부르는 렌더링 엔진이 된다.

물리 엔진이 제공하는 기능
최근의 물리 엔진이 내세우는 가장 핵심적인 기능은 강체(剛體 rigid body)의 동역학(dynamics)과 충돌 검출(collision detection)이다. 이외에 부수적으로 입자(particle)나 파동(wave), 옷감(cloth), 래그돌(ragdoll) 등의 시뮬레이션을 지원하기도 한다. 이제부터 이들 각각에 대하여 알아보자.

강체의 동역학은 물리 엔진의 근간을 이루는 가장 중요한 학문이다. 강체란 외부에서 어떠한 힘을 가해도 모양과 크기가 절대로 변하지 않는 물체를 이르는 말로, 현실에서는 존재하지 않는 이상적인 물체이지만 물리 엔진 상의 시뮬레이션에서는 연산의 편이를 위해 각종 탈것이나 인체 등의 오브젝트를 모두 강체로 가정한다. 동역학이란 힘과 운동 상태와의 관계를 다루는 역학으로, 이를 응용하여 게임 내에서 등장하는 물체에 힘이 가해지는 현상이나 충돌 등을 시뮬레이트하여 다시 게임 내의 물체들의 상태에 반영하게 된다(주 2).

강체의 동역학을 시뮬레이트하기 위해, 물리 엔진은 강체ㆍ조인트ㆍ충돌ㆍ마찰 등을 구현하여 게임 제작자들이 사용하기 쉬운 형태로 제공한다. 게임 제작자는 물리 엔진이 지원하는 이러한 기능을 이용하여 흔들리는 다리, 밧줄, 로봇 팔, 탈것들, 인체 등의 다양한 오브젝트가 가진 물리적인 특성을 게임 내에서 효과적으로 구현할 수 있는 것이다.


그림 1 - 물리 엔진을 이용한 시뮬레이션

충돌 검출은 모든 게임이 필요로 하는 기본적인 기능이다. 물리 엔진이 논리적으로 공간을 구성하고 그 공간 안에서 일어나는 현상을 시뮬레이트하는 역할을 담당하기 때문에, 충돌 검출은 물리 엔진에서 도맡게 된다. 예를 들어 레이싱 게임에서 게이머의 차량이 경쟁자의 차량을 들이받아 차량이 파손되거나, 비행 시뮬레이션 게임에서 게이머의 기체가 지면에 추락하는 등의 상황에서는 강체의 기본적인 충돌 외에 다른 종류의 시뮬레이션이 필요하다. 이런 경우에 적절한 처리를 하기 위해 충돌 검출이 필요하게 된다.

입자ㆍ파동ㆍ옷감ㆍ래그돌 등은 모두 강체가 아닌 탓에 이들의 시뮬레이션은 강체의 동역학이라는 물리 엔진의 기본적인 개념에서는 벗어나 있다고 볼 수 있지만, 게임 상에서 현실감 있(어 보이)는 물리 현상을 표현하기 위해 물리 엔진에서 부수적으로 지원하는 기능들이다. 예를 들어, 입자는 눈이나 비, 불꽃, 화산재 등이 흩뿌려지는 현상을 나타내는데 사용되고, 파동은 물결, 옷감은 말 그대로 바람에 옷이나 깃발이 날리는 움직임 등을 나타내는데 필요하다.

래그돌(꼭두각시) 시뮬레이션은 최근의 FPS(First-person Shooter; 1인칭 슈팅) 장르에서 많이 사용되는 기능이다. 예를 들어 캐릭터가 총탄에 맞아 쓰러지는 경우, 넘어지는 동작을 모션 캡처 등의 전통적인 방법으로 제작할 경우 동작이 몇 가지로 한정될 수밖에 없어 게임을 장시간 플레이하는 게이머에게 어색한 느낌을 주게 된다. 이때 물리 엔진의 래그돌 시뮬레이션을 이용하면 게임 내의 상황과 조건에 따라 수많은 종류의 쓰러지는 동작을 실시간으로 연산하여 표현하게 되므로, 총탄에 맞아 쓰러질 때마다 다른 동작을 연출하는 캐릭터를 만들어낼 수 있는 것이다.


그림 2 - 래그돌 시뮬레이션의 예

물리 엔진의 작동 과정
예를 들어, 레이싱 게임을 만든다고 가정해 보자. 레이싱 게임 내에는 주행 과정에 영향을 미치는 요소로서 자동차ㆍ트랙ㆍ벽면ㆍ바람 등이 있고, 이외에 주행 과정에 크게 영향을 미치지는 않지만 현실적인 시각 표현을 위해 빠질 수 없는 요소인 배경 묘사가 있다. 이 모든 요소는 게임의 현실감을 위해 최대한도로 구현되어야 하지만, 자동차와 트랙 바닥, 벽면, 바람은 주행 과정에서 물리적으로 영향을 미치는 물체이므로 물리 엔진 상에서 구현되어야 하고, 렌더링 엔진은 물리 엔진 상에 구현된 요소 중 눈에 보이지 않으므로 그릴 필요가 없는 바람을 제외한 자동차ㆍ트랙 바닥ㆍ벽면과 (물리 엔진 상에는 구현되지 않았지만 시각적으로 필요한) 배경을 그리는 식으로 역할을 분담하게 된다. 게임 내에서 논리적으로 이 모든 것을 구현하면서 이와 같이 역할을 구분하여, 물리 연산이 필요한 물체는 물리 엔진을 활용하고 시각적인 표현이 요구되는 부분은 렌더링 엔진을 이용하도록 구성하면 레이싱 게임의 기본적인 뼈대가 이루어진다.

물리 엔진은 타임 스탬프를 통해 PC의 성능과는 관계없이 동일한 게임 플레이를 제공한다. 게임의 논리 부분에서는 물리 엔진에서 제공하는 인터페이스를 이용하여 논리적으로 물리 공간(역학 시스템)을 구성하고, 이 공간 안에서는 임의의 주기에 따라 타임 스탬프를 받는다. 타임 스탬프는 이전의 상태에서 얼마나 시간이 흘렀는지를 나타내 주는 데이터로, 이 데이터를 받은 물리 엔진은 시간이 경과한 만큼의 시뮬레이션을 통해 역학 시스템에 오브젝트의 다음 상태 변화를 전달한다. 예를 들어 레이싱 게임에서 차량이 벽면에 부딪히는 경우, 성능이 좋은 PC에서는 0.01초마다 물리 엔진에 타임 스탬프가 넘어가게 되어 0.01초가 지난 다음의 상태로 갱신되고, 성능이 떨어지는 PC에서는 0.1초마다 타임 스탬프가 넘어가 0.1초 이후의 상태로 바로 반영되어 갱신되는 식이 된다. 이런 방식을 통해 PC의 성능에 관계없이 게임 내에서 동일한 물리 효과를 반영할 수 있는 것이다.


그림 3 - 물리 엔진이 실제 게임에서 동작하는 흐름

종전에는 게임 개발사에서 게임 논리 외에 렌더링 기능과 물리 연산 기능 등의 여러 가지 구성 요소를 모두 직접 구현해야 했지만, 이러한 구성 요소들이 전문 개발사에 의해 독립적으로 개발되면서 렌더링 엔진과 물리 엔진 등이 이와 같이 각각의 전문적인 엔진으로 대체되어, 게임 개발사에서는 게임 개발시 게임 논리의 구현에만 개발력을 집중할 수 있게 되었다. 물론 이러한 변화의 근간에는 게임의 논리 자체가 점점 더 복잡해지면서, 다른 요소는 차치하고라도 게임의 논리만을 구현하는 일조차 어려워지고 있는 개발 현장에서의 현실적인 요인이 깔려있을 것이다.

지금까지 물리 엔진의 정의와 기능, 동작 방법을 알아보았다. 앞으로 물리 엔진은 PC 및 게임 콘솔의 성능이 발전함에 따라 더욱 정교해질 것이고, 아직까지 지원되지 않는 다양한 물리 모델이 지원되어 이제껏 체험해 보지 못한 풍부한 게임 플레이를 제공해 줄 것이다(주 3).



그림 4 - 지난 7월 22일 일본 도쿄에서 있었던 '플레이스테이션 미팅 2005' 행사에서 공개된 PS3의 테크니컬 데모의 한 장면. PS3가 표현할 수 있는 물리 시뮬레이션의 예시로서, 기본적인 강체 시뮬레이션이나 충돌 검출, 오브젝트 간의 상호작용 등은 물론 포탄의 탄도, 직물, 물보라, 수면의 움직임 등 다양한 물리 계산이 한꺼번에 구현될 수 있음을 보여주고 있다

(주 1) J. C. 맥스웰의 전자기론과 함께 고전물리학의 기초를 이룬다. 뉴턴은 만유인력과 몇 가지 운동법칙을 바탕으로 수학적인 방법을 사용하여 지구를 비롯한 여러 천체의 운동을 성공적으로 기술했다. 19세기 말까지는 그 근본원리가 모든 역학현상에 적용되는 것으로 여겨졌지만, 아인슈타인이 상대성이론을 확립하면서 뉴턴 역학에서 제시된 시간공간의 절대성 개념에 근본적인 변혁을 초래하였다. 또 원자분자의 현상이 분명해짐에 따라 그 적용범위도 제한되어, 오늘날 물체의 속도가 빛의 속도에 가까울 경우에는 상대성이론을, 미시적 세계에서는 양자역학을 각각 대신 적용하고 있다. 현재는 상대성역학에 상대되는 개념으로서 뉴턴의 법칙에 기초한 역학을 뉴턴 역학이라 하고, 상대성역학ㆍ뉴턴 역학 등 양자역학 이전의 역학을 고전역학이라 하기도 한다. (출처 : 네이버 백과사전)

(주 2) 물체의 운동의 시간적 변화는 물체에 작용하는 힘의 방향으로 일어나며 힘의 크기에 비례한다는 법칙을 '운동의 제 2법칙'이라 한다. 운동의 변화를 힘과 가속도로 나타내면, 'F(힘) = ma(질량 가속도)'가 된다. 즉, 물체에 힘이 작용할 때 물체는 그 힘에 비례하여 가속도를 받는다. 이때 비례상수를 질량이라 하며, 이 식을 '뉴턴의 운동방정식'이라 한다(출처 : 네이버 백과사전). 물리 엔진에서 시뮬레이션에 사용하는 각종 수식은 대부분 이 법칙에 근간을 두고 있다.

(주 3) 게임 엔진 시장에서 에픽 게임즈의 언리얼 엔진, 이드 소프트웨어의 퀘이크 엔진 등이 널리 알려져 있는 것처럼, 물리 엔진계에서는 하복 사의 하복 엔진과 AGEIA 사의 PhysX 엔진(일명 NovodeX) 등이 널리 채택되어 쓰이고 있다. 최근 SCE가 이 양대 물리엔진 제작사와 계약을 체결하고 PS3의 개발툴에 이들 엔진 라이브러리를 포함시킨다고 발표한 것은, 앞으로의 게임 제작에 있어 물리엔진의 역할과 비중이 더욱 늘어날 것임을 시사한다고 봐야 할 터이다.

댓글 없음:

댓글 쓰기