개요
물리 엔진에서 객체에 작용하는 힘은 기본적으로 두 가지 범주로 나눌 수 있다: 근력(Contact Forces)과 원거리 힘(Long-range Forces)이다. 이 두 가지 힘은 그 특성과 처리가 다르기 때문에 이를 구분하여 이해하는 것은 중요하다.
근력(Contact Forces)
근력은 객체들이 서로 직접 접촉하는 상황에서 발생하는 힘이다. 주로 충돌과 마찰, 지지력 등이 이에 해당한다.
충돌력
충돌은 두 물체가 서로 접촉하여 상대방의 경계를 넘으려고 시도할 때 발생하는 힘이다. 이를 처리하기 위해 동역학적 시스템에서는 보통 충돌을 감지하고 응력을 계산한다.
-
충돌 감지: 충돌을 감지하기 위해 가장 일반적으로 사용되는 방법은 AABB(Axis-Aligned Bounding Box)나 OBB(Oriented Bounding Box), 혹은 더 복잡한 구조를 사용하는 것이다.
-
충돌 응력 계산: 충돌 시 반작용력을 계산하여 충돌 후의 물체 속도를 조정한다. 예를 들어, 두 물체 \mathbf{A}와 \mathbf{B}가 충돌할 때, 충돌 전후의 속도는 다음과 같이 계산된다.
여기서, \mathbf{n}은 접촉 점에서의 표면 법선 벡터이다.
마찰력
마찰은 두 물체가 서로 접촉하면서 상대적인 이동을 하려고 할 때 발생하는 힘이다. 마찰력은 정지 마찰력과 운동 마찰력으로 나눌 수 있다.
- 정지 마찰력: 두 물체가 상대적으로 정지 되어 있을 때 적용
- 운동 마찰력: 두 물체가 상대적으로 운동할 때 적용
정지 마찰력의 최대 값은 다음과 같이 정의된다:
여기서 \mu_s는 정지 마찰 계수, N은 접촉면에 작용하는 수직력이다.
운동 마찰력은 다음과 같다:
여기서 \mu_k는 운동 마찰 계수이다.
원거리 힘(Long-range Forces)
원거리 힘은 물체 간의 물리적 접촉 없이 발생하는 힘이다. 중력, 전자기력, 그리고 고전 역학의 많은 힘들이 이 범주에 들어간다.
중력
중력은 두 질량 간의 인력으로 설명되며, 이는 다음과 같이 계산된다:
여기서 G는 중력 상수, m_1과 m_2는 두 물체의 질량, \mathbf{r}는 두 물체 사이의 거리 벡터, \hat{\mathbf{r}}는 거리 벡터의 단위 벡터이다.
전자기력
전자기력은 전하 사이의 상호 작용으로 발생하며 쿨롱의 법칙으로 표현된다:
여기서 k_e는 쿨롱 상수, q_1과 q_2는 두 전하량이다.
스프링 힘
스프링 힘은 후크의 법칙 (Hooke's Law)으로 표현되며, 스프링이 변형될 때 발생하는 복원력을 설명한다. 스프링 힘은 변형량에 비례하여 발생하며, 다음과 같이 표현된다:
여기서 k는 스프링 상수이며, \mathbf{x}는 변형 벡터(즉, 평형 위치에서의 변화량)이다.
특정 스프링 시스템에서는 감쇠력이 포함될 수도 있다. 감쇠력은 다음과 같이 표현된다:
여기서 b는 감쇠 계수, \mathbf{v}는 속도이다. 두 힘을 합치면 결국 스프링 다이나믹스는 다음과 같이 표현될 수 있다:
힘의 합력 계산
다양한 힘들이 물체에 작용할 경우, 이들을 벡터적으로 합하여 합력(Net Force) 를 계산한다. 각 힘은 벡터로 표현되며, 물체에 작용하는 모든 힘을 더하면 전체 합력을 얻을 수 있다:
시간적 통합 (Time Integration)
물리 엔진에서 힘이 작용하는 동안 객체의 상태(위치와 속도) 변화를 계산하기 위해 시간적 통합 방법이 사용된다. 가장 일반적인 통합 방법으로는 오일러 방법(Euler Method), 상반 오일러 방법(Semi-implicit Euler Method), 그리고 룽게-쿠타 방법(Runge-Kutta Method) 등이 있다.
오일러 방법
오일러 방법은 가장 간단한 방법 중 하나로, 다음과 같이 작성된다:
여기서 \mathbf{v}는 속도, \mathbf{x}는 위치, m은 물체의 질량, \mathbf{F}_{\text{합력}}는 합력이다.
상반 오일러 방법
상반 오일러 방법은 안정성을 더욱 향상시키기 위해 속도와 위치를 시간 간격 \Delta t로 교대로 업데이트한다.
룽게-쿠타 방법
룽게-쿠타 4차 방법은 더욱 정확한 결과를 제공하는 고급 통합 방법이다. 이는 네 번의 중간 계산을 통해 높은 정확도를 유지한다.
근력과 원거리 힘을 다루는 것은 현실감 있고 정확한 물리 시뮬레이션을 만드는 데 매우 중요하다. 물리 엔진은 근력과 원거리 힘을 처리하여 객체의 운동을 시뮬레이션하며, 이를 통해 현실 세계의 다양한 현상을 시뮬레이션할 수 있다. 정확한 충돌 감지와 응력 계산, 그리고 적절한 시간적 통합 방법을 사용하면 더욱 정밀한 물리 엔진을 구현할 수 있다.