posted by 나무꾼! 2014. 12. 12. 10:56

물리 엔진?

물리 엔진은 일상 생활에서 접할수 있는 힘, 관성, 가속도, 중력, 마찰력 등의 물리 현상을 컴퓨터에서 실시간으로 시뮬레이션 해서 마치 현실과 같이 상호작용 하고 반응하는 물체를 표현하기 위해 개발 되었다. 물리 엔진이 보편화 됨으로써 기존의 게임들이 미리 정의된 패턴의 움직임만 가능했던 것과는 달리 동적인 상호작용이 가능해지면서 사물이나 캐릭터, 자동차 등을 좀 더 현실감 있게 표현 할 수 있게 되었다. 초기에 하복 물리 엔진을 적용했던 대표적인 게임인 하프라이프2(2014) 가 큰 성공을 거둔 이후 물리적인 요소가 게임 제작의 필수 요소로 자리 잡았고, 하복 물리 엔진은 Skyrim, Halo 4, Winning Eleven 2014, The last of us 등의 수많은 대작 타이틀에서 꾸준히 사용이 되고 있다. 게임 분야 이외에도 영화에서도 메트릭스, X-Men, 월드워Z 등의 영화에서 위험한 장면이나 대규모 재난 장면을 연출하기 위해 폭넓게 활용 되고 있다.

이번 장에서는 하복이 개발한 대표적인 물리 엔진인 '하복 물리 엔진Havok Physical Engine'에 대한 소개와 함께 프로젝트 아나키에 통합되어 제공되는 하복 물리 엔진의 사용 방법에 대해 알아볼 것이다. 이번 장에서 배울 내용은 다음과 같다.

  • 하복 물리 엔진의 기능 소개 및 동작 원리
  • 강체의 물리적 속성 다루기
  • 캐릭터 컨트롤러 사용하기
  • 제약 시스템 사용하기

하복 물리 엔진의 기능 소개 및 동작 원리

하복 물리 엔진에서는 제한된 하드웨어 에서 가능한 많은 수의 물리 오브젝트를 실시간으로 시뮬레이션 하기 위해 멀티 스레드 최적화 등의 다양한 최적화 기법을 사용하고 있고 안정적이면서도 사실적인 물리 시뮬레이션을 위한 강력한 Continuous Physics 기능을 탑재하고 있다.

또한 물리 기반의 게임 제작시 공통적으로 요구되는 기능들을 쉽고 빠르게 제작할 수 있도록 Character Controller , VehicleKit 와 같은 다양한 부가 기능을 제공하고 있으며

물리적인 속성을 툴을 통해 쉽게 설정 하고 내보내기 위한 3dsMax 와 Maya 플러그인 도구와 강력한 디버깅 기능 과 최적화를 위한 프로파일링 기능을 탑재한 비주얼 디버거Visual Debugger 라는 물리 디버깅 도구를 제공하고 있다.

하복 물리 엔진은 프로젝트 아나키에 기본적으로 통합되어 있기 때문에 vForge 툴을 통해 쉽게 사용해 볼 수 있다. 물론 좀 더 세밀하고 복잡한 동적인 상호작용을 제어해야 할 경우 하복 물리 엔진의 C++ API 를 직접 사용하는 것도 가능하다.

이번 절에서는 이러한 하복 물리 엔진의 핵심적인 역할과 기능에 대해 소개하고 동작 원리에 대해서도 간략히 설명하도록 하겠다.


1. 강체(Rigid Body) 시뮬레이션

물리 연산을 최대한 단순화 하기 위해 물리가 적용된 오브젝트를 형태가 절대로 변하지 않는 단단한 물체인 강체로 가정한다. 마찬가지로 지형도 역시 변형되지 않는다고 가정한다. 속도 최적화를 위해 실제 화면상에 보이는 형태Visual Geometry 대신 좀 더 단순한 물리 형태Physics shape를 사용하며 운동의 상태가 변할 가능성이 있는 물체를 따로 모아서 시뮬레이션 하기도 한다.

그림. [출처 : Havok Physics 매뉴얼]


2. 동역학(Dynamics) 시뮬레이션

힘에 의한 물체의 동적인 상태 변화를 시뮬레이션 한다. 물체의 운동을 좀 더 단순화하기 위해 바람이나 공기의 저항 같은 일부 속성을 비활성화 하기도 한다. 컴퓨터로 시뮬레이션하기 위해 물체의 운동 과정을 시간의 경과에 따라 미세한 프레임들로 나누어서 연산하는데, 물체의 다음 위치를 계산할 때 전체 운동과정이 아닌 바로 직전 프레임의 운동 상태만을 참조하기 때문에 계산 과정에서 발생할 수 있는 오차는 시간이 경과할수록 누적되게 된다. 물리 시뮬레이션의 이러한 오차를 줄이기 위해서는 화면에 표시되는 갱신 주기보다 더 세분화된 주기로 자주 연산을 해서 정밀도를 높여야만 한다. 예를 들어 화면을 60Hz 로 업데이트 하는 게임인 경우 물리 시뮬레이션은 보통 240Hz로 업데이트 하게 된다.

