물리 엔진에서 물리 객체는 시뮬레이션의 기본 단위로, 일반적으로 Rigid Body(강체)와 Soft Body(연체)로 구분된다. 이 두 가지 유형의 객체는 물리 엔진 내에서 다르게 처리되며, 각각의 특성과 동작 방식에 차이가 있다.
Rigid Body (강체)
강체는 변형되지 않는 고체 객체로, 외부 힘이 작용해도 형태가 변하지 않는다. 강체 물리 시뮬레이션에서는 주로 다음과 같은 요소들을 다룬다.
- 질량 중심 (Center of Mass):
-
강체의 모든 질량이 한 점에 집중된 것처럼 간주되는 점이다. \mathbf{r}_{cm}로 나타낼 수 있다.
-
관성 모멘트 (Moment of Inertia):
- 강체가 회전할 때의 저항 정도를 나타내는 값이다. 주로 I로 표시되며, 축 주위의 회전 저항을 수식으로 표현할 수 있다.
여기서 \rho(\mathbf{r})는 질량 밀도 분포, \mathbf{r}은 회전 중심으로부터의 거리이다.
- 선형 운동 (Linear Motion):
- 강체의 선형 운동은 뉴턴의 제2운동 법칙에 따라 설명된다.
여기서 \mathbf{F}는 외력, m은 질량, \mathbf{a}는 가속도이다.
- 회전 운동 (Rotational Motion):
- 강체의 회전 운동은 토크와 각가속도에 의해 설명된다.
여기서 \mathbf{\tau}는 토크, I는 관성 모멘트, \mathbf{\alpha}는 각가속도이다.
- 충돌 및 반발 (Collision and Response):
- 강체는 충돌 시 기존의 운동량과 에너지와 기반한 물리 법칙을 따라 반발한다. 충돌 후의 속도는 주로 반사계수 e에 의해 결정된다.
여기서 v 와 u는 각각 충돌 객체들의 속도를 나타낸다.
Soft Body (연체)
연체는 외부 힘에 의해 변형될 수 있는 객체로, 고무, 천, 젤리와 같은 유연한 물질들을 시뮬레이션하는 데 사용된다. 주로 다음과 같은 구성 요소들을 사용한다.
- 질량 스프링 모델 (Mass-Spring Model):
- 질량 점과 이들을 연결하는 스프링으로 모델링된다. 각 스프링의 장력은 후크 법칙에 기초한다.
여기서 k는 스프링 상수, \mathbf{x}는 현재 길이, \mathbf{l}는 자연 길이이다.
- 유한 요소 분석 (Finite Element Analysis, FEA):
- 연체의 물리적 동작을 더 정밀하게 모델링하기 위해 요소들로 나누어 스트레스와 스트레인을 계산한다.
여기서 \sigma는 스트레스, \epsilon은 스트레인, C는 물질의 성질을 나타내는 탄성 행렬이다.
- 파티클 시스템 (Particle System):
-
각 질량 점을 개별 파티클로 처리하며, 파티클 간의 거리와 힘을 바탕으로 연체를 시뮬레이션한다.
-
충돌 처리 (Collision Handling):
- 연체의 충돌 처리도 중요하다. 연체의 변형 특성을 반영하여 충돌 후의 상태를 계산해야 한다.
물리 엔진에서의 충돌 감지 (Collision Detection)
Broad Phase와 Narrow Phase
물리 엔진에서의 충돌 감지는 두 가지 주요 단계로 나뉜다: Broad Phase와 Narrow Phase.
- Broad Phase:
- 충돌 감지의 첫 번째 단계로, 가능한 충돌쌍을 신속하게 식별한다. 여기서 실제 충돌 여부를 판별하기보다는 잠재적인 충돌 객체를 좁히는 것이 목표이다.
- 격자 기법 (Grid-based Methods):
- 공간을 격자 단위로 나누어 각 객체를 해당하는 셀에 배치한다. 객체가 같은 셀 안에 있을 때만 충돌 여부를 확인한다.
- 분할 공간 (Spatial Partitioning):
- 공간을 계층적으로 분할하여 상위 노드에서 충돌 가능성을 필터링한 후 하위 노드로 내려가며 자세한 충돌 검사를 수행한다. 예시로는 쿼드트리(2D), 옥트리(3D) 등이 있다.
-
스위핑과 프루닝 (Sweep and Prune):
- 객체들을 특정 축을 기준으로 정렬하고, 중첩된 구간만을 추려내어 충돌 여부를 판단한다.
-
Narrow Phase:
- Broad Phase에서 추려낸 객체들에 대해 실제로 충돌 감사를 수행한다.
- 축 정렬 경계 상자 (AABB):
- 객체를 둘러싸는 경계 상자를 사용하여 충돌을 감지한다. 상자의 좌표 축과 맞추어 정렬되기 때문에 계산이 간단하지만, 비효율적인 경우도 있다.
- OBB (Oriented Bounding Box):
- 객체의 회전을 고려한 경계 상자이다. AABB에 비해 더 정확하지만 계산이 다소 복잡할 수 있다.
- Bounding Sphere:
- 객체를 둘러싸는 최소 크기의 구를 사용해 충돌 여부를 판단한다. 구는 방향에 관계없이 동일한 반지름을 가지므로 계산이 쉬운 편이다.
충돌 해결 (Collision Resolution)
충돌을 감지한 후에는 이를 적절히 해결해야 한다. 다음은 일반적인 충돌 해결 방법들이다.
- 반사법 (Reflection):
- 두 객체가 충돌한 후의 속도를 기존 속도의 반사계수에 따라 결정한다.
여기서 e는 반사계수, \hat{\mathbf{n}}은 충돌면의 법선 벡터이다.
- 임펄스 기반 방법 (Impulse-based Methods):
- 충돌 시점에서의 바로캉 타이트에서 임펄스 J를 계산하여 속도를 조정한다.
여기서 m은 질량이다.
- 제약 기반 방법 (Constraint-based Methods):
-
강체 간의 충돌을 수학적 제약 조건으로 표현하여 해결한다. 라그랑주 승수 등을 사용해 일정 조건 하에서 최적화 문제를 풀게 된다.
-
연체의 변형 및 복원력 (Deformable and Restorative Forces):
- 연체의 경우 충돌 시 발생하는 변형을 고려하여 탄성 복원력 등을 적용해 물체의 동작을 시뮬레이션한다. 충돌 후의 변형 정도를 스트레인과 스트레스를 통해 계산할 수도 있다.
이와 같은 다양한 방법들이 물리 엔진에서의 충돌 감지 및 해결에 활용된다. 각각의 방법들은 상황에 따라 사용되며, 실제 응용에서는 여러 방법들을 결합해서 사용한다.