# 물체의 운동과 충돌

물체의 운동과 충돌은 물리 시뮬레이션의 기본 개념 중 하나이며, 동역학과 힘의 상호작용을 통해 현실세계의 물체 움직임을 컴퓨터로 모사한다. 이를 위해 뉴턴의 운동 법칙, 충돌 이론, 에너지 보존 법칙 등을 바탕으로 한다. 이번 섹션에서는 각각의 개념 및 이를 구현하는데 필요한 기본적인 수학적 공식들을 소개한다.

#### 뉴턴의 운동 법칙

물리 시뮬레이션에서 가장 기본이 되는 이론은 뉴턴의 운동 법칙이다. 이는 세 가지로 나누어진다.

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

먼저, 외부의 힘이 작용하지 않는 한, 물체는 계속해서 현재의 상태(정지 또는 일정한 속도)로 운동을 계속한다.

**제2법칙 (가속도의 법칙)**

어떤 물체에 힘이 가해지면, 그 물체는 그 힘에 비례하여 가속도가 생깁니다. 수식으로는 다음과 같이 표현된다:

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

여기서,

* $\mathbf{F}$는 힘 벡터
* $m$은 질량
* $\mathbf{a}$는 가속도 벡터이다.

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

모든 작용에는 그에 상응하는 반작용이 있다. 한 물체가 다른 물체에 힘을 가하면, 두 번째 물체는 첫 번째 물체에 크기가 같고 방향이 반대인 힘을 가한다.

#### 운동 방정식

뉴턴의 제2법칙을 이용하여 시간에 따른 물체의 운동을 예측할 수 있다. 만약 $\mathbf{F} = m\mathbf{a}$를 시간에 대하여 적분하면, 위치 $\mathbf{x}$와 속도 $\mathbf{v}$를 구할 수 있다.

속도와 가속도의 관계:

$$
\mathbf{v}(t) = \mathbf{v\_0} + \int\_0^t \mathbf{a} , dt
$$

위치와 속도의 관계:

$$
\mathbf{x}(t) = \mathbf{x\_0} + \int\_0^t \mathbf{v} , dt
$$

여기서,

* $\mathbf{v\_0}$와 $\mathbf{x\_0}$는 각각 초기 속도와 초기 위치이다.

#### 충돌

충돌은 두 물체가 서로 부딪히는 상황을 말하며, 이 때 물체의 운동은 급격하게 변한다. 충돌 문제를 해결하기 위해 여러 가지 기법이 있다. 여기서는 대표적인 충돌 처리 방법들을 다룬다.

**탄성 충돌**

탄성 충돌에서는 물체 간의 운동 에너지와 운동량이 모두 보존된다. 두 물체가 충돌 후 새로운 속도를 가지는 경우 다음 공식을 사용한다.

운동량 보존:

$$
m\_1 \mathbf{v\_1} + m\_2 \mathbf{v\_2} = m\_1 \mathbf{v\_1'} + m\_2 \mathbf{v\_2'}
$$

운동 에너지 보존:

$$
\frac{1}{2} m\_1 \mathbf{v\_1}^2 + \frac{1}{2} m\_2 \mathbf{v\_2}^2 = \frac{1}{2} m\_1 \mathbf{v\_1'}^2 + \frac{1}{2} m\_2 \mathbf{v\_2'}^2
$$

여기서,

* $m\_1, m\_2$는 충돌하는 두 물체의 질량,
* $\mathbf{v\_1}, \mathbf{v\_2}$는 충돌 전의 속도,
* $\mathbf{v\_1'}, \mathbf{v\_2'}$는 충돌 후의 속도이다.

**비탄성 충돌**

비탄성 충돌에서는 운동량은 보존되지만, 운동 에너지는 보존되지 않는다. 일부 운동 에너지가 소리, 열 에너지 등으로 변환되기 때문이다. 특별히 완전 비탄성 충돌의 경우, 충돌 후 두 물체는 함께 움직이며 하나의 속도를 갖는다.

운동량 보존:

$$
m\_1 \mathbf{v\_1} + m\_2 \mathbf{v\_2} = (m\_1 + m\_2) \mathbf{v\_f}
$$

여기서, $\mathbf{v\_f}$는 충돌 후의 공동 속도이다.

**충돌 처리 알고리즘**

물리 엔진에서 충돌을 처리하기 위해 다양한 알고리즘이 적용된다. 여기서는 충돌 감지와 충돌 응답 두 가지 주요 단계로 나눌 수 있다.

1. **충돌 감지**: 충돌 감지는 시뮬레이션에서 물체들이 실제로 충돌했는지 여부를 인식하는 단계이다. 이 단계에서는 기본적인 충돌 판정 기법들이 사용된다.
   * **AABB 충돌 박스**: Axis-Aligned Bounding Box로, 물체를 둘러싸는 최소의 직육면체를 사용한다.
   * **OBB 충돌 박스**: Oriented Bounding Box로, 물체의 회전을 고려한 충돌 박스이다.
   * **사각형 간의 충돌**: Separating Axis Theorem(SAT)을 사용할 수 있다.
2. **충돌 응답**: 충돌 감지 후, 충돌한 물체들이 어떻게 반응할 것인가를 결정하는 단계이다.
   * **바운스 반응**: 탄성 충돌의 경우, 빠져나가려는 힘에 따라 물체가 반동하면서 튕겨나가는 방식이다.
   * **슬라이딩 반응**: 물체가 서로 미끄러지며 충돌 힘의 일부가 마찰로 변환되는 경우이다.
   * **정지 응답**: 두 물체가 충돌 후 서로 밀치는 힘이 발생하여 즉시 정지하는 경우이다.

#### 시뮬레이션의 안정성과 시간 단계

실제 물리 시뮬레이션에서는 시간의 흐름을 적절히 나누어 시뮬레이션하는 것이 중요하다. 이를 위해 시간 단계(time step)를 설정하고, 시뮬레이션의 안정성을 고려해야 한다.

**시간 단계 설정**

시간 단위가 너무 길면 충돌이나 운동의 변화가 부정확해질 수 있으며, 너무 짧으면 계산량이 급격히 증가할 수 있다. 일반적으로 물리 시뮬레이션에서는 일정한 시간 단위를 사용하며, 이를 '프레임 타임'이라고 한다.

```python
dt = 0.016  # 약 60프레임(60Hz)을 위한 시간 단계
while simulating:
    update_physics(dt)
```

**안정성 고려**

시간 단계가 너무 긴 경우, 물체의 움직임을 예측하는 것이 어렵기 때문에 시뮬레이션이 불안정해질 수 있다. 이를 해결하기 위해 다양한 수치적 기법(numerical methods)이 활용된다.

* **유러 방법(Euler Method)**: 간단하지만 불안정성 이슈가 있을 수 있다.
* **룬게-쿠타 방법(Runge-Kutta Method)**: 보다 정확한 예측을 위한 방법이다.
* **폭포 방법(Implict Method)**: 폭발적 현상을 방지하기 위해 사용된다.