그림. [출처 : Havok Physics 매뉴얼]

 

 

3. 물리적인 속성(Physical Property)

강체의 다양한 물리적인 속성(질량, 탄성 계수, 마찰 계수 등)을 조절할 수 있다. 물리 법칙을 직접 컨트롤 할 수 있기 때문에 필요에 따라 중력을 증가시키거나 공기 저항, 바람 등의 일부 물리 속성을 생략할 수도 있다. 각각의 물리적인 속성을 다루는 방법에 대해서는 다음 절에서 예제와 함께 자세히 설명하도록 하겠다.

그림. [출처 : Havok Physics 매뉴얼]

 


4. 충돌 처리(Collision Detection)

물리가 적용된 오브젝트가 서로 충돌했는지 검사하기 위한 과정 으로 물리 엔진의 성능에 영향을 미치는 가장 중요한 요소이다. 게임상의 모든 오브젝트를 충돌 검사 하게 되면 실시간으로 연산하기가 거의 불가능에 가깝기 때문에 최적화를 위해서 세 단계를 거쳐서 충돌할 가능성이 있는 오브젝트만 선별해서 처리하게 된다. 하복 물리 엔진의 성능이 뛰어난 이유가 바로 이 최적화 과정에 남다른 노하우가 담겨져 있기 때문이다.

  1. Broadphase: 상세한 충돌 처리 단계로 넘어 가기 전 'AABB 연산'을 통해서 대부분의 오브젝트를 제거하는 과정이다.

     

그림. AABB 연산 [출처 : Havok Physics 매뉴얼]

 

  1. Midphase: 충돌 처리를 위한 연산의 복잡도를 낮추는 과정이다. 예를 들면 수천개의 폴리곤으로 이루어진 지형위로 공이 굴러 떨어질 때 공이 닿은 지면 근처에 있는 몇 개의 폴리곤만을 선별해서 연산하는 기능이 Midphase 에 해당 된다.

그림. [출처 : Havok Physics 매뉴얼]

 

  1. Narrowphase: 실제 두 오브젝트 간의 거리 계산을 통해 충돌 여부를 확인하게 된다. 주로 Narrowphase 에서의 오브젝트 쌍의 개수에 의해 성능이 좌우 되게 된다. 오브젝트의 물리적인 형태에 의해서도 성능의 차이가 발생 되는데 Spheres < Planes < boxes < polygons 순으로 연산의 복잡도가 증가한다.

그림. 빠른 연산을 위해서는 가능한 단순한 Shape을 사용해야 한다. [출처 : Havok Physics 매뉴얼]

 

5. 연속적인 충돌 처리 vs 이산적인 충돌 처리

하복 물리엔진의 특장점 중의 하나는 빠르면서도 안정적인 연속적인 물리Continuous Physics 시뮬레이션을 지원한다는 것이다. 연속적인 물리 시뮬레이션을 사용하면 이산적인 물리Discrete Physics 시뮬레이션에서 흔하게 발생되는 대표적인 현상으로 총알과 같이 빠르고 작은 강체가 얇은 종이를 충돌 없이 그냥 통과하는 문제bullet-though-paper problem 를 해결할 수 있다.

 

그림. 이산적인 물리Discrete Physics 시뮬레이션 의 한계 [출처 : Havok Physics 매뉴얼]

bullet-though-paper problem 파묻힘 문제 Penetration Problem

 

 

연속적인Continuous 충돌 처리는 연산의 복잡도가 이산적인Discrete 충돌 처리에 비해 기본적으로 높고

물리적으로 시뮬레이션 하기가 어려운 상황을 피해서 적절하게 사용하지 않으면 과도한 부하를 유발할 가능성이 있으므로 두가지 충돌 처리 방식의 기본적인 동작 원리에 대해 충분히 이해하고 사용해야 한다.

연속적인Continuous 충돌 처리 연산의 구현 방식을 간략히 설명하면 다음과 같다.

  1. 레이캐스팅RayCasting을 통해 충돌이 발생하는 시점인 TOI를 찾아낸다.
  2. 주어진 시간 주기를 더 작게 나누어서 TOI 까지만 먼저 시뮬레이션 한다.
  3. 충돌이 발생한 시점에 강체가 파묻혀 있을 경우를 위해 시간 주기를 나누어서 더 정확한 충돌 시점까지 다시 시뮬레이션 한다
  4. TOI 이후에 남은 시간 만큼 다시 시뮬레이션 한다. 이때, 추가적인 TOI가 발생되면 1~3 연산을 다시 반복한다.

 

