균일한 종이를 잡아 둥근 접힘을 만든다. 도구가 실제로 엣지를 누른 만큼 그립을 풀고, 깊게 눌린 부분만 주름으로 기억한다. 도구와 그립을 모두 뗀 뒤에도 윗판은 곧게 펴진 채 접힘을 유지한다.
2026.11.11 · MuJoCo 4.0.0 CPU · Python 3.12.10 · Windows
실제 저장 영상과 물리 기록을 사용했다. 두 언어의 글은 원래 한국어 표기가 있는 동일한 미디어를 공유하며, 영어판의 캡션과 설명은 영어로 제공한다.
176.93° · 완전 해제 3초 뒤 전체 접힘각
0.115 mm · 같은 시점의 윗판 볼록함
0 / 25,216 · 검사한 스텝의 중심면 교차
MuJoCo의 Newton과 discrete 적분을 사용하면서 외부 재료, 실제 반력에 따른 그립 인계, 위험한 접촉 스텝의 IPC 재계산을 연결했다. 엔진 원본과 설치 패키지 610개 파일의 실행 전후 해시가 일치하며, 이번 물리 실행은 Warp를 사용하지 않았다.
압착 전의 둥근 형태가 해제 후 어떻게 달라졌나




| 관찰 시점 | 윗판 볼록함 | 단면 최고 높이 | 압착 기억 |
|---|---|---|---|
| 도구 접촉 직전 · 5.70초 | 16.041 mm | 29.98 mm | 0개 |
| 양 끝 압착 직후 · 10.83초 | 0.109 mm | 4.05 mm | 9개 |
| 완전 해제 3초 뒤 · 14.51초 | 0.115 mm | 3.98 mm | 9개 |
양 끝과 그 사이 9개 구간이 모두 눌렸다. 해제 뒤 도구·그립 힘은 0 N이며, 기억각 변화도 0°다. 최종 위치와 각도는 실제 적분 결과다.
VBD에서 참고한 동작과 이전의 잔류 곡면
다음은 재료식을 비교하던 초기 단면 실험이다. VBD와 외부 재료를 사용한 MuJoCo에서 비슷한 둥근 접힘이 나온다. 이 영상은 240 × 240 mm 종이와 고정된 바탕 영역을 쓰며, 압착 도구 없이 일반 소성을 허용한다. 뒤에서 설명하는 180 × 220 mm 종이의 압착 실험과 조건이 다르다.
탁자에서 압착하는 다음 단계에서는 이전 MuJoCo 윗판의 볼록함이 크게 남았다. 같은 윗판 엣지에서 실제각과 기억각을 비교하면, VBD는 약 0.14°와 0°였고 이전 MuJoCo는 약 27.90°와 28.45°였다. 이전 재료는 윗판이 휘어진 상태를 이미 기준 상태로 기억하고 있었다.

이번 구현은 모든 엣지의 초기 굽힘 강성을 같게 두고, 압착과 관계없는 윗판의 기준각을 0°로 유지했다. VBD 데모에서 쓰던 사전 강성 패턴과 일반 소성을 그대로 가져오는 대신, 이 실험의 균일한 종이 조건에 맞춰 재료와 그립을 함께 구성했다.
VBD는 정점별 블록을 순차·병렬 갱신하는 암시적 계산 방식이다. 종이 데모의 특정 기억 규칙은 별도 응용 코드에서 정의됐다. Vertex Block Descent 논문 · Newton Physics 1.7 솔버 문서
이 글의 의사코드는 처리 순서를 설명하며 실행 가능한 재현 코드는 아니다. 입력은 삼각형 메시의 현재 좌표·속도, 엣지 길이와 면적, 기억각, 도구·탁자 반력과 그립 상태다. 모델 생성과 접촉 탐색의 세부 구현은 생략했다.
기본 Newton의 역할과 이번에 드러난 한계
MuJoCo의 solver="Newton"은 제약 문제를 푸는 내부 계산 방식을 선택한다. discrete 적분은 질량과 탄성 강성 근사를 접촉 제약과 함께 사용한다. 종이가 어느 각도를 기억하는지, 언제 그립을 풀지는 재료와 제어에서 결정한다.

