SOFA의 Pneunet 예제에서는 속이 빈 공동의 표면에 압력 제약을 두고, 그 표면을 손가락의 체적 모델에 매핑해 변형 계산에 연결합니다. 공동 표면을 읽는 작업, 압력 조건을 정의하는 작업, 그 조건이 반영된 위치와 속도를 구하는 작업이 장면의 서로 다른 구성요소에 나뉘어 있습니다.
SoftRobots의 공식 Pneunet 튜토리얼을 이 연결 순서로 읽으면, 왜 압력 값 하나만 추가해서는 장면 구성이 끝나지 않는지 알 수 있습니다. 여기서는 문서의 장면과 부록이 맡기는 역할을 따라갑니다.
손가락의 체적 모델 아래에 공동 표면을 둔다
상위 finger 노드는 사면체 메시와 기계적 자유도, 질량, 재료의 변형 법칙을 가집니다. 이 체적 모델이 손가락 재료의 변형을 계산합니다. 그 아래 cavity 노드는 내부 공동의 STL 표면과 그 표면의 위치를 보관하는 MechanicalObject를 둡니다.
두 메시가 필요한 이유는 계산에서 맡는 대상이 다르기 때문입니다. 체적 메시는 재료 내부까지 포함한 변형을 표현하고, 공동 표면은 압력 제약을 지정할 삼각형 경계를 제공합니다. 외형을 보여 주는 시각 표면이나 물체와 닿는 바깥쪽 충돌 표면도 이 공동 표면과는 다른 역할입니다.
| 장면 구성 | 표현하는 대상 | 연결되는 계산 |
|---|---|---|
finger의 사면체 메시와 FEM |
손가락 재료의 체적 | 재료 변형 |
cavity의 표면과 SurfacePressureConstraint |
내부 공동의 삼각형 경계 | 압력 또는 체적 증가 제약 |
collisionFinger의 표면과 충돌 모델 |
손가락 바깥쪽 표면 | 다른 물체와의 접촉 |
cavity에 별도의 위치 배열이 있다고 해서 공동이 손가락과 무관하게 움직이는 독립 물체가 되는 것은 아닙니다. 튜토리얼은 BarycentricMapping으로 공동 메시의 변형과 손가락 메시를 연결합니다. 서로 다른 메시를 유지하면서도 손가락의 변형에 맞춰 공동 표면이 움직이게 하는 관계입니다.
압력 제약은 공동의 삼각형을 대상으로 한다
예제의 SurfacePressureConstraint는 triangles로 공동 표면을 가리키고, valueType='pressure'로 입력의 의미를 지정합니다. 같은 구성요소는 체적 증가를 입력으로 두는 방식도 지원하지만, 이 장면의 해당 설정은 압력입니다.
압력 값을 읽을 때는 이 값이 연결된 표면까지 함께 봐야 합니다. 같은 숫자를 넣더라도 공동의 형상, 손가락 재료와 고정 조건이 변형 문제를 구성합니다. 따라서 입력 값은 “손끝을 얼마만큼 움직이라”는 공간상의 변위 명령과 다른 위치에 있습니다. 압력과 체적 증가를 입력으로 두는 차이는 SoftRobots의 구동 입력 설명에서 더 다룹니다.
부록의 공동 매핑에는 mapForces=False, mapMasses=False도 명시되어 있습니다. 이 장면을 일반 힘과 질량을 자식 표면에서 부모로 그대로 전달하는 구성으로 설명하면 해당 설정을 놓칩니다. 문서가 함께 배치한 것은 압력 제약, 메시 간 매핑, 그리고 제약을 푼 결과를 반영하는 보정 구성요소입니다. 이 세 역할을 연결해서 읽어야 합니다.
적분기와 행렬 솔버 다음에 제약 풀이가 이어진다
튜토리얼은 먼저 암시적 시간 적분과 희소 행렬 솔버를 설정합니다. 이 단계에서 재료와 질량을 가진 손가락의 변형을 계산할 수 있고, 중력에 따른 움직임도 나타날 수 있다고 설명합니다. 이어 압력 구동을 추가하면서 제약을 다루는 구성을 별도로 넣습니다.
FreeMotionAnimationLoop는 제약이 포함된 계산 흐름을 구성하고, BlockGaussSeidelConstraintSolver는 제약 문제를 풉니다. 손가락 노드의 LinearSolverConstraintCorrection은 공동 제약에 따른 보정을 위치와 속도에 반영하는 역할을 맡습니다. 부록에서는 이 보정 구성요소의 solverName이 손가락의 행렬 솔버 이름을 참조합니다.
따라서 장면을 해석하는 순서는 다음처럼 연결됩니다.
- 체적 모델과 재료 법칙이 변형할 손가락을 정의합니다.
- 공동 표면과 삼각형 목록이 압력 제약의 대상을 정합니다.
- 매핑이 공동 표면과 체적 모델의 변형 관계를 연결합니다.
- 제약 풀이와 보정 구성이 압력 조건을 반영한 상태 갱신에 참여합니다.
압력용 표면과 충돌용 표면의 매핑을 비교해 읽기
같은 부록에서 collisionFinger에도 BarycentricMapping이 들어갑니다. 이쪽에는 TriangleCollisionModel, LineCollisionModel, PointCollisionModel이 놓입니다. 공동의 압력 구동과 바깥 표면의 접촉은 서로 다른 계산이지만, 둘 다 체적 손가락의 변형과 연결된 표면을 사용합니다.
이 비교는 “표면 파일을 읽었다”는 한 단계만으로 모델의 기능을 판단하기 어려운 이유를 보여 줍니다. 표면이 어느 노드에 있고, 어떤 제약 또는 충돌 구성요소와 연결되는지가 기능을 결정합니다. 체적·시각·충돌 메시의 역할을 구분한 다음 공동 표면을 추가하면, 압력 구동이 기존 변형 모델의 어디에 연결되는지 더 명확해집니다.
원문에는 오래된 구성요소 이름과 코드 표기가 함께 남아 있습니다. 특히 본문의 공동 예제는 메시를 cavityMesh로 이름 붙인 뒤 @topo.triangles를 참조하지만, 부록에서는 메시 이름을 topo로 두어 그 참조와 맞춥니다. 설치용 코드를 옮길 때는 이 이름 관계와 사용 중인 SOFA 버전의 구성요소를 별도로 맞춰야 합니다.
이 글은 2026년 10월 16일 확인한 공식 튜토리얼 전체와 부록을 읽어 작성했습니다. SOFA 장면 실행이나 손가락의 압력·변형 측정은 수행하지 않았습니다.