이번에는 Narrow Phase의 마지막 단계인 Clipping에 대해 알아보자.
Clipping은 EPA에서 찾은 충돌 방향과 충돌 깊이를 바탕으로 충돌점(Contact Point)을 생성하는 방법이다.
초기에는 Clipping 없이 충돌당 1개의 충돌점만 계산했지만, Sphere 충돌과 달리 Box 충돌에서는 여러 개의 충돌점이 필요했다.
이를 해결하기 위해 Clipping 방식을 도입하여 다수의 충돌점을 구하는 방법으로 변경했다.
Clipping 과정을 글로 설명하려니 조금 복잡해 보일 수 있다.
쉽게 말해, EPA에서 구한 충돌 방향으로 충돌했을 경우 실제로 접촉했을 면과 점들을 찾아내는 과정이라 생각하면 된다.
Clipping 구현 코드가 궁금하다면, GitHub에서 findCollisionPoints() 함수를 확인해 보길 추천한다.
void Contact::evaluate(Manifold &manifold, const Transform &transformA, const Transform &transformB)
{
// ...
// GJK Start
bool isCollide = getGjkResult(convexA, convexB, simplexVector);
if (isCollide)
{
// EPA Start
EpaInfo epaInfo = getEpaResult(convexA, convexB, simplexVector);
if (epaInfo.distance == -1.0f)
{
return ;
}
std::vector<CollisionInfo> collisionInfoVector;
// Clipping Start
findCollisionPoints(convexA, convexB, collisionInfoVector, epaInfo, simplexVector);
// Create Manifold
generateManifolds(collisionInfoVector, manifold, m_fixtureA, m_fixtureB);
}
}
여기까지 Narrow Phase의 GJK(충돌 감지) -> EPA(충돌 거리, 충돌 방향 구하기) -> Clipping(충돌점 생성) 의 과정을 보았고, 마지막으로 Clipping의 결과로 생성된 충돌점의 정보를 Manifold에 저장해서 Solve 단계로 전달해 주면 Narrow Phase가 종료된다.
다음 글에서는 Solve 단계를 살펴볼 예정이다.
FT_Newton: Sphere 와 Box 충돌 - (9) (0) | 2025.01.16 |
---|---|
FT_Newton: Physics Loop의 마지막 단계 Solve - (8) (0) | 2025.01.16 |
FT_Newton: Narrow Phase / EPA - (6) (0) | 2025.01.15 |
FT_Newton: Narrow Phase / SAT vs GJK - (5) (0) | 2025.01.15 |
FT_Newton: 『게임 물리 엔진 개발』 vs Box2D - (4) (0) | 2025.01.15 |