| 제약 또는 관찰 | 확인한 원인 | 이번 보완 |
|---|---|---|
| 내장 소성 기준각의 범위 | 검토한 4.0.0의 2D 셸 소성 코드는 국소 기준각을 ±1.3 rad, 약 ±74.5°로 제한한다. | 외부 기억각을 저장하고 그 각도에서 탄성 모멘트를 계산한다. |
| 외부 힘과 내부 강성의 차이 | 힘 콜백에 넣은 재료식의 모든 미분이 Newton의 행렬에 자동으로 들어가지는 않는다. | flex 계수 구조에 맞는 강성 근사를 함께 주입한다. |
| 얇은 두 겹의 관통 | 기본 이산 접촉 대조군은 10.139초부터 층 교차가 검출됐다. | 간격·교차를 검사하고 위험 시도를 IPC로 다시 푼다. |
| IPC 전진 정체 | 이전 실행에는 불완전 이동 경고와 제약용 메모리 소진이 있었다. | 불완전 스텝을 복원하고 더 짧게 재시도한다. 실패 시 진행과 기억을 확정하지 않는다. |
| 윗판 잔류 곡면과 조기 펼침 | 이전 외부 기억 규칙과 그립 약화 시점에서 발생했다. | 깊은 압착만 기억하고, 실제 지지된 전진 거리로 그립을 푼다. |
내장 소성의 ±74.5°는 한 엣지의 소성 기준각에 적용된다. 외력으로 전체 종이를 접을 수 있는 각도의 상한을 뜻하지 않는다. 이번 외부 기억각의 최종 중앙값은 177.46°다.
의사코드 · 내장 2D 셸에서 확인한 기준각 제한
탄성 굽힘이 항복 기준을 넘으면
후보 기준각 ← 현재각에서 항복 범위만큼 되돌린 각도
기준각 ← 후보 기준각을 −1.3 … +1.3 rad 범위로 제한
엔진의 곡률 표현에 맞춰 소성 상태 저장
Newton의 제약 계산 및 사용자 힘 콜백의 의미는 공개 API 문서에 설명돼 있다. MuJoCo Newton 알고리즘 · 수동 힘 콜백
윗판은 탄성으로, 깊은 압착은 기억으로
평평한 새 종이의 모든 기억각은 0°다. 내부 엣지마다 같은 굽힘 강성 D = 0.0002 N·m를 사용한다. 이면각 θ와 기억각 r의 차이가 탄성 모멘트를 만든다.
k = 12 D L² / (2A₁ + 2A₂)
M = k · wrap(θ − r)
정점 굽힘 힘 = −M · ∇θ
L은 엣지 길이, A₁·A₂는 양쪽 삼각형 면적이다. D가 같아도 메시의 길이·면적에 따라 각도 강성 k가 달라진다. 면내 힘에는 BW 계열 신장·전단식을 사용한다. 여기서 wrap은 각도 차이를 주 구간으로 감싸는 연산이고, ∇θ는 정점 좌표에 대한 이면각의 기울기다.

의사코드 · 외부 힘과 강성 근사 연결
초기화
각 엣지의 길이·면적으로 목표 굽힘 강성 계산
MuJoCo flex 계수에 호환되는 굽힘·면내 강성 근사 설정
모델의 파생 상수 갱신
모든 외부 기억각 ← 0
수동 힘 콜백
현재 좌표와 기억각에서 굽힘·신장·전단 힘 계산
종이 자유도에서 내장 spring·damper 기여를 교체
계산한 힘을 해당 일반화 힘에 더함
강성 근사는 내장 flex 구조를 통해 discrete의 유효 행렬에 들어간다. VBD가 반복 중 현재 자세에서 갱신하는 비선형 접선 강성 전체와 차이가 남는다. 따라서 외부 힘을 맞추는 것과 솔버 내부의 반복을 같게 만드는 것은 별도로 검토해야 한다.
의사코드 · 수용한 물리 상태에서 깊은 압착 기억 갱신
지지된 접촉 ← 도구가 윗면에 정렬됨
그리고 도구 반력 > 0.01 N
그리고 19 mm 이내 탁자 반력 > 0.003 N
각 실제 접촉 엣지에 대해
현재각 ← 현재 두 삼각형의 부호 있는 이면각
더 깊음 ← |현재각| > max(90°, |기억각|)
같은 방향 ← 첫 기록이거나 현재각과 기억각의 부호가 같음
지지된 접촉이고 더 깊고 같은 방향이면
기억각 ← 현재각
압착 기억 표시 ← 참
90°는 이 실험에 사용한 깊은 압착 기록 기준이다. 실물 종이에서 측정한 보편적인 항복각으로 설정한 값은 아니다. 둥근 접힘에서는 전체 회전이 여러 엣지에 분산된다. 전체 접힘각이 커도 개별 엣지는 평면 기준 탄성으로 남을 수 있다.

