Advanced soft-bodies for games with the Rapier physics engine
Rapier 물리 엔진의 게임용 고급 소프트 바디
Rapier 0.36.0에 천, 젤리, 로프 같은 변형체를 시뮬레이션하는 기능이 추가됐습니다. 글은 형상 매칭, 스프링 제약, 유한요소법(FEM)의 선택 기준과 비정상적인 관통·자기 교차를 다루는 방법, 조인트와 스키닝을 위한 구조를 설명합니다.
- 주제
AI 요약
Rust 기반 오픈소스 물리 엔진 Rapier가 0.36.0부터 소프트 바디 시뮬레이션을 지원합니다. 개발팀은 게임에서 실제 물리의 정확도만큼 안정성, 제어성, 성능과 기존 API와의 통합을 중시했습니다. 이번 글은 새 API 사용법 대신 입자와 격자로 변형체를 표현하는 방법, 시뮬레이션 기법의 절충점, 구현 과정에서 마주친 충돌 문제를 소개합니다.
소프트 바디 표현과 시뮬레이션 방식
강체는 위치와 회전으로 나타내는 하나의 좌표계로 표현하지만, 소프트 바디는 서로 독립적으로 움직이는 질량점으로 구성합니다. 질량점만으로도 형태를 만들 수 있지만, 점을 잇는 모서리나 삼각형·사면체 셀을 더하면 원하는 변형 특성을 정의하기 쉽습니다.
Rapier는 형태를 유지하는 세 가지 방식을 제공합니다. 형상 매칭(shape-matching)은 변형된 점들과 원래 형태를 가장 잘 겹치는 위치·회전으로 정렬한 다음, 각 점을 원래 위치로 되돌리는 가상 스프링을 적용합니다. 모서리나 셀 없이 쓸 수 있고 계산 비용도 낮습니다. 다만 한 점을 누를 때 이웃 점까지 자연스럽게 반응하는 효과는 약합니다. 로프나 천처럼 크게 변형되는 열린 형태에는 적합하지 않습니다.
스프링 제약(spring constraints)은 모서리에 스프링·댐퍼를 두거나 셀에 Neo-Hookean·선형 탄성 모델, 부피 제약을 적용합니다. 현실감과 성능의 균형이 좋지만, 강체성이 제약 솔버의 반복 횟수에 좌우됩니다. 반복 횟수가 낮으면 높은 강성값을 줘도 재료가 부드럽게 보일 수 있습니다. 유한요소법(FEM)은 반암시적 방식으로 변형을 계산해 반복 횟수에 덜 의존하는 높은 강성을 구현하며 소성 변형과 파손도 더 현실적으로 다룹니다. 대신 계산량이 훨씬 크고, 2D 삼각분할이나 3D 사면체화에 쓸 셀이 필요합니다.
관통과 자기 교차 처리
변형체는 오목한 형태가 되기 쉬워 충돌 계산과 관통 해소가 강체보다 어렵습니다. 삼각형 쌍을 각각 처리하면 일부 접촉점이 오히려 관통 상태를 유지시키기도 합니다. 변형 중인 물체가 자기 자신과 교차하는 문제도 생깁니다.
글은 문헌의 접근법을 세 갈래로 나눕니다. 연속 충돌 감지와 장벽 퍼텐셜로 관통 자체를 막는 방법은 가장 엄밀하지만 게임의 성능 예산에 맞지 않습니다. 관통 영역을 전역적으로 찾아 풀어내는 방법은 성능 면에서 가능성이 있었지만, 탐색 과정의 부동소수점 오차가 갑작스러운 움직임을 일으키기도 했습니다. 마지막으로 겹친 부피를 접촉 모델에 활용하는 방법은 유망했습니다. Rapier는 부피 기울기에서 얻은 방향을 최소 이동 벡터(MTV)의 근사로 보고, 이를 이용해 물체를 밀어내며 잘못된 국소 접촉 방향을 걸러냅니다.
조인트, 충돌체와 시각 메시
소프트 프레임(soft frame)은 소프트 바디 일부에 위치와 회전을 붙인 좌표계입니다. Rapier는 이를 특별한 RigidBody로 표현해 기존 조인트와 충돌체 API를 재사용합니다. 기본 프레임은 물체 전체의 형상 매칭으로 갱신합니다. 여러 프레임을 만들면 각 프레임이 질량점의 일부를 기준으로 독립적으로 움직여, 조인트 효과를 특정 위치에 집중할 수 있습니다.
시뮬레이션 격자를 시각 메시보다 단순하게 구성하는 케이지 시뮬레이션과 스키닝도 지원합니다. 낮은 해상도의 격자를 변형하고, 상세한 충돌·시각 메시의 정점은 격자 변형을 따라 움직입니다. Rapier는 SoftBodyBuilder::volumetric_skinned로 케이지를 자동 생성합니다. 소성 변형은 질량점의 기준 위치를 바꾸며 위상은 유지합니다. 찢어짐은 질량점을 둘로 나눠 연결 구조를 끊고, 분리된 연결 요소를 각각 독립된 소프트 바디로 만듭니다.
소프트 바디는 Rust, TypeScript, Python(3D), C 바인딩에서 쓸 수 있으며 Bevy 플러그인도 지원 대상입니다. Bevy 플러그인 배포는 Bevy의 새 버전을 기다리는 상태라고 글은 설명합니다.
Reddit 반응
- @u/Kenkron — 이 기능을 뒷받침하는 알고리즘을 볼 수 있어 정말 흥미롭습니다. 정확도와 성능 사이에서 선택하는 방식도 재미있습니다. 다만 이 모든 걸 다른 누군가가 구현해줘서 다행입니다. 제가 직접 관리하려면 정말 어려웠을 것 같습니다.
원문: Dimforge / 번역·요약: Trawling