# 충돌과 강체 반응

#### 충돌 감지

강체 시뮬레이션에서 충돌 감지는 두 가지 주요 방식에 의해 수행된다: \*브로드 페이즈(Broad Phase)\*와 *내로우 페이즈(Narrow Phase)*. 브로드 페이즈는 모든 가능성 있는 충돌 쌍을 빠르게 필터링하는 데 사용되며, 내로우 페이즈는 이들 가능한 쌍에 대해 구체적인 충돌 여부를 계산한다.

**충돌 감지 방법**

1. **AABB (Axis-Aligned Bounding Box)**
   * 각 물체를 둘러싸는 축과 평행한 사각형 또는 상자를 사용한다.
   * 간단하고 계산이 빠르지만, 정확도가 떨어질 수 있음.
2. **OBB (Oriented Bounding Box)**
   * 물체의 회전 상태에 따라 경계 상자가 정렬되는 방식.
   * 더 정확하지만 계산이 많아짐.
3. **Sphere/Bounding Volume Hierarchies (BVH)**
   * 구를 사용한 경계 볼륨이나 계층 구조를 활용하여 충돌을 감지한다.
   * 복잡한 모델에 대해 효율적임.

#### 충돌 반응

충돌로 인한 강체 반응은 주로 뉴턴의 운동 법칙과 보존 법칙에 의해 결정된다. 여기에는 선형 운동과 각 운동이 포함되며, 충돌 전후의 운동량과 에너지가 보존되어야 한다.

**충돌 전 후 속도 계산**

충돌 전후의 속도 계산은 다음의 수식으로 표현될 수 있다. 두 물체 $A$와 $B$가 충돌하는 경우:

$$
\mathbf{v}\_A' = \mathbf{v}\_A + \frac{2 m\_B}{m\_A + m\_B} \left( \mathbf{v}\_B - \mathbf{v}\_A \right) \cdot \mathbf{n} \mathbf{n}
$$

$$
\mathbf{v}\_B' = \mathbf{v}\_B + \frac{2 m\_A}{m\_A + m\_B} \left( \mathbf{v}\_A - \mathbf{v}\_B \right) \cdot \mathbf{n} \mathbf{n}
$$

여기서:

* $\mathbf{v}\_A, \mathbf{v}\_B$: 충돌 전의 각 물체의 속도
* $\mathbf{v}\_A', \mathbf{v}\_B'$: 충돌 후의 각 물체의 속도
* $m\_A, m\_B$: 각 물체의 질량
* $\mathbf{n}$: 충돌 면의 법선 벡터

**반발 계수 (Coefficient of Restitution)**

반발 계수 $e$는 충돌 후 물체의 속도와 관련된 에너지를 나타내는 값이다.

$$
\frac{\mathbf{v}\_B' - \mathbf{v}\_A'}{\mathbf{v}\_A - \mathbf{v}\_B} = -e \cdot \mathbf{n}
$$

계수 $e$의 값은 다음과 같은 범위를 갖는다:

* $0 \le e \le 1$
  * $e = 1$: 완전탄성 충돌 (충돌 전후의 속도 변화 없음)
  * $e = 0$: 비탄성 충돌 (충격으로 인해 물체가 붙는 경우)

#### 각 운동 고려

강체의 각 운동을 고려하면, 충돌에 의해 생성되는 토크와 회전 운동량의 변화도 계산해야 한다.

$$
\mathbf{L} = \mathbf{r} \times \mathbf{p}
$$

여기서:

* $\mathbf{L}$: 각 운동량
* $\mathbf{r}$: 회전 중심에서 충돌 지점까지의 벡터
* $\mathbf{p}$: 충격 인자

#### 임펄스 (Impulse)

임펄스를 통해 물체에 전달되는 순간적인 힘을 계산하는 방식도 중요하다. 임펄스 $J$는 다음과 같이 계산된다:

$$
\mathbf{J} = m \cdot \Delta \mathbf{v}
$$

$$
\Delta \mathbf{v} = \frac{ \mathbf{v}\_B - \mathbf{v}\_A }{1/m\_A + 1/m\_B}
$$

$$
\mathbf{v}\_A' = \mathbf{v}\_A + \mathbf{J} / m\_A
$$

$$
\mathbf{v}\_B' = \mathbf{v}\_B - \mathbf{J} / m\_B
$$