그립을 유지하다가 누른 거리만큼 풀기
접는 동안에는 모서리를 잡는다. 압착 단계에서는 윗장의 두 자유 가장자리 4개 정점을 유한한 힘으로 함께 잡아, 도구가 닿을 때까지 탄성 종이의 형태를 유지한다. 자유 가장자리 서보의 축별 강성은 800 N/m, 최대 힘은 0.45 N이다.
반경 6 mm인 구형 도구는 위로 올라가 정렬한 뒤 둥근 턱에 착좌한다. 실제 지지된 접촉이 생긴 뒤 그립의 하향 힘을 0.2초에 걸쳐 켠다. 도구는 첫 깊은 주름을 만든 다음 시작 끝으로 굴러가고, 그 끝의 압착을 확인한 뒤 반대쪽으로 전진한다.
w = max(0, 1 − s / (L − 2R))
L은 접힘 가장자리 길이 127.28 mm, R은 도구 반경 6 mm다. s는 시작 끝을 누른 뒤 확인한 연속적인 전진 거리다. 115.28 mm를 지지된 상태로 전진하면 접는 쪽 그립 강도 w가 0이 된다.
도구 목표 하중은 1 N이다. 누르는 중에는 측정 반력과 목표의 차이로 도구 높이 명령을 조절한다. 종이 내부 정점의 최종 형상은 힘과 접촉 계산으로 정해진다.



의사코드 · 접점의 실제 전진으로 그립 인계
첫 깊은 주름과 시작 끝의 압착이 확인될 때까지
접는 쪽 그립 강도 ← 100%
이후 지지된 도구 접촉이 있으면
접점 위치 ← 현재 종이 양 끝을 기준으로 길이 방향 측정
이전 접촉 범위와 도구 지름 이내로 이어지면
가장 멀리 누른 위치 ← max(기존 값, 이번 접점 위치)
전진 거리 ← 가장 멀리 누른 위치 − 인계 시작 위치
그립 강도 ← max(0, 1 − 전진 거리 / 115.28 mm)
양 끝과 9개 구간이 모두 깊게 눌렸고 그립이 0%이면
압착을 끝내고 도구를 들어 올림
바탕 지지도 해제한 뒤 자유 응답 계산
정지·후퇴·공중 이동은 전진 거리를 늘리지 않는다. 반력만으로 평평한 한 장을 누르는 경우를 성공으로 집계하지 않도록, 깊은 주름과 도구 아래 두 겹도 따로 확인한다.

층 관통을 찾고 그 스텝을 다시 풀기
그립 인계와 깊은 주름이 성공해도 두 겹이 서로 통과할 수 있었다. 아래 대조군은 같은 재료와 같은 압착 전 상태를 사용한다. 왼쪽은 기본 접촉을 두 번의 짧은 스텝으로 계산하고, 오른쪽은 위험한 시도에 IPC 재계산을 더한다.
압착과 해제에서는 외부 제어 1/1200초를 내부 접촉 1/2400초 두 번으로 진행한다. 각 시도의 끝에서 비공유 삼각형 교차와 윗겹의 수직 간격을 검사한다. 간격이 충돌 반경의 ¼보다 작거나 교차가 있으면 직전 상태에서 IPC를 켜 같은 외력으로 다시 계산한다.

