돌아가기

Newton IPC 독립 구현 및 이식 안내서

삼각형 필름과 구형 내용물의 접촉을 함께 푸는 Newton IPC의 구현과 이식 방법. 481정점 봉투 실험으로 입력·에너지·충돌 처리와 검증 기준을 살펴봅니다.

글 수정 제안

Newton에서 삼각형 필름과 구형 내용물의 접촉을 한 시간 스텝에서 함께 푸는 방법을 설명한다. 다른 프로젝트에 이식할 때 필요한 입력, 에너지 식, 충돌 처리 순서와 검증 기준을 담았다. 481정점 봉투 실험은 이 방법으로 얻은 형상과 접촉 결과를 보여 준다.

이 글에서 ‘Newton IPC’는 Newton과 연결해 실험한 별도 구현을 가리킨다. 아래 내용은 실험 조건과 알고리즘 설명이며, 구현 소스나 로컬 라이브러리는 배포하지 않는다. IPC 원리의 공개 출처는 Li 외의 논문과 저자 자료다.

30 µm 봉투를 펼치고 묶는 과정

Newton IPC로 계산한 10.50초를 0.5배속으로 재생한다. 빈 봉투를 통에 씌우고 구 7개를 넣은 뒤, 실제 끝단 두 곳을 들어 통에서 벗겨 바닥에 놓는다. 끝단을 펼친 뒤 한쪽은 윗자락을 받치고 다른 쪽은 비닐을 따라 끝에서 3 cm 안쪽을 조인다. 영상의 시계는 시뮬레이션 시간이다.
바닥에 놓인 봉투의 끝단이 넓게 펼쳐져 있다
6.05초 · 펼침 완료. 접혀 있던 윗자락을 편 뒤 끝단을 모으기 시작한다.
윗자락을 지지한 채 그 아래 목에 주름이 모인 봉투
8.40초 · 목 조임 완료. 윗자락을 받친 상태에서 목의 두 띠에 묶음 구속을 건다.
양손을 놓은 뒤 바닥에서 내용물을 감싼 최종 봉투
10.50초 · 해제 1.10초 후. 목 폭은 38.83 × 37.20 mm, 목 위 윗자락 높이는 18.43 mm다.

Newton VBD와의 차이와 비닐봉투에 적합한 이유

봉투 입구를 조이면 같은 비닐의 여러 겹이 좁은 목에서 서로 미끄러진다. 이때 두 겹이 한 번 서로 통과하면, 손을 놓은 뒤에도 주름의 순서와 내용물을 지지하는 모양이 달라진다. 이 IPC 구현은 매 이동에서 겹 사이의 간격을 검사하므로 접힌 층이 서로 통과하는지를 추적해야 하는 실험에 적합하다. 굽힘 강성을 인위적으로 높여 모양을 지지하는 대신, 필름 두께에서 계산한 굽힘과 층 사이의 접촉을 각각 설정할 수 있다. VBD에도 동일한 물리 굽힘 계수를 적용했다.

비교 항목Newton VBD 실험이 문서의 Newton IPC
목에 힘이 전해지는 방식색상 그룹 순서로 정점의 위치 3성분을 국소적으로 풀고, 갱신값을 다음 그룹과 반복에 전달한다. 같은 색의 정점을 병렬로 처리한다. 이 실험은 서브스텝당 48회 반복했다.막·굽힘·접촉·구속을 한 전역 행렬에 조립한다. 한 번의 Newton 방향에 서로 다른 겹과 내용물의 응답이 함께 들어간다. 현재 구현은 FP64 조밀 행렬을 쓰므로 정점 수가 커질수록 메모리와 분해 비용이 커진다.
자기접촉과 이동 제한정점–면과 모서리–모서리 자기접촉을 켰다. 자기접촉 작용 거리 0.50 mm, 추가 탐색 폭 1.50 mm다. 강체–필름 접촉에는 보수적 이동 제한(DAT)과 로그 장벽 옵션도 켰다.필름 중간면 간격 0.030 mm를 기준으로 자기접촉 장벽을 계산한다. 이동 구간의 후보를 찾고, 각 Newton 방향과 마지막 FP32 반올림에서 간격을 확인한다. 간격을 잃는 결과는 기록하지 않는다.
내용물과 계산 비용구에 질량과 회전 자유도가 있는 강체를 사용한다. 봉투보다 복잡한 강체나 관절까지 같은 프레임워크로 다뤄야 할 때 활용할 수 있다.내용물은 반지름과 질량이 있는 병진 입자다. 접힌 필름과 구형 내용물의 간격을 검증할 수 있다. 비구형 물체의 회전과 마찰 토크가 중요한 실험에는 이 모델을 확장해야 한다.

