# 물리 객체 (Rigid Body와 Soft Body)

물리 엔진에서 물리 객체는 시뮬레이션의 기본 단위로, 일반적으로 Rigid Body(강체)와 Soft Body(연체)로 구분된다. 이 두 가지 유형의 객체는 물리 엔진 내에서 다르게 처리되며, 각각의 특성과 동작 방식에 차이가 있다.

#### Rigid Body (강체)

강체는 변형되지 않는 고체 객체로, 외부 힘이 작용해도 형태가 변하지 않는다. 강체 물리 시뮬레이션에서는 주로 다음과 같은 요소들을 다룬다.

* **질량 중심 (Center of Mass)**:
  * 강체의 모든 질량이 한 점에 집중된 것처럼 간주되는 점이다. $\mathbf{r}\_{cm}$로 나타낼 수 있다.
* **관성 모멘트 (Moment of Inertia)**:
  * 강체가 회전할 때의 저항 정도를 나타내는 값이다. 주로 $I$로 표시되며, 축 주위의 회전 저항을 수식으로 표현할 수 있다.

$$
I = \int\_V \rho(\mathbf{r}) (\mathbf{r} \cdot \mathbf{r}) , dV
$$

여기서 $\rho(\mathbf{r})$는 질량 밀도 분포, $\mathbf{r}$은 회전 중심으로부터의 거리이다.

* **선형 운동 (Linear Motion)**:
  * 강체의 선형 운동은 뉴턴의 제2운동 법칙에 따라 설명된다.

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

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

* **회전 운동 (Rotational Motion)**:
  * 강체의 회전 운동은 토크와 각가속도에 의해 설명된다.

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

여기서 $\mathbf{\tau}$는 토크, $I$는 관성 모멘트, $\mathbf{\alpha}$는 각가속도이다.

* **충돌 및 반발 (Collision and Response)**:
  * 강체는 충돌 시 기존의 운동량과 에너지와 기반한 물리 법칙을 따라 반발한다. 충돌 후의 속도는 주로 반사계수 $e$에 의해 결정된다.

$$
e = \frac{v\_{\text{후}} - u\_{\text{후}}}{v\_{\text{전}} - u\_{\text{전}}}
$$

여기서 $v$ 와 $u$는 각각 충돌 객체들의 속도를 나타낸다.

#### Soft Body (연체)

연체는 외부 힘에 의해 변형될 수 있는 객체로, 고무, 천, 젤리와 같은 유연한 물질들을 시뮬레이션하는 데 사용된다. 주로 다음과 같은 구성 요소들을 사용한다.

* **질량 스프링 모델 (Mass-Spring Model)**:
  * 질량 점과 이들을 연결하는 스프링으로 모델링된다. 각 스프링의 장력은 후크 법칙에 기초한다.

$$
\mathbf{F} = -k (\mathbf{x} - \mathbf{l})
$$

여기서 $k$는 스프링 상수, $\mathbf{x}$는 현재 길이, $\mathbf{l}$는 자연 길이이다.

* **유한 요소 분석 (Finite Element Analysis, FEA)**:
  * 연체의 물리적 동작을 더 정밀하게 모델링하기 위해 요소들로 나누어 스트레스와 스트레인을 계산한다.

$$
\sigma = C \cdot \epsilon
$$

여기서 $\sigma$는 스트레스, $\epsilon$은 스트레인, $C$는 물질의 성질을 나타내는 탄성 행렬이다.

* **파티클 시스템 (Particle System)**:
  * 각 질량 점을 개별 파티클로 처리하며, 파티클 간의 거리와 힘을 바탕으로 연체를 시뮬레이션한다.
* **충돌 처리 (Collision Handling)**:
  * 연체의 충돌 처리도 중요하다. 연체의 변형 특성을 반영하여 충돌 후의 상태를 계산해야 한다.

### 물리 엔진에서의 충돌 감지 (Collision Detection)

#### Broad Phase와 Narrow Phase

물리 엔진에서의 충돌 감지는 두 가지 주요 단계로 나뉜다: Broad Phase와 Narrow Phase.

1. **Broad Phase**:
   * 충돌 감지의 첫 번째 단계로, 가능한 충돌쌍을 신속하게 식별한다. 여기서 실제 충돌 여부를 판별하기보다는 잠재적인 충돌 객체를 좁히는 것이 목표이다.
   * **격자 기법 (Grid-based Methods)**:
     * 공간을 격자 단위로 나누어 각 객체를 해당하는 셀에 배치한다. 객체가 같은 셀 안에 있을 때만 충돌 여부를 확인한다.
   * **분할 공간 (Spatial Partitioning)**:
     * 공간을 계층적으로 분할하여 상위 노드에서 충돌 가능성을 필터링한 후 하위 노드로 내려가며 자세한 충돌 검사를 수행한다. 예시로는 쿼드트리(2D), 옥트리(3D) 등이 있다.
   * **스위핑과 프루닝 (Sweep and Prune)**:
     * 객체들을 특정 축을 기준으로 정렬하고, 중첩된 구간만을 추려내어 충돌 여부를 판단한다.
2. **Narrow Phase**:
   * Broad Phase에서 추려낸 객체들에 대해 실제로 충돌 감사를 수행한다.
   * **축 정렬 경계 상자 (AABB)**:
     * 객체를 둘러싸는 경계 상자를 사용하여 충돌을 감지한다. 상자의 좌표 축과 맞추어 정렬되기 때문에 계산이 간단하지만, 비효율적인 경우도 있다.
   * **OBB (Oriented Bounding Box)**:
     * 객체의 회전을 고려한 경계 상자이다. AABB에 비해 더 정확하지만 계산이 다소 복잡할 수 있다.
   * **Bounding Sphere**:
     * 객체를 둘러싸는 최소 크기의 구를 사용해 충돌 여부를 판단한다. 구는 방향에 관계없이 동일한 반지름을 가지므로 계산이 쉬운 편이다.

#### 충돌 해결 (Collision Resolution)

충돌을 감지한 후에는 이를 적절히 해결해야 한다. 다음은 일반적인 충돌 해결 방법들이다.

* **반사법 (Reflection)**:
  * 두 객체가 충돌한 후의 속도를 기존 속도의 반사계수에 따라 결정한다.

$$
\mathbf{v}*{\text{후}} = \mathbf{v}*{\text{전}} - (1 + e)(\mathbf{v}\_{\text{전}} \cdot \hat{\mathbf{n}}) \hat{\mathbf{n}}
$$

여기서 $e$는 반사계수, $\hat{\mathbf{n}}$은 충돌면의 법선 벡터이다.

* **임펄스 기반 방법 (Impulse-based Methods)**:
  * 충돌 시점에서의 바로캉 타이트에서 임펄스 $J$를 계산하여 속도를 조정한다.

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

여기서 $m$은 질량이다.

* **제약 기반 방법 (Constraint-based Methods)**:
  * 강체 간의 충돌을 수학적 제약 조건으로 표현하여 해결한다. 라그랑주 승수 등을 사용해 일정 조건 하에서 최적화 문제를 풀게 된다.
* **연체의 변형 및 복원력 (Deformable and Restorative Forces)**:
  * 연체의 경우 충돌 시 발생하는 변형을 고려하여 탄성 복원력 등을 적용해 물체의 동작을 시뮬레이션한다. 충돌 후의 변형 정도를 스트레인과 스트레스를 통해 계산할 수도 있다.

이와 같은 다양한 방법들이 물리 엔진에서의 충돌 감지 및 해결에 활용된다. 각각의 방법들은 상황에 따라 사용되며, 실제 응용에서는 여러 방법들을 결합해서 사용한다.