의사코드 · 기본 시도와 IPC 재계산
짧은 스텝 시작 상태 저장
기본 Newton 접촉으로 짧은 스텝 진행
위험 ← 비공유 삼각형이 교차함
또는 윗겹의 수직 간격 < 충돌 반경 / 4
위험하면
시작 상태 복원
같은 도구·그립 명령으로 내장 IPC 스텝 진행
IPC가 불완전 이동을 경고하면
적분 상태와 접촉 승수·접촉 이력 복원
시간 간격을 반으로 나누어 재시도
재시도 한계에 도달하면 실패를 기록하고 중단 (진행·기억 미확정)
수용한 상태에서 실제 반력을 읽음
외부 기억과 그립 인계 갱신
교차 검사를 검증 기록에 누적
| 검증 항목 | 기본 접촉 | 위험 스텝 IPC 재계산 |
|---|---|---|
| 교차가 검출된 짧은 스텝 | 10,482 / 25,216 | 0 / 25,216 |
| 겹 순서가 뒤집힌 저장 자세 | 132 / 437 | 0 / 437 |
| 해제 후 윗판 볼록함 | 6.280 mm | 0.115 mm |
| 남은 압착 기억 | 9개 | 9개 |
| 위험 시도의 IPC 재계산 | 0회 | 2회 |
이번 실행은 CPU 스레드풀도 사용하므로, 실행 환경까지 완전히 같은 단일 변수 비교로 해석할 수는 없다. 확인된 결과는 이 조합에서 주름 유지와 겹 순서를 함께 만족했다는 점이다.
IPC 접촉 승수와 이력은 일반 적분 상태 저장만으로 완전히 보존되지 않는다. 재시도에서는 이 배열들을 별도로 저장했다. 또한 IPC가 직접 다루는 flex 자기 접촉은 법선 반력을 중심으로 처리한다. 기본 접촉과 IPC를 오가는 계산에는 접촉 마찰 처리의 차이도 포함된다.
사용한 IPC는 MuJoCo 내장 discrete 적분기의 접촉 모드다. 공식 IPC 지원 범위·상태·마찰 설명
놓은 뒤에도 주름이 유지되는가