#### 정리

충돌과 강체 반응을 시뮬레이션하려면 정확한 수식과 물리 법칙을 적용하여 물체의 충돌 전후 운동 상태를 계산해야 한다. 시뮬레이션의 정확도와 효율성은 충돌 감지와 반응 계산의 정확성과 효율성에 달려 있다.

### 물리 기반 시뮬레이션의 응용

#### 캐릭터 애니메이션

물리 기반 시뮬레이션은 게임과 영화에서 캐릭터 애니메이션을 현실적으로 만들기 위해 이용된다. 물리 엔진은 캐릭터의 움직임을 자연스럽고 물리적으로 정확하게 만드는데, 이는 다음의 요소들을 포함한다:

1. **골격 애니메이션 (Skeletal Animation)**
   * 캐릭터의 뼈대를 만들고 각 뼈대에 회전 및 이동 변환을 적용하여 애니메이션을 생성한다.
2. **지형 및 장애물 상호작용**
   * 캐릭터가 지형이나 장애물과 상호작용할 때, 충돌 감지 및 반응 시스템을 사용하여 자연스러운 동작을 구현한다.

#### 차량 시뮬레이션

자동차, 비행기, 배 등의 차량을 시뮬레이션하는 것은 복잡한 물리 계산을 필요로 한다. 다음과 같은 요소들을 고려해야 한다:

1. **차량 다이나믹스**
   * 차량의 운동 방정식을 사용하여 속도, 가속도, 핸들링 등을 계산한다.
2. **바퀴 및 서스펜션 시스템**
   * 바퀴의 마찰력, 서스펜션의 강성 및 댐핑 특성을 시뮬레이션하여 차량의 움직임을 더욱 사실적으로 만든다.
3. **공기 역학**
   * 고속 차량의 경우 공기 저항을 비롯한 공기 역학적인 힘을 계산한다.

#### 유체 시뮬레이션

물, 화염, 연기 등 다양한 유체의 거동을 시뮬레이션하는 기술은 시각적 효과를 극대화하는 데 매우 중요하다. 주요 기법으로는:

1. **입자 기반 시뮬레이션**
   * 입자 시스템을 사용하여 유체의 자유로운 움직임을 시뮬레이션한다. 각 입자는 개별적인 물리 법칙을 따른다.
2. **레벨 세트 방법 (Level Set Method)**
   * 연속적인 유체 표면을 표시하기 위해 레벨 세트 기법을 사용한다.
3. **나비스-스톡스 방정식 (Navier-Stokes Equations)**
   * 유체의 운동을 기술하는 기본 방정식을 사용하여 정확한 유체의 흐름을 계산한다.

#### 활용의 예

**게임 및 영화 제작**

현대의 많은 비디오 게임과 영화는 사실적인 물리적 상호작용을 제공하기 위해 물리 엔진을 사용한다. 예를 들어:

* **게임**에서는 캐릭터의 자연스러운 동작과 상호작용, 파괴 가능한 환경, 차량 운전 등이 모두 물리 기반 시뮬레이션을 통해 구현된다.
* **영화**에서는 물리 엔진을 사용하여 현실감 있는 물리적 효과(예: 폭발, 파괴, 유체의 움직임 등)을 생성한다.

**가상 현실 및 증강 현실**

가상 현실(VR)과 증강 현실(AR)은 사용자의 몰입도를 극대화하기 위해 현실적인 물리적 상호작용을 필요로 한다. 물리 엔진은 다음과 같은 부분에서 중요한 역할을 한다:

1. **객체 상호작용**
   * 사용자가 가상 환경 내에서 물체를 집거나 던질 때, 물체의 물리적 특성과 상호작용을 정확히 시뮬레이션한다.
2. **실감 나는 환경**
   * 사용자 주위의 가상 환경이 실제 물리 법칙에 맞게 반응하여 몰입감을 제공한다.

***

물리 기반 시뮬레이션은 다양한 분야에서 필수적인 도구로 사용된다. 게임과 영화뿐만 아니라, 교육, 과학 연구, 의료 시뮬레이션, 엔지니어링 등에서도 중요한 역할을 한다. 물리 엔진의 발전은 이러한 시뮬레이션의 정확성과 현실감을 지속적으로 높이고 있다.
