# 뉴턴 역학과 물리 엔진

#### 뉴턴 역학의 기본 개념

뉴턴 역학은 물체의 운동을 질량, 힘, 가속도 사이의 관계를 설명하는 고전역학의 한 분야이다. 이는 주로 뉴턴의 세 가지 운동 법칙을 통해 다뤄진다.

**뉴턴의 제1법칙 (관성의 법칙)**

관성의 법칙은 내재된 힘이 가해지지 않는 한 정지하거나 균일한 속도로 운동하는 물체는 그 운동 상태를 유지한다는 것이다.

$$
\mathbf{F}\_{\text{net}} = 0 \implies \mathbf{v} = \text{constant}
$$

**뉴턴의 제2법칙 (운동의 법칙)**

운동의 법칙은 물체의 가속도가 물체에 작용하는 순수 힘에 비례하고, 물체의 질량에 반비례한다는 것이다. 이는 수식으로 다음과 같이 나타낼 수 있다.

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

여기서 $\mathbf{F}$는 힘, $m$은 질량, $\mathbf{a}$는 가속도이다.

**뉴턴의 제3법칙 (작용과 반작용 법칙)**

작용과 반작용 법칙은 모든 작용에는 크기가 같고 방향이 반대인 반작용이 있다는 것이다.

$$
\mathbf{F}*{\text{AB}} = -\mathbf{F}*{\text{BA}}
$$

여기서 $\mathbf{F}*{\text{AB}}$는 A가 B에 가하는 힘이고, $\mathbf{F}*{\text{BA}}$는 B가 A에 가하는 힘이다.

#### 물리 엔진 개요

물리 엔진은 뉴턴 역학을 계산하기 위한 소프트웨어로, 주로 게임, 시뮬레이션 및 애니메이션에 사용된다. 물리 엔진은 복잡한 물체 간의 물리적 상호작용을 계산하고 그 결과를 시뮬레이션한다.

**주요 구성 요소**

1. **다물체 동역학(Dynamics of Multibody Systems)**: 각 객체의 질량, 힘, 가속도 등을 고려하여 객체의 운동을 예측한다.
2. **충돌 감지(Collision Detection)**: 객체 간의 충돌을 감지하고, 충돌이 발생했을 때의 동작을 계산한다.
3. **힘과 토크 시뮬레이션(Force and Torque Simulation)**: 외부 힘과 토크가 객체에 미치는 영향을 시뮬레이션한다.
4. **구속(Constraints)**: 객체의 이동을 특정 방식으로 제한하는 구속 조건을 설정한다.

#### 운동 방정식의 수치 해법

운동 방정식을 풀기 위해 주로 수치적 방법을 사용한다. 가장 일반적인 수치적 방법은 오일러 방법과 룬게-쿠타 방법이다.

**오일러 방법**

오일러 방법은 다음 시간 단계의 값이 현재 값과 현재 시점에서의 변화량의 곱으로 계산되는 1차 방법이다.

$$
\mathbf{x}\_{n+1} = \mathbf{x}\_n + \mathbf{v}\_n \Delta t
$$

$$
\mathbf{v}\_{n+1} = \mathbf{v}\_n + \mathbf{a}\_n \Delta t
$$

여기서 $\mathbf{x}$는 위치, $\mathbf{v}$는 속도, $\mathbf{a}$는 가속도, $\Delta t$는 시간 변화이다.

**세미-임플리시트 오일러 방법**

세미-임플리시트 오일러 방법은 안정성을 높이기 위해 속도를 먼저 업데이트한 후 다음 시간 단계의 위치를 계산한다.

$$
\mathbf{v}\_{n+1} = \mathbf{v}\_n + \mathbf{a}\_n \Delta t
$$

$$
\mathbf{x}\_{n+1} = \mathbf{x}*n + \mathbf{v}*{n+1} \Delta t
$$

#### 충돌 감지와 반응

충돌 감지는 두 물체가 물리적으로 겹치는 시점을 찾아내는 과정이다. 이는 크게 두 단계로 나뉜다.

1. **좁은 단계(Narrow Phase)**: 물체 간의 세부 충돌을 확인한다.
2. **넓은 단계(Broad Phase)**: 충돌 가능성이 있는 물체 쌍을 찾는다.