| 해제 후 확인 | 결과 | 판정 의미 |
|---|---|---|
| 전체 접힘각 | 176.93° | 종이 전체가 접힌 상태를 유지 |
| 접힘선 9개 엣지의 실제각 중앙값 | 175.95° | 압착한 국소 주름 유지 |
| 경로 밖의 압착 기억 | 0개 | 윗판의 넓은 영역에 압착 기억을 남기지 않음 |
| 해제 후 기억각 변화 | 0° | 도구가 사라진 뒤에도 저장된 재료 상태 유지 |
| 해제 후 도구·그립 힘 | 각각 0 N | 외부 잡기 힘을 제거한 자유 응답 |
| 누르는 동안 도구가 윗겹 아래로 들어간 저장 자세 | 0 / 189 | 실제 윗겹 위의 도구 접촉 확인 |
프로젝트에 옮길 최소 로직
적용할 연결부는 재료 계산, 조작 제어, 수용한 상태의 검증이다. 아래 의사코드는 내장 Newton을 사용하는 전체 순서를 요약한다.
의사코드 · 한 번 접고 압착한 뒤 완전히 놓기
모델 구성
MuJoCo 4.0.0 CPU, Newton, discrete
균일한 2D flex와 면적에 비례한 정점 질량
움직이는 도구·받침과 힘 제한 그립
외부 굽힘·면내 힘 및 강성 근사 연결
외부 기억각을 모두 0으로 초기화
새 종이를 모서리 그립으로 접음
압착할 동안
현재 종이에서 둥근 바깥 턱과 윗면 위치를 찾음
측정 반력에 따라 도구 높이를 조절
첫 주름과 시작 끝의 실제 압착까지 그립 유지
짧은 물리 스텝 진행, 위험하면 IPC로 재계산
수용한 상태의 접촉으로 깊은 기억 갱신
지지된 전진 거리에 따라 그립 강도 감소
양 끝과 모든 구간의 실제 압착 여부 확인
압착 완료
도구를 올리고 모든 그립·받침 지지를 해제
3초간 물리 계산을 이어감
접힘각·윗판 볼록함·기억 변화·겹 교차를 검증
| 검증에 사용한 조건 | 값 |
|---|---|
| 종이 크기 / 격자 간격 / 재료 두께 | 180 × 220 mm / 10 mm / 0.20 mm |
| 면밀도 / 균일 굽힘 강성 | 0.16 kg/m² / 0.0002 N·m |
| 외부 제어 / 압착·해제 접촉 스텝 | 1/1200초 / 1/2400초 |
| 도구 반경 / 목표 하중 | 6 mm / 1 N |
| 그립 해제에 필요한 전진 거리 / 실제 기록 | 115.28 mm / 119.12 mm |
| 압착 단계의 충돌 반경 | 0.10 mm에서 0.25 mm로 점진 증가 |
| 계산 시간 | 저장된 접기 상태부터 압착·해제까지 약 992초 |
현재 구현은 단일 flex, 정점별 3개 slide 자유도, 지정된 첫 대각선 조건에 맞춰져 있다. 다른 관절 구조에서는 정점 힘을 일반화 힘으로 변환해야 한다. 다른 메시에서는 경로와 그립의 재료 위치도 다시 정해야 한다.
외부 힘 콜백만 연결하면 강성 근사가 자동으로 전달되지는 않는다. 모델의 flex 계수에 호환되는 항을 설정하고 파생 상수를 갱신하는 단계가 함께 필요하다. 힘 콜백은 전역이므로 독립 모델 여러 개를 동시에 계산할 때는 모델별 처리와 상태 관리를 추가해야 한다.
공개 API의 범위는 공식 문서에서 확인할 수 있다. 솔버·적분 설정 · 전역 콜백의 범위
이번 결과의 물리적·수치적 범위
중심면 교차는 0회였지만 두께 여유에는 오차가 남는다. 저장 자세의 최소 수직 층간 간격은 0.094 mm로 재료 두께 0.20 mm보다 작다. 엔진이 기록한 자기 접촉 외피의 겹침은 최대 0.396 mm였다.
최소 간격은 뒤집힌 윗겹 삼각형의 중심을 아래 면으로 수직 투영해 잰 값이다. 모든 삼각형 쌍의 전역 최소 거리는 측정하지 않았다. 교차 검사는 압착·해제의 수용된 짧은 스텝을 대상으로 했으며, 모든 기본 스텝 사이의 연속 궤적 전체를 보장하는 범위까지 확장하지 않았다.
검증 대상은 첫 대각선 한 번의 접기와 압착, 완전 해제 후 3초다. 반대 방향 재접기, 주름 지우기, 반복 피로, 찢김과 섬유 방향성은 추가 재료 규칙과 검증이 필요하다. 약 992초의 계산 시간에는 초기 접기와 영상 렌더링이 포함되지 않는다.
비교 실행들은 새 종이를 접어 얻은 같은 3.999초 상태에서 압착을 시작했다. 그 상태의 좌표·속도·기억각을 공유했다. 문서의 그래프와 추가 영상은 이 저장 기록에서 만들었으며, 이번 문서 개정과 블로그 이관에서 물리 시뮬레이션을 새로 돌리지 않았다.
검토한 구현과 공개 문서의 버전
실험은 MuJoCo 4.0.0 CPU와 Python 3.12.10에서 수행했다. 원 실험 기록에 기재된 내장 2D 셸 소성 제한과 IPC 처리의 코드 확인 기준은 엔진 리비전 a937a4f916dc586660145973b015e56e04043377이다. 내부 강성 배열 구조와 실험적인 IPC 동작은 버전에 의존한다. 공개 문서의 latest 내용은 API 의미를 보조하며, 측정 수치의 근거는 이 실험에서 저장한 결과다.
논문과 공개 라이브러리 문서
문서 속 영상과 그래프는 자체 실험 기록이다. 아래 문헌은 계산 방식과 API의 배경을 설명한다.
-
Anka He Chen 외, Vertex Block Descent, SIGGRAPH 2024. 정점 블록 갱신을 이용한 암시적 물리 계산을 설명한다. 논문
-
MuJoCo의 Newton 제약 계산과 discrete 적분의 유효 행렬. Computation
-
MuJoCo의 solver 설정과 실험적 IPC 모드. 상태 저장·지원하는 접촉·마찰 범위를 포함한다. XML Reference
-
MuJoCo의 사용자 수동 힘과 전역 콜백. API Globals
-
Newton Physics 1.7.0의 VBD와 솔버 구성. Solvers