1. 개요
물리 엔진이란, 게임 등에서 물체에 작용하는 물리적 현상, 즉 중력이나 관성 등에 관한 부분을 처리하는 프로그래밍 파트다.가장 대표적인 물리 엔진으로는 게임 엔진인 언리얼 엔진과 유니티 엔진에 기본 채용되고 있는 PhysX 엔진과 헤일로 시리즈 등 유명 게임에 쓰인 하복 물리 엔진이 있다.
게임에서만 쓰이는 건 아니고 영화 등의 3D 영상 분야에선 옛날부터 쓰였고, 겨울왕국에서 사용된 물리엔진과 자동차 설계에서의 가상 충돌실험도 물리 엔진을 사용한다고 볼 수 있다. 컴퓨터로 뉴턴 역학을 시뮬레이션하는 거야 아예 최초의 컴퓨터인 에니악이 탄도를 계산하기 위한 목적에서 만들어졌으니 그 역사는 매우 깊다고 할 수 있다.
게임에 있어서 (현대적인 의미의) 물리 엔진이 게이머들에게 널리 알려지게 된 계기는 하프라이프 2의 테크 데모였다. 물론 원시적인 충돌·탄도 계산 등은 그 이전 게임들에도 존재해왔고, 래그돌 등을 포함한 현대적인 물리 효과도 1998년 작인 트레스패서를 시작으로 여러 게임에서 먼저 선보이긴 했다. 하프라이프 2가 물리 엔진에 끼친 가장 큰 업적은 게임 내 대부분의 오브젝트에 물리 엔진을 도입한[1] 것이다.
초기에는 이 물리 엔진만 가속시키는 프로세서(PPU)가 따로 있었지만[2], 그래픽 카드와의 유사성과 비싼 가격 때문에 사장되고 그래픽 카드로 그 기능이 흡수되었다. 존 카맥은 이 물리 가속 카드에 대해서 매우 부정적인 전망을 내비친 적이 있다.
오픈소스계에도 물리 엔진이 좀 있다. 대표적인 것으로는 영화 2012에서 쓰였고 Blender라는 3D 프로그램에 내장되어 유명해진 불릿 엔진이다.
VR 게임에는 거의 반 필수적으로 들어가야 하는 엔진인데, 직접 물건을 잡고 던지고 상호작용하는 게임 특성상 물리 엔진이 없으면 굉장히 비현실적으로 보이기 때문이다.
인터넷 상에서 보면 현실에서 물리법칙을 무시한듯한 움직임을 보이는 운동괴수들을 가리켜 물리엔진이 에러났다는 식으로 표현하기도 한다.
MIT에서 진동수 분석을 통해 물리적 반응을 예측 및 시뮬레이션하는 기술을 개발했다. # 이 기술을 사용하면 현실의 물체와 가상의 물체가 맞부딪혔을 때 서로 어떻게 반응할지를 쉽게 알 수 있어 물리 효과를 시뮬레이션하는 비용을 혁신적으로 절감시킬 것이라 기대되고 있으나 현재까지 감감무소식.
2. 구조
물리 엔진의 파이프라인은 크게 광역 탐지, 지역 탐지, 해결 세 단계로 구성된다. 이렇게 구성되는 이유는 물리엔진의 주된 관점이 충돌현상을 어떻게 해결하는지 이기 때문이다.- 광역 탐지 단계 (Broad Phase)
그래픽 엔진과 유사한 알고리즘을 사용해 물리 엔진의 연산 부하를 줄여주는 단계이다. 광역 탐지가 특별히 중요한 이유는 충돌의 기본적인 속성이 쌍 기반 개념이기 때문이다. 간단하게 A와 B의 충돌을 검사하기 위해선 A와 B를 묶어 하나의 쌍으로 봐야 한다. 빅오 표기법으로 나타내면 O(N^2) 이다.
그래픽 엔진의 포워드 라이팅 기법이 O(M*N)이라 지양되고 O(M+N)인 디퍼드 라이팅이 채택되는것과 비교하면, 물리엔진의 충돌 검출은 상대적으로 2차 시간복잡도를 가진 비싼 비용의 알고리즘이다.
예를 들어 정해진 공간 안에 10개의 물체간에 충돌을 검사하기 위해서 10의 제곱인 100번의 계산이 있어야 하고, 중복을 줄인다 하더라도 45번의 연산이 필요하다.
이렇게 중복을 줄이고 충돌 가능성이 있는 쌍만 추리는 알고리즘을 구현하는게 광역 탐지 단계이다. - 사진 트리 (Quad Tree): 4개의 자식 노드를 가지는 트리를 말한다. 보통 높이를 제외한 평면을 4등분한다.
- 팔진 트리 (Octree): 8개의 자식 노드를 가지는 트리를 말한다. 보통 높이를 포함한 공간을 8등분한다.
- 격자 (Grid)
- BVH (Bounding Volume Hierarchy)
- Sweep and Prune
- 지역 탐지 단계 (Narrow Phase)
광역 탐지 단계에서 추린 충돌 쌍들에 실제로 충돌이 일어났는지, 충돌 해소를 위해 필요한 자세한 정보를 찾아내는 단계이다.
물리적으로 형태가 변화하지 않는 강체에 관한 강체 역학, 형태가 변화 하는 연체 역학 등등 각각의 역학적 해결을 위한 사전 처리를 한다.
실질적인 계산은 기하학적인 도형을 가지고 연산한다고 이해하면 쉽다. 결국 아무리 복잡한 도형이라도 잘게 쪼개서 최소 단위로 나누어 검사하기 때문이다.
간단하게 요약하면 두 도형이 교차하는지 수학적으로 참/거짓을 판별 한 후에 추가적인 계산을 통해 다음 단계에 사용할 데이터를 찾는것이다.
예를 들어 좌표상의 두 원이 겹치는지 판단하는것은 두 원 중심으로 간의 거리가 두 원의 반지름의 합보다 작다면 두 원은 서로 교차중인 상태이다. - 분리 축 이론 (Separating Axis Theorem)
- GJK 알고리즘 (Gilbert–Johnson–Keerthi Algorithm)
- 확장 폴리톱 알고리즘 (Expanding Polytope Algorithm)
- 해결 단계 (Resolution Phase)
지역 탐지를 마치고 물체가 교차중인 것이나, 물체가 접촉중인 것이나, 여러가지 힘 등등 각종 역학적인 효과들을 계산해 적용하는 단계가 해결 단계다.
실제로 뉴턴 역학이나 라그랑주 역학, 해밀턴 역학 등등 대학의 각종 역학, 물리 시간에 배운것을 적용하는 단계다.
물론 강체역학 뿐만 아니라 연체, 유체 등등 다른 물리학적 효과 역시 이 해결단계에서 모든걸 계산한다.
실제로 여러가지 역학적 방법을 통하거나, 혹은 눈속임으로 대충 때우는 방법 전부 다 해결 단계에 속한다.
중력, 마찰력, 인력, 항력, 탄성력 등등 실제 현실에서 볼수 있는 물리적 효과를 구현하거나 실제로 없는 가상의 물리효과 등등 굉장히 다양한 형태로 효과를 줄수 있다. 또 앞서 연산한 물체의 충돌 해결 역시 중요한 부분중 하나다. 특히 게임이든 시뮬레이션이든 필요한 종류의 물리를 택하는것이 가장 중요하다.
또한 해결 단계에선 수치해석학의 일부분인 수치적분법을 사용한다.
먼저 각 프레임의 위의 역학 정보들을 수집하고, 해당 데이터에 관한 미분방정식을 적분해 물체의 최종 속도, 최종 변위 등을 결정해 나간다. 물리 엔진의 경우 적분법의 정밀도에 따라 모사된 물리가 현실적으로 보일수도, 이상하게 보일수도 있기 때문에 적절한 수치적분법을 선택하는것도 중요한 요소중 하나다. 기상청의 기상 예측 모델에 슈퍼 컴퓨터가 필요한 이유가 이런것에 있다. - 물리 문제 해결 방법에 대한 주요 접근법
- 제약 기반 물리 (Constraints Base Physics): 현대의 물리엔진에서 사용하는 방식이다. 물리 엔진이 제약조건을 여러 프레임 동안 유지하며 제약조건의 수렴값에 도달할때까지 반복적인 연산을 통해 역학 문제를 해결한다. 주로 야코비안이라 부르는 야코비 행렬을 세우고, 그것을 풀어낸다.
- 충격 기반 물리 (Impulse Base Physics): 상대적으로 성능이 모자랐던 과거의 물리엔진에서 사용하는 방식이다. 제약조건이 존재하는것은 비슷하나 수렴될때까지 기다리는것이 아닌 한번에 연산해 버린다. 그로 인해 지터링을 비롯한 여러 문제가 발생할수 있다.
- 타일 물리 (Tile Physics): 슈퍼마리오를 비롯한 과거의 단순한 물리엔진에서 사용한 방식이다. 결과를 도출하는것이 엄청 간단한데다, 오히려 액션게임에 적합한 움직임을 보이기 때문에 현대에도 게임 기획 측면에서 일부러 사용하기도 한다.
- 물리엔진에서 주로 사용하는 수치적분법
자세한 사항은 수치해석학 문서 참조 - 명시적 오일러 적분법: 가장 간단한 적분법으로 빠르지만 에너지가 급격하게 증가하여 정확하지 않다.
- 반-암시적 오일러 적분법: 나름 에너지를 거의 보존하기 때문에 실시간 물리 엔진에 가장 널리쓰이는 수치적분법이다.
- 베를레 적분법: 스프링-댐퍼 모델 등에 널리 쓰이는 수치적분법이다.
- 중간점 적분법: 수정된/개조된 오일러 적분법으로도 알려진 적분법이다.
- RK2 적분법: 룽게-쿠타 2차 적분법이라고도 한다. 여기까지가 실시간 물리엔진에서 쓰이는 마지노선이다.
- RK4 적분법: 룽게-쿠타 4차 적분법이다. 실시간에는 적합하지 않다.
3. 물리 엔진 목록(가나다순)
- Algodoo
- Box2D
- CAKE 시리즈
- Chipmunk
- Euphoria
- ODE(Open Dynamic Engine)
- PhysX
- Prism3D(ets2 & ATS에 쓰인 그 물리엔진 맞다.)
- ReactPhysics3D[3]
- The Powder Toy
- 도미노 엔진[4]
- 루비콘[5]
- 레트로 엔진[6]
- 불릿 엔진
- 카오스[7]
- 하복 엔진
4. 게임 은어
캐릭터가 오브젝트에 충돌하거나 캐릭터들끼리 충돌하는 등의 상황이 발생했을 때, 혹은 일반적인 충격을 받았을 때 정상적인 수치 이상으로 심하게 튕겨나가거나 날아가는 현상을 언급할 때 자주 거론된다. 쉽게 말하자면 일종의 게임 버그인 셈. 보통 크레이지레이싱 카트라이더와 같은 레이싱 게임에서 많이 일어나지만 슈퍼 버니맨 같은 병맛 계열 게임 또는 물리 엔진을 자주 사용하는 스케이트 3 같은 게임에서는 심심치 않게 찾아볼 수 있다. 또한 완성도가 낮은 게임에서도 많이 보인다.[1] 하프라이프 2가 최초 공개된 2002년 당시까지만 해도 오브젝트는 이동하는 엔티티를 부여받은 것이 아닌 이상 물리적으로 고정되어있는 게 당연 시 되어있었다. 헌데 하프라이프 2는 이런 고정관념을 깨고 물리적인 오브젝트가 중력을 갖고 낙하하면서 밑에 있던 적을 깔아죽이는, 당시로서는 혁신적이면서 충공깽인 모습을 보여서 게이머들에게 충격을 줬다.[2] 거의 흑역사로 묻혔다. 왜냐하면 해당 카드를 사용하면 확실히 빨라지기는 하나 CPU로도 충분히 연산 시킬 수 있었으며 ageia를 NVIDIA가 먹고 자사의 그래픽 카드로 PPU의 역할을 가능하도록 드라이버를 내놨는데 동시대의 저가형 그래픽 카드보다도 연산이 훨씬 느렸다.[3] 2018년 비교적 근래에 출시 되었으며 심즈 모바일, 카카오톡에서 사용 중이다. (오픈소스 라이선스 목록에 포함)[4] 블리자드 엔터테인먼트가 개발한 자체 물리 엔진.[5] 소스 2 엔진에서 밸브가 하복 엔진 대신 개발한 자체 물리 엔진.[6] 크리스천 화이트헤드가 제작한 물리 엔진으로, 세가의 제작진들조차 포기한(클래식 소닉 당시 제작팀은 대부분이 퇴사했다) 클래식 소닉 특유의 물리현상을 완벽하게 재현하는 데 성공하여 세가의 찬사를 받았다. 실제로 이후 세가에서 만들어낸 모든 클래식 소닉 관련 소프트는 이 엔진을 사용한다. 현재 크리스천 화이트헤드는 소닉 매니아의 리드 프로그래머를 맡고 있다.[7] 언리얼 엔진 4, 5에서 에픽 게임즈가 언리얼 엔진 전용으로 개발한 언리얼 엔진의 기본 자체 물리엔진.