충돌 반응은 충돌이 발생한 후 물체가 어떻게 반응하는지 결정하는 과정이다. 충돌 후 반응은 주로 임펄스 기반 방법으로 계산된다.

#### 임펄스 기반 충돌 반응

충돌 반응에서 임펄스는 매우 짧은 시간 동안 작용하는 큰 힘을 의미한다. 두 물체가 충돌할 때의 순간적인 속도 변화를 계산한다.

$$
\mathbf{J} = (1 + e) \frac{\mathbf{v}\_{\text{rel}} \cdot \mathbf{n}}{(1/m\_1 + 1/m\_2)}
$$

여기서 $\mathbf{J}$는 임펄스, $e$는 탄성 계수, $\mathbf{v}\_{\text{rel}}$은 상대 속도, $\mathbf{n}$은 충돌 평면의 법선 벡터, $m\_1$과 $m\_2$는 각 물체의 질량이다.

#### 물리 엔진의 최적화 기술

물리 엔진은 정확한 시뮬레이션을 제공하는 동시에 성능을 최적화해야 한다. 이를 위해 여러 가지 기술과 알고리즘이 사용된다.

**공간 분할 기법**

공간 분할 기법은 시뮬레이션 공간을 작은 부분으로 나누어 객체 간의 충돌 검사를 효율적으로 수행하는 데 사용된다. 가장 일반적인 기술로는 다음이 있다.

1. **쿼드트리(Quadtrees)**: 2차원 공간을 4개로 나누고, 각 부분을 재귀적으로 분할한다.
2. **옥트리(Octrees)**: 3차원 공간을 8개로 나누고, 각 부분을 재귀적으로 분할한다.
3. **격자(Grid)**: 정해진 크기의 격자로 공간을 분할하여, 각 셀에 있는 객체만 충돌 검사를 수행한다.

**떨어져 있는 객체의 최적화**

많은 객체가 존재하는 경우, 물리 엔진은 주로 일정 거리 이상 떨어져 있는 객체를 무시하는 기술을 사용한다. 이로 인해 객체 간의 상호작용을 효율적으로 무시할 수 있다.

* **Barnes-Hut 알고리즘**: 중력과 같은 역제곱 법칙을 따르는 힘의 계산에 주로 사용된다. 많은 객체들 간의 상호작용을 효율적으로 처리한다.
* **안전 거리 기준 삭감(N-Level pruning)**: 규명이 쉽지 않은 충돌 검사에서 사용되며, 효율적으로 충돌 가능성을 줄이다.

#### 고급 주제

**유연 물체의 시뮬레이션**

유연 물체 엔진은 힘이 가해질 때 형태가 바뀌는 물체를 시뮬레이션한다. 이를 위해 주로 고무 밴드 모델, 스프링-매스 시스템, 변형 텐서 등을 사용한다.

**유체 시뮬레이션**

유체의 시뮬레이션은 물리적 세계의 물리학을 복제하기 위해 복잡한 수학적 모델을 사용한다. 이에는 유한 차분법, 유한 요소법, SPH(Smoothed Particle Hydrodynamics) 등 다양한 방법이 사용된다.

**패브릭 시뮬레이션**

패브릭 시뮬레이션은 다양한 게임과 시뮬레이션에서 사용되며, 분자 동역학, 다체 문제 해법, 클로스팅(multibody problem-solving) 방법 등이 채택된다.

#### 물리 엔진의 사례

**Box2D**

Box2D는 2D 물리 엔진으로, 쿠퍼 노맨(Cupper Norman)이 개발하였다. 경량성과 성능을 중심으로 설계된 이 엔진은 주로 2D 게임에서 사용된다.

**Bullet**

Bullet은 3D 공간에서 물리적 상호작용을 시뮬레이션하는 오픈 소스 물리 엔진이다. 복잡한 충돌 검사와 다물체 역학을 지원한다.

***

물리 엔진은 현실 세계의 물리적 현상을 시뮬레이션하여 다양한 분야에서 사용된다. 뉴턴 역학의 기본 원리를 이해하고, 이를 기반으로 다양한 기술과 최적화를 적용하여 효율적이고 정확한 시뮬레이션을 구현할 수 있다.
