개요

물리 엔진에서 객체에 작용하는 힘은 기본적으로 두 가지 범주로 나눌 수 있다: 근력(Contact Forces)과 원거리 힘(Long-range Forces)이다. 이 두 가지 힘은 그 특성과 처리가 다르기 때문에 이를 구분하여 이해하는 것은 중요하다.

근력(Contact Forces)

근력은 객체들이 서로 직접 접촉하는 상황에서 발생하는 힘이다. 주로 충돌과 마찰, 지지력 등이 이에 해당한다.

충돌력

충돌은 두 물체가 서로 접촉하여 상대방의 경계를 넘으려고 시도할 때 발생하는 힘이다. 이를 처리하기 위해 동역학적 시스템에서는 보통 충돌을 감지하고 응력을 계산한다.

\mathbf{v}_A' = \mathbf{v}_A - \frac{2m_B}{m_A + m_B}(\mathbf{v}_A - \mathbf{v}_B) \cdot \mathbf{n}\mathbf{n}
\mathbf{v}_B' = \mathbf{v}_B + \frac{2m_A}{m_A + m_B}(\mathbf{v}_A - \mathbf{v}_B) \cdot \mathbf{n}\mathbf{n}

여기서, \mathbf{n}은 접촉 점에서의 표면 법선 벡터이다.

마찰력

마찰은 두 물체가 서로 접촉하면서 상대적인 이동을 하려고 할 때 발생하는 힘이다. 마찰력은 정지 마찰력과 운동 마찰력으로 나눌 수 있다.

정지 마찰력의 최대 값은 다음과 같이 정의된다:

F_{\text{정지}} = \mu_s N

여기서 \mu_s는 정지 마찰 계수, N은 접촉면에 작용하는 수직력이다.

운동 마찰력은 다음과 같다:

F_{\text{운동}} = \mu_k N

여기서 \mu_k는 운동 마찰 계수이다.

원거리 힘(Long-range Forces)

원거리 힘은 물체 간의 물리적 접촉 없이 발생하는 힘이다. 중력, 전자기력, 그리고 고전 역학의 많은 힘들이 이 범주에 들어간다.

중력

중력은 두 질량 간의 인력으로 설명되며, 이는 다음과 같이 계산된다:

\mathbf{F}_{\text{중력}} = G \frac{m_1 m_2}{|\mathbf{r}|^2} \hat{\mathbf{r}}

여기서 G는 중력 상수, m_1m_2는 두 물체의 질량, \mathbf{r}는 두 물체 사이의 거리 벡터, \hat{\mathbf{r}}는 거리 벡터의 단위 벡터이다.

전자기력

전자기력은 전하 사이의 상호 작용으로 발생하며 쿨롱의 법칙으로 표현된다:

\mathbf{F}_{\text{전자기}} = k_e \frac{q_1 q_2}{|\mathbf{r}|^2} \hat{\mathbf{r}}

여기서 k_e는 쿨롱 상수, q_1q_2는 두 전하량이다.

스프링 힘

스프링 힘은 후크의 법칙 (Hooke's Law)으로 표현되며, 스프링이 변형될 때 발생하는 복원력을 설명한다. 스프링 힘은 변형량에 비례하여 발생하며, 다음과 같이 표현된다:

\mathbf{F}_{\text{스프링}} = -k \mathbf{x}

여기서 k는 스프링 상수이며, \mathbf{x}는 변형 벡터(즉, 평형 위치에서의 변화량)이다.

특정 스프링 시스템에서는 감쇠력이 포함될 수도 있다. 감쇠력은 다음과 같이 표현된다:

\mathbf{F}_{\text{감쇠}} = -b \mathbf{v}

여기서 b는 감쇠 계수, \mathbf{v}는 속도이다. 두 힘을 합치면 결국 스프링 다이나믹스는 다음과 같이 표현될 수 있다:

\mathbf{F}_{\text{스프링 전체}} = -k \mathbf{x} - b \mathbf{v}

힘의 합력 계산

다양한 힘들이 물체에 작용할 경우, 이들을 벡터적으로 합하여 합력(Net Force) 를 계산한다. 각 힘은 벡터로 표현되며, 물체에 작용하는 모든 힘을 더하면 전체 합력을 얻을 수 있다:

\mathbf{F}_{\text{합력}} = \mathbf{F}_1 + \mathbf{F}_2 + \mathbf{F}_3 + \ldots

시간적 통합 (Time Integration)

물리 엔진에서 힘이 작용하는 동안 객체의 상태(위치와 속도) 변화를 계산하기 위해 시간적 통합 방법이 사용된다. 가장 일반적인 통합 방법으로는 오일러 방법(Euler Method), 상반 오일러 방법(Semi-implicit Euler Method), 그리고 룽게-쿠타 방법(Runge-Kutta Method) 등이 있다.

오일러 방법

오일러 방법은 가장 간단한 방법 중 하나로, 다음과 같이 작성된다:

\mathbf{v}(t + \Delta t) = \mathbf{v}(t) + \frac{\mathbf{F}_{\text{합력}}(t)}{m} \Delta t
\mathbf{x}(t + \Delta t) = \mathbf{x}(t) + \mathbf{v}(t) \Delta t

여기서 \mathbf{v}는 속도, \mathbf{x}는 위치, m은 물체의 질량, \mathbf{F}_{\text{합력}}는 합력이다.

상반 오일러 방법

상반 오일러 방법은 안정성을 더욱 향상시키기 위해 속도와 위치를 시간 간격 \Delta t로 교대로 업데이트한다.

\mathbf{v}(t + \Delta t) = \mathbf{v}(t) + \frac{\mathbf{F}_{\text{합력}}(t)}{m} \Delta t
\mathbf{x}(t + \Delta t) = \mathbf{x}(t) + \mathbf{v}(t + \Delta t) \Delta t

룽게-쿠타 방법

룽게-쿠타 4차 방법은 더욱 정확한 결과를 제공하는 고급 통합 방법이다. 이는 네 번의 중간 계산을 통해 높은 정확도를 유지한다.


근력과 원거리 힘을 다루는 것은 현실감 있고 정확한 물리 시뮬레이션을 만드는 데 매우 중요하다. 물리 엔진은 근력과 원거리 힘을 처리하여 객체의 운동을 시뮬레이션하며, 이를 통해 현실 세계의 다양한 현상을 시뮬레이션할 수 있다. 정확한 충돌 감지와 응력 계산, 그리고 적절한 시간적 통합 방법을 사용하면 더욱 정밀한 물리 엔진을 구현할 수 있다.