# 물리 엔진의 기본 구조

물리 엔진(physics engine)은 다양한 물리 법칙을 컴퓨터 시뮬레이션을 통해 구현하는 소프트웨어의 한 종류이다. 물리 엔진은 주로 게임, 영화, 가상 현실 등의 분야에서 현실감 있는 환경을 구현하기 위해 사용된다. 이 장에서는 물리 엔진의 기본 구조에 대해 설명한다.

#### 시스템 구성 요소

물리 엔진은 주로 다음과 같은 구성 요소로 이루어져 있다:

1. **리지드 바디 시뮬레이션**: 비탄성 충돌, 회전 운동, 병진 운동 등 강체(리지드 바디)의 운동을 시뮬레이션한다.
2. **충돌 감지와 반응**: 물체 간의 충돌을 감지하고 이에 따른 반응을 계산한다.
3. **연속 충돌 감지**: 하위 프레임 간의 충돌을 감지하여 고속 운동에서의 충돌 누락을 방지한다.
4. **제약 조건**: 조인트, 힌지 등 물리적 제약 조건을 계산하여 물체의 운동을 제한한다.
5. **소프트바디 시뮬레이션**: 유체, 천, 젤리 같은 비강체(소프트바디)의 운동을 시뮬레이션한다.
6. **외력 계산**: 중력, 마찰력 등 외력을 계산하여 물체의 운동에 반영한다.

#### 리지드 바디 시뮬레이션

리지드 바디 시뮬레이션에서는 물체를 변형되지 않는 강체로 간주하여 운동을 계산한다. 강체의 운동은 뉴턴의 운동 법칙과 회전 운동 방정식에 따라 계산된다.

**병진 운동**

뉴턴의 제2법칙에 따라, 물체의 병진 운동은 다음과 같이 계산된다:

$$
\mathbf{F} = m \mathbf{a}
$$

여기서,

* $\mathbf{F}$는 물체에 작용하는 총 외력이다.
* $m$은 물체의 질량이다.
* $\mathbf{a}$는 물체의 가속도이다.

가속도 $\mathbf{a}$를 시간에 대해 적분하면 속도 $\mathbf{v}$를 얻고, 다시 시간에 대해 적분하면 위치 $\mathbf{x}$를 얻는다.

**회전 운동**

회전 운동은 다음과 같은 회전 운동 방정식에 의해 설명된다:

$$
\mathbf{\tau} = \mathbf{I} \mathbf{\alpha}
$$

여기서,

* $\mathbf{\tau}$는 물체에 작용하는 총 토크이다.
* $\mathbf{I}$는 물체의 관성 텐서이다.
* $\mathbf{\alpha}$는 물체의 각가속도이다.

각가속도 $\mathbf{\alpha}$를 시간에 대해 적분하면 각속도 $\mathbf{\omega}$를 얻고, 다시 시간에 대해 적분하면 각도 $\mathbf{\theta}$를 얻는다.

#### 충돌 감지와 반응

충돌 감지는 물리 엔진의 핵심 기능 중 하나이다. 충돌 감지는 크게 넓은 단계(broad phase)와 좁은 단계(narrow phase)로 나눌 수 있다.

**넓은 단계**

넓은 단계에서는 충돌 가능성이 있는 물체 쌍을 찾아내는 작업을 수행한다. 이 단계에서는 주로 AABB(Axis-Aligned Bounding Box)를 사용하여 간단히 충돌 여부를 판정한다.

**좁은 단계**

좁은 단계에서는 실제 충돌 감지 알고리즘을 사용하여 정확히 충돌을 계산한다. 대표적인 충돌 감지 알고리즘으로는 GJK(Gilbert-Johnson-Keerthi) 알고리즘과 SAT(Separating Axis Theorem)가 있다.

충돌 반응에서는 두 물체의 속도와 충돌 후의 변위를 계산하고, 필요한 경우 반발력과 마찰력을 적용한다.

#### 연속 충돌 감지

연속 충돌 감지(CCD)는 물체가 하위 프레임 사이에서 고속으로 이동할 때 충돌을 놓치지 않도록 한다. 이를 위해 물체의 궤적을 추적하고, 각 프레임 간의 이동 경로 상에서 충돌 감지를 수행한다. 대표적인 방법으로는 스위핑 볼륨(swept volume)과 타임 오브 임팩트(Time of Impact, TOI) 계산 방법이 있다.

#### 제약 조건

제약 조건은 물체의 자유 운동을 제한하는 규칙을 정의한다. 제약 조건을 통해 물리적으로 믿을 만한 행동을 실현할 수 있으며, 대표적인 제약 조건으로는 조인트(joint)와 힌지(hinge) 등이 있다.

**조인트**

조인트는 두 개 이상의 물체를 연결하고, 상대적인 움직임을 제어한다. 여러 종류의 조인트가 있으며, 각 조인트는 고유한 제약 조건을 갖는다. 예를 들면,

* 힌지 조인트: 한 축을 중심으로 회전만을 허용한다.
* 볼 조인트: 세 축을 따라 자유롭게 회전할 수 있다.

**제약 해결**

제약 조건을 해결하기 위해서는 라그랑주 승수법이나 반복적인 방법이 사용된다. 이 과정에서 물체의 속도와 위치를 업데이트하여 제약 조건이 만족되도록 만든다.

#### 소프트바디 시뮬레이션

소프트바디 시뮬레이션에서는 물체가 변형될 수 있도록 한다. 소프트바디 시뮬레이션은 주로 천, 유체, 젤리 등 변형 가능한 물체를 모델링하는 데 사용된다. 대표적인 방법으로는 파티클 시스템(particle system), 스프링-댐퍼 네트워크(spring-damper network), 유한 요소법(finite element method, FEM)이 있다.

**파티클 시스템**

파티클 시스템에서는 물체를 다수의 파티클로 분할하고, 각 파티클 간의 상호작용을 시뮬레이션한다. 파티클은 물리 법칙에 따라 움직이며, 스프링-댐퍼 네트워크를 통해 연결된다.

**FEM**

유한 요소법(FEM)은 물체를 작은 요소로 분할하고, 각 요소의 변형을 계산하여 전체 물체의 변형을 예측한다. FEM은 정확한 시뮬레이션이 가능하지만 계산 량이 많아 고성능 컴퓨팅이 필요하다.

#### 외력 계산

외력은 물체의 운동에 다양한 영향을 미칠 수 있다. 외력 계산에서는 주로 다음과 같은 외력을 고려한다:

* **중력**: 모든 물체에 작용하는 기본적인 힘이다.
* **마찰력**: 접촉면 사이의 마찰을 통해 운동에 저항한다.
* **부력**: 유체 내에서는 물체에 부력이 작용해 가벼워지는 효과가 발생한다.
* **항력**: 유체 내에서 물체가 운동할 때 유체 저항을 받게 된다.

이 외력들은 물체의 운동 방정식에 포함되어 실제 운동을 계산하는 데 영향을 미친다.

***

물리 엔진의 기본 구조와 주요 구성 요소에 대해 설명되었다. 다음 장에서는 다양한 물리 엔진 구현 예제를 통해 실제로 이러한 개념들이 어떻게 적용되는지를 다루도록 하겠다.