그림. 연속적인Continuous 충돌 처리의 동작 과정 [출처 : Havok Physics 매뉴얼]

 

그림. 이산적인Discrete 충돌 처리의 동작 과정 [출처 : Havok Physics 매뉴얼]

 

 

연속적인 물리Continuous Physics 시뮬레이션을 사용할 경우 과부하가 발생되는 대표적인 상황으로

아래 그림과 같이 점점 좁아지는 두 개의 벽 사이에서 짧은 시간 안에 강체가 여러 번 부딪치게 되는 경우 벽이 좁아질수록 기하급수적으로 부하가 증가하게 된다.

하복 물리 엔진은 이러한 상황들에 대한 적절한 예외처리를 기본적으로 구현해 두었기 때문에 메모리 오버플로우Memory overflow 나 무한 루프Infinite loop로 인해 프로그램이 죽는 문제가 발생되지는 않는다. 하지만 가능하면 물리 시뮬레이션으로 해결이 불가능한 상황이 발생하지 않도록 디자인을 하는 것이 좋다.

 

그림. 짧은 시간안에 너무 많은 TOI가 반복되는 경우 [출처 : Havok Physics 매뉴얼]

 

 

연속적인 물리Continuous Physics 로 시뮬레이션 할 수 있는 오브젝트의 개수에는 하드웨어 성능상의 한계가 있기 때문에 연속적인 물리Continuous Physics 에 대해 충분히 이해하고 상황에 맞게 적절히 사용해야만 한다.

 

6. 제약 조건 (Constrained Dynamics)

제약조건Constrained 를 통해 두 개 이상의 강체를 연결하고 연결 부위의 회전 운동 또는 위치 운동의 자유도중 일부를 제한하면 회전문, 물레방아 등과 같은 다양한 형태의 구조물을 표현할 수 있다.

제약조건의 설정 방법은 다음절에서 예제와 함께 다시 설명하도록 하겠다

그림. 제약 조건의 사례 [출처 : Havok Physics 매뉴얼]


7. 랙돌 Ragdoll

랙돌이란 본래 '봉제 인형'을 뜻하는 말로, 제약 조건을 이용해서 인형의 관절과 유사하게 물리적으로 시뮬레이션 되도록 구성해서 캐릭터가 쓰러지는 모션을 좀 더 현실감 있게 만들어 주거나 외부의 힘에 의해 동적으로 반응하는 모션을 표현하기 위해 주로 사용된다. 랙돌의 설정방법은 다음 절에서 예제와 함께 다시 설명하도록 하겠다.

 

 

8. 물리 기반 차량 제작 도구VehicleKit

서스펜션에 의한 바퀴의 움직임 등 레이싱 게임에서 흔히 사용되는 차량의 물리적인 특성을 조절하기 위한 다양한 기능들을 제공하고 있고, 일반적인 차량 외에도 여러 개의 차량을 이어 붙인 기차, 동물에 의해 끌리는 마차, 그리고 궤도로 움직이는 탱크 등을 구현 하고자 할 경우에도 활용이 가능하다.

 

그림. VehicleKit을 활용해 제작된 MobileOffroad 샘플


9. 충돌 쿼리Collision Queries

물리 시뮬레이션과는 다르게 비동기적으로 쿼리 함수를 호출해서 결과값을 얻어낼 수 있다.

게임의 핵심 로직을 구현하기 위해 다양한 충돌 쿼리가 사용하게 되는데, 예를 들면 차량의 바퀴나 캐릭터의 발 부분이 지형 위에 붙어서 이동하도록 하기 위해서 또는 FPS 게임에서 타격 판정을 위해서 충돌 쿼리가 자주 활용 된다.

하복 물리 엔진은 강체 시뮬레이션의 성능뿐 아니라 충돌 쿼리의 성능에서도 매우 뛰어난 것으로 잘 알려져 있다. 강체 시뮬레이션을 적용하지 않는 게임이라고 해도 충돌 쿼리의 성능이 높으면 저사양에서도 게임을 좀 더 풍부하게 만들 수 있기 때문에 매우 중요한 요소 중 하나이다.

하복 물리 엔진에서 자주 사용되는 대표적인 충돌 쿼리에는 다음과 같은 것들이 있다

 

레이캐스팅RayCasting : 직선으로 광선을 쏘아서 물리 환경Physics World내에서 만나는 지점을 결과값으로 리턴 한다

선형캐스팅Linear Casting : 광선 대신 물리 형태Physics Shape 자체를 직선으로 이동시켜서 만나는 지점을 결과값으로 리턴 한다.

최단거리지점Get Closest Points : 입력 지점으로부터 가장 가까운 지점을 결과값으로 리턴한다.