VBD의 정점 단위 풀이는 원 논문에, Newton의 자기접촉 및 강체 접촉 옵션은 공식 솔버 문서에 기술되어 있다. 위 설정값은 프로젝트에서 실행한 Newton 1.7.0의 봉투 드라이버 기준이다. Vertex Block Descent 원 논문 · Newton VBD 공식 문서

같은 시점에서 측정한 차이

아래는 두 솔버가 모두 끝까지 실행된 이전 8.45초 펼침·조임 실험이다. 같은 481정점 메쉬, 30 µm 물성, 마찰계수 0.35, 구 7개와 3 cm 조임 위치를 사용했다. 두 솔버 모두 7.35초에 외부 지지를 해제했다. 위 영상은 조이는 동안 윗자락을 더 오래 받쳐 10.50초까지 계산한 별도 실험이다.

해제 1.10초 후 같은 카메라에서 왼쪽 VBD의 끝단은 목 높이까지 내려오고 오른쪽 IPC에는 윗자락이 더 높게 남아 있다
외부 지지를 놓은 지 1.10초 후의 저장 프레임. 왼쪽이 VBD, 오른쪽이 IPC다. 구 중심 7개는 두 경우 모두 봉투 안에 있었다.
저장된 궤적에서 측정한 값Newton VBDNewton IPC
8.45초의 목 폭 x × y31.04 × 32.04 mm38.45 × 42.01 mm
8.45초의 윗자락 높이1.54 mm13.47 mm
자기교차가 검출된 저장 프레임 / 전체1,197 / 2,0290 / 2,029
마지막 1초간 구 중심 높이의 최대 변동 폭¹23.76 mm0.80 mm

¹ 각 구에서 z의 최댓값과 최솟값 차이를 구한 뒤, 일곱 구 중 가장 큰 값을 택했다. 정착 중인 이동도 포함되므로 이 값만으로 진동 유무를 판정할 수 없다. 자기교차는 1/240초 간격으로 저장한 필름 표면에서 검사했다.

이 조건에서는 IPC의 윗자락이 더 높게 남았고 검사한 프레임에서 자기교차가 검출되지 않았다. VBD의 목 폭은 오히려 더 좁았다. 따라서 목 폭 하나로 묶음 품질을 판정하면 층간 관통을 놓칠 수 있다. 두 실행은 버전과 기준 물성이 같지만 VBD는 통 벽을 상자 패널로, IPC는 고정 삼각형으로 표현했다. 펼침 중 구속 방식, 묶음 강성을 거는 시점의 목표 길이, 접촉 설정과 감쇠도 다르다. VBD의 적분 간격은 1/960초, IPC는 기본 1/240초에 실패 시 분할했다. 관측된 차이에는 이 조건들이 함께 작용한다.

1. 솔버의 입력과 출력

실험 환경은 Windows x64, Python 3.12.10, Newton 1.7.0, Warp 1.18.0, NumPy 2.5.4, PyTorch 2.11.0+cu128, RTX 5080이다. 길이·질량·시간은 각각 m, kg, s로 통일한다.

모델 입력. 정점의 기준 위치, 삼각형 연결, 기준 면적과 이면각, 입자별 질량과 고정 여부, 재료 계수, 중력을 준비한다. 각 입자의 구 반지름은 독립된 구 중심에만 양수를 넣고 필름 및 고정 장애물 정점에서는 0으로 둔다.

스텝 입력과 출력. 현재 위치·속도, 외력, 지지점 목표 위치 및 묶음 조건을 받아 다음 위치·속도를 반환한다. 영상의 10.50초 실험은 2,520스텝이다. 초기 상태까지 저장하면 필름 위치는 2,521 × 481 × 3, 구 중심은 2,521 × 7 × 3이며 삼각형 연결은 928 × 3이다.

입력과 출력에 서로 다른 State를 쓴다. 위치·속도는 Newton의 FP32, 거리·도함수·전역 선형계는 FP64, 토폴로지 인덱스는 int32다. 관성에는 particle_mass, 경계조건에는 particle_flags를 쓴다. 외부 접촉 쌍과 활성 삼각형 수축은 지원하지 않는다. 고정 장애물은 질량 0인 정점으로 이루어진 삼각형 표면으로 추가한다.

2. 한 스텝에서 실제로 푸는 문제

미지수는 모든 입자의 새 위치 x다. 자유 정점마다 관성 목표 y = x₀ + dt·v₀ + dt²·(gravity + force/m)를 만든다. 목적함수의 단위는 J이며 관성 계수에 이미 1/dt²가 들어간다. 아래 식에서 다른 항에 다시 dt²를 곱하면 같은 풀이가 되지 않는다.

Φ(x) = Σ mᵢ ‖xᵢ − yᵢ‖² / (2 dt²)
     + E막 + E굽힘 + E접촉장벽 + E마찰 + E지지점 + E묶음

한 시간 스텝의 처리 순서

  1. 현재 위치·속도·외력과 시간 간격에서 관성 목표를 구하고, 초기 형상과 접촉 간격을 검사한다.
  2. 막·굽힘·접촉·구속의 기울기와 근사 헤시안을 조립한다. 고정 자유도를 반영한 선형계로 위치 갱신 방향을 구한다.
  3. 접촉 간격을 유지하는 이동 범위를 찾고, 에너지가 감소하도록 이동량을 줄여 위치를 갱신한다. 이동 범위가 바뀌면 접촉 후보도 갱신한다.
  4. 수렴한 위치를 저장 정밀도로 변환한 뒤 간격을 다시 검사한다. 검사를 통과한 위치에서 다음 속도를 계산한다.

이 순서는 알고리즘을 설명하기 위한 요약이다. 로컬 솔버 함수나 커널을 호출하는 실행 예제는 포함하지 않는다.

고정 자유도는 행·열을 0, 대각을 1, 우변을 0으로 둔다. D = diag(H)⁻¹ᐟ²로 평형화한 뒤 GPU Cholesky로 (D H D) z = −D∇Φ를 풀고 Δx = D z를 얻는다. 수렴 기준은 max(abs(Δx))이며 단위는 m다.

선 탐색은 Φ(x+αΔx) ≤ Φ(x)+10⁻⁴ α ∇Φ·Δx를 최대 48회 검사한다. 선 탐색이나 비선형 반복 한도를 소진하거나 반올림으로 간격을 잃으면 해당 스텝의 출력을 폐기한다. 봉투 실험에서는 같은 입력에서 반 스텝 두 번으로 재시도하며 최대 7단계까지 분할한다. 잘못된 초기 형상이나 Cholesky 분해 실패는 호출자에게 오류로 전달한다.

3. 막과 굽힘 및 지지점

각 기준 삼각형을 국소 2차원으로 펴고 두 기준 변을 열로 갖는 Dm을 만든다. Newton의 tri_poses는 이 기준 변환의 역행렬이다. 그 두 행을 b₁,b₂라 하면 B = [−b₁−b₂; b₁; b₂]이다. 현재 세 위치를 열로 쌓은 X에서 F=X B(3×2), C=FᵀF, ε=(C−I)/2, log J=½ log det C를 계산한다. 비퇴화 기준 면과 면적 A₀>0가 필요하다.

항요소 에너지와 구현 세부
Neo-Hookean 막A₀ [μ (tr ε − log J) + λ (log J)²/2]. 봉투 경로에서 명시적으로 선택한다. 응력 S=μI+(λ log J−μ)C⁻¹. 기하 접선에는 S의 양의 고유값 부분을 쓴다. 각 삼각형의 기울기와 접선을 그 면의 세 정점에 해당하는 전역 자유도에 누적한다.
StVK 막A₀ [μ ‖ε‖² + λ (tr ε)²/2]. 생성자의 기본 재료이며 소형 CPU/GPU 대조에 쓴다.
내부 힌지½ kθ wrap(θ−θ₀)². 인덱스는 (반대 정점 a, 반대 정점 b, 공통 변 c, d) 순서다. 두 면 법선과 c→d를 써서 부호 있는 atan2 이면각을 계산한다. wrap은 atan2(sin, cos)다. 헤시안은 kθ ∇θ∇θᵀ. 경계의 음수 인덱스는 제외한다.
물리 계수평면응력 μ=Eh/[2(1+ν)], λ=Ehν/(1−ν²)의 단위는 N/m다. 굽힘 D=Eh³/[12(1−ν²)]에 대해 인접 두 면의 합산 면적을 A, 공통 변 기준 길이를 ℓ이라 하면 빌더에 넣는 값은 edge_ke=6Dℓ/A, 에너지에 쓰는 최종 계수는 kθ=edge_ke·ℓ=6Dℓ²/A다.
임시 지지와 조임지정한 정점마다 ½ kᵢ ‖xᵢ−targetᵢ‖². 지지하는 재료점마다 별도의 강성 kᵢ(N/m)를 지정한다. 손을 놓는 시점에 해당 에너지 항을 제거한다. 손 기하가 없어도 된다.
묶음 유지재료점 쌍마다 ½·250·(‖xᵢ−xⱼ‖−Lᵢⱼ)²를 더한다. 단위는 N/m. 두 띠 내부 및 띠 사이에만 연결하므로 묶음이 공간 안에서 이동하고 기울 수 있다. 모델의 일반 스프링이나 실의 마찰 매듭과는 구현이 다르다.

4. 충돌 후보와 장벽 및 마찰

접촉마다 네 정점 인덱스와 합이 0인 가중치 w를 저장한다. VT(정점–삼각형)는 (1,−b₀,−b₁,−b₂), EE(모서리–모서리)는 (1−s,s,t−1,−t), 구–구는 반복 인덱스 (i,j,j,j)와 (1,−1,0,0)다. b는 최근접점의 삼각형 무게중심 좌표, s와 t는 선분 매개변수다. VT는 삼각형 내부 및 세 변을, EE는 양 선분의 끝점 조합과 내부 최근접점을 검사한다. 평행한 모서리도 끝점–선분 분기로 처리한다.

종류후보 생성과 제외거리에서 빼는 값 c
필름·장애물 VT/EE삼각형 BVH에 정점 상자를 조회하고 모서리 BVH에 모서리 상자를 조회한다. 정점이 그 면에 속하거나 모서리가 정점을 공유하면 제외한다. EE는 한 방향만 기록한다.min_gap
구 중심–면VT 정점의 조회 상자를 구 반지름만큼 추가 확장한다. 구 중심은 필름 정점과 독립이다.R + min_gap/2
구–구독립 구 중심의 고유 쌍을 모두 추가한다.Rᵢ + Rⱼ

BVH 상자는 시작·끝 위치의 축별 최소·최대로 만든다. 후보 조회 폭에는 dhat+min_gap을 포함하고 FP32 경계를 바깥쪽으로 4·eps32·(1+abs(coord))만큼 넓힌다. 후보 버퍼가 부족하면 실제 카운트보다 크게 재할당한 뒤 다시 조회한다. 반복 사이의 후보 재사용 여유(skin)는 1.5 mm다. 충돌 두께와 별개의 값이다.

r = Σ wᵢ xᵢ                 n = r / ‖r‖
g = ‖r‖ − c                  a = g − dhat
B(g)  = −k a² log(g/dhat)     if 0 < g < dhat
B′(g) = −k [2a log(g/dhat) + a²/g]
B″(g) = −k [2 log(g/dhat) + 4a/g − (a/g)²]
jᵢ = wᵢ n                    grad += B′ j,   H += B″ jjᵀ

g가 활성 거리 이상이면 장벽 기여는 0이고, g≤0이면 허용 영역 밖이다. 미터 단위의 거리 자체를 쓰므로 제곱거리용 IPC 미분식을 그대로 넣으면 힘이 바뀐다. 장벽 강성 k의 단위는 N/m다. 법선 방향의 양의 곡률만 조립한다.

이동 상한. 후보별로 uᵢ=n·Δxᵢ를 구한다. 접근량은 VT에서 max(u₁,u₂,u₃)−u₀, EE에서 max(u₂,u₃)−min(u₀,u₁), 구–구에서 u₁−u₀다. 양의 접근량에 대해 g/접근량의 최솟값이 1 이하이면 그 값의 90%부터 시도한다. 아니면 1부터 시작한다. 양 끝 위치에서만 검사를 하면 한 스텝 중간의 관통을 놓칠 수 있다. 이 구현은 현재 분리 법선에 대한 보수적 이동 제한을 사용한다.

마찰. 스텝 시작 때 활성인 후보에 대해 load = μf·(−B′(g₀))와 w₀,n₀를 저장한다. t=(I−n₀n₀ᵀ) Σw₀ᵢ(xᵢ−x₀ᵢ)에서 load·(sqrt(t·t+eps²)−eps)를 더한다. eps=dt·0.001 m/s. 그 스텝 안에서 처음 생긴 접촉은 장벽에 즉시 반영되고 마찰 하중은 다음 스텝에서 갱신된다.

5. 쓰레기봉투 예제의 설정과 비교 기준

봉투는 중심 1개와 원주 32점의 15개 링으로 만든 열린 삼각형 표면이다. 실제 끝단은 449–480, 목 둘레 전체는 321–352번이다(0 기반, 끝값 포함). 같은 원주 방향 열에서 다섯 링의 대응점을 잇는 기준 변 네 개 길이의 합이 0.030 m가 되도록 구성했다. 접힌 상태의 월드 z 좌표 차이로 정점을 고르지 않는다.

설정인계 예제에 적용한 값
필름두께 30 µm, E=315 MPa, ν=0.45, 밀도 925 kg/m³. add_cloth_mesh에는 면밀도 0.02775 kg/m²를 전달. 삼각형과 힌지의 내장 감쇠는 0. 별도 외력 −12 s⁻¹·m·v는 필름에만 적용.
환경과 내용물높이 106 mm의 열린 통과 바닥은 고정 삼각형. 구 7개의 반지름은 26 mm 세 개, 12 mm 세 개, 25 mm 한 개. 구 질량은 250 kg/m³·4πR³/3. 예정된 투하 시각까지 각 구의 중력을 상쇄한다.
시간과 접촉dt=1/240 s, min_gap=0.030 mm, μf=0.35, k=1000 N/m, 반복 한도 150. 장벽 활성 거리의 구현 기본값은 1.0 mm다. 저장된 전체 궤적에는 activation이 기록되지 않았으므로 다른 실행의 0.12 mm 값을 추정해 대입하지 않는다. 위치 허용치는 작업 중 0.012 mm, 해제 뒤 0.0005 mm.
펼침과 조임0–0.72 s 씌우기, 0.89–1.60 s 투하, 2.00 s 대향하는 끝단 두 곳을 들어 벗기고 바닥에 놓기. 4.70–6.05 s 접힌 윗자락 펴기. 다음 단계에 들어가기 전에 32열 모두 위로 펴졌는지 검사. 6.05–7.10 s 모으기, 7.40–8.40 s 윗자락을 지지하며 두 목 띠의 선택 정점 조이기.
묶기와 놓기8.40 s에 내부 묶음을 걸고 8.75 s까지 목표 길이로 줄인다. 이후 윗자락 지지점만 내리다가 9.40 s에 외부 지지를 해제하고 10.50 s까지 계산한다. 윗자락을 내릴 때 사용한 다섯 지지점의 최종 목표 중심은 앞선 펼침 실험의 해제 후 형상에서 취했다.

기존 전체 작업의 마지막 측정값은 목 폭 38.83 × 37.20 mm, 윗자락 높이 18.43 mm였다. 폭은 목 링 32점의 x·y 각각의 최대−최소, 높이는 끝단 32점의 z 중앙값에서 목 링의 평균 z를 뺀 값이다. 미리 성형한 다른 초기조건에서 얻은 3.8 mm 목을 이 장면의 합격값으로 쓰면 안 된다. 기존 궤적은 단계별 재시작도 사용했다. 새 환경의 처음부터 실행한 결과는 형상·간격·보존 조건으로 비교한다.

6. 이식 후 검증과 알려진 범위

검증판정 기준
소형 기준 풀이VT·EE 장면 각각 12스텝, 중간면 거리 >30 µm. 초기 겹침과 모서리의 면 관통은 거부하며 실패 시 출력 배열을 보존한다. 힌지 각도·조립 에너지의 기울기를 중앙차분으로 비교한다.
GPU 대조이동 궤적을 17개 시점에서 표본화해 기준 후보 누락을 검사하고, 빠르게 교차하려는 방향의 α가 (0,0.5)에 있는지 검사한다. 두 장면에서 6스텝 동안 같은 입력의 GPU와 기준 풀이 위치 오차 ≤2×10⁻⁷ m, 선형 상대잔차 <10⁻⁷. 이 비교의 재료는 StVK다.
봉투 연결 확인두 스텝으로 GPU Neo-Hookean 경로, 구 7개, 통과 바닥, 결과 파일 형상을 확인한다. 전체 실험에서는 펼침 단계의 기하 검사, 해제 후 목 폭·윗자락 높이를 확인한다. 진동 검증이 필요하면 마지막 1.10 s의 각 구 중심 속도와 최대 변위, 필름과의 최소 표면 간격을 별도로 측정한다.

기준 구현에서 측정한 값. CPU 최소 중간면 거리는 VT 838.96 µm, EE 651.40 µm였고, 굽힘 각도는 −14.036°에서 −7.229°로 변했다. GPU에서는 두 교차 시도 모두 α=0.44775로 제한됐고 두 장면의 기준 위치 대조를 통과했다. 봉투 두 스텝 결과는 필름 (3,481,3), 구 중심 (3,7,3), 면 (928,3)이었다. 기존 궤적과 첫 세 프레임의 좌표 성분 최대 차이는 필름 0.0112 mm, 구 중심 0 mm였다. 10.50 s 최종 수치는 기존 전체 궤적에서 측정했으며, 별도 실행에서의 봉투 대조 범위는 초기 두 스텝이다.

현재 전역 행렬은 조밀한 FP64 행렬이다. 전체 입자 수가 N이면 행렬 하나만 8·(3N)²바이트이고 Cholesky 비용은 통상 O(N³)다. 현재 예제는 고정 장애물까지 포함해 622입자다. 더 큰 장면에서 병목을 옮길 때는 후보 수, 조립 시간, 분해 시간을 따로 측정하고 같은 소형 기준 테스트를 유지한다.

단일 월드의 삼각형 표면과 병진 구 입자가 대상이다. 일반 강체 회전, 마찰 토크, 사면체, 다중 월드 및 임의 비다양체의 굽힘은 검증 범위 밖이다. 장벽은 후보별로 더하며 면적 가중이나 평행 모서리 전용 완화 항이 없다. 메쉬 해상도에 따라 접촉 반응이 바뀔 수 있다. 무진동, 임의 조건의 무관통, 실제 비닐의 주름 형상은 위 소형 테스트만으로 보장되지 않는다. IPC 원 논문의 방법과 범위는 저자 자료에서 확인할 수 있다. Li 외, Incremental Potential Contact, SIGGRAPH 2020



다음 글
Newton에서 옷을 옷걸이에 걸기 · VBD와 Style3D