옷걸이를 흔들었을 때 소매가 비슷하게 움직여도, 멈춘 뒤 밑단이 벌어지는 정도는 다를 수 있다. 같은 유니섹스 셔츠를 Newton VBD와 Style3D에 걸어 이 차이를 측정했다. 이어서 실제 재단 패턴을 가진 여성용 반팔 티셔츠로 한쪽 어깨부터 옷걸이를 끼웠다. 마지막 실험에서는 같은 옷걸이에 여성용 긴팔 스웨트셔츠를 걸어 손을 대지 않은 상태의 움직임을 확인했다.
반팔 티셔츠를 한쪽 어깨부터 걸기
Female_T_Shirt.usd. 왼쪽은 겉면, 오른쪽은 같은 시각의 반투명 보기다. 주황색과 초록색 점은 각각 첫 번째와 두 번째 파지 위치를 가리킨다. 목 밖의 둥근 고리와 옷 안에서 회전하는 양쪽 끝을 함께 볼 수 있다.MuJoCo Warp에서 위치 액추에이터 5개로 옷걸이의 이동 3축과 회전 2축을 구동한다. Newton Style3D는 옷걸이의 실제 관절 위치를 받아 천을 계산한다. 양손을 놓은 첫 프레임은 8.97초다. 이후 옷은 어깨 접촉만으로 지탱되며, 옷걸이가 좌우로 움직일 때 소매와 밑단이 뒤따라온다. 천이 옷걸이에 가하는 반력은 이 구성에서 MuJoCo로 되돌려 보내지 않는다.
VBD와 Style3D에서 밑단과 주름은 어떻게 달라졌나
두 솔버에 같은 유니섹스 셔츠의 시작 정점 3,033개와 삼각형 5,938개를 넣었다. 이미 걸린 옷을 3초 동안 둔 뒤, 옷걸이를 2초간 좌우로 흔들고 1초간 멈췄다. 구동은 최대 진폭 계수 5 cm, 1 Hz의 사인파에 시작과 끝이 부드러운 포락선을 곱했다. 이 6초 실험에서는 두 경우 모두 옷에 파지 구속을 걸지 않았다.
| 같은 셔츠에서 측정한 항목 | VBD | Style3D |
|---|---|---|
| 3초의 밑단 중앙 앞뒤 간격 | 5.76 cm | 13.21 cm |
| 3초의 몸통 세로 / 가로 잔굴곡 RMS | 0.093 / 0.560 mm | 0.116 / 0.553 mm |
| 흔드는 동안 몸통 가로의 넓은 굴곡 RMS 최댓값 | 13.20 mm | 7.09 mm |
| 흔드는 동안 소맷단 중심의 최대 좌우 변위 | 4.57 cm | 4.45 cm |
| 정지 후 마지막 0.5초, 밑단 중심 좌우 이동 범위 | 2.62 mm | 1.03 mm |
흔들 때 소매 이동량은 0.12 cm 차이였지만, 정지 상태의 밑단 간격은 7.45 cm 차이였다. VBD 설정에서는 밑단이 더 납작했고 흔들 때 몸통의 큰 굴곡은 더 깊었다. 잔굴곡은 앞·뒤판의 같은 재료점을 따라 4 cm 구간의 중점 깊이를 측정하고, 12 cm 구간의 완만한 곡률 성분을 빼서 구했다. 넓은 굴곡은 12 cm 구간에서 직접 측정했다. 실제 의류를 촬영해 맞춘 수치가 아니므로 어느 쪽이 현실에 더 가까운지는 이 실험만으로 판정할 수 없다.
같게 둔 조건과 솔버에 따라 달라지는 입력
비교에 사용한 Newton은 1.7.0, Warp는 1.18.0이다. 두 경우 모두 Z-up, 중력 9.81 m/s², 면밀도 0.10 kg/m², 입자 반경 8 mm, 시간 간격 1/600초다. 옷걸이 자세는 120 Hz로 갱신하고 매 서브스텝에 강체 접촉을 계산했다. 강체 형상 마찰 입력은 0.02, 천–강체 접촉 입력 (ke, kd, mu)는 (10000, 0.01, 0.3), 탐색 간격은 8 mm였다. 두 경우에 같은 정점별 속도 제곱 항력 계수 0.0005를 사용했다.
| 구현 | Newton VBD | Newton Style3D |
|---|---|---|
| 변형을 푸는 방법 | 같은 색 그룹 안의 정점은 병렬로, 그룹 사이는 순차적으로 갱신한다. 서브스텝당 8회 반복했다. | Projective Dynamics로 재료 제약의 목표를 갱신하고 천 전체의 변위를 PCG로 푼다. 외부 반복 4회, 내부 선형 반복 설정은 10회다. |
| 막과 굽힘 | Neo-Hookean 막 입력 tri_ke=tri_ka=500, 이웃 삼각형의 굽힘 edge_ke=0.0625. 정지 이면각을 0으로 두었다. 삼각형·모서리 감쇠 입력은 각각 0.001이다. | 위사·경사·전단 강성 (100,100,10)과 방향별 굽힘 (2e-5,1e-5,5e-6). 유니섹스에는 실물 재단 좌표가 없어 삼각형 접평면에 세로축을 투영해 재료축을 구성했다. |
| 접촉과 적용처 | 자기접촉을 켜고 탐색 마진 6 mm, 간격 3 mm로 설정했다. 강체·연체를 함께 처리할 수 있으며, 이번 비교에서는 옷걸이를 외부 구동했다. | Style3D 내부의 천 자기접촉과 Newton 충돌 파이프라인의 강체 접촉을 사용했다. 재단 조각의 실 방향과 면적을 보존할 수 있어 공식 의류 장착 실험에 선택했다. |
표는 실행한 두 설정을 비교한다. VBD의 이면각 기준과 Style3D의 재료 좌표가 다르고 강성 계수도 서로 다른 에너지 식에 들어간다. 따라서 밑단 간격 차이 전체를 반복 알고리즘 한 가지의 효과로 해석할 수 없다. Newton VBD 문서 · Newton 1.7.0 Style3D 공식 예제
VBD 비교 설정은 위 표에 정리했다. 공개 API의 사용 방법은 Newton VBD 공식 문서에서 확인할 수 있다.
공식 의류의 재단 패턴과 원단 설정
공식 USD에는 봉제 후의 3D 삼각형과 재단 전의 2D 삼각형이 모두 있다. 솔기에서 이어진 3D 정점 하나가 패턴에서는 여러 조각의 서로 다른 꼭짓점으로 나뉜다. 그래서 각 삼각형의 세 모서리점에 해당하는 UV 인덱스도 별도로 읽어야 한다. 공식 파일의 3D 길이는 m, 패턴 좌표 primvars:st는 mm다. 패턴 좌표에만 0.001을 곱한다. Style3D USD 형식 설명
다음은 공개 라이브러리 Newton의 API로 재단 좌표를 읽는 방법을 보여 주는 의사코드다. garment_prim은 OpenUSD로 연 공식 의류 USD에서 선택한 의류 프림이다. 파일 열기와 프림 선택은 입력 준비 단계로 생략했다. API와 단위 변환의 출처는 Newton 1.7.0 공식 Style3D 예제다.
import newton.usd
mesh, pattern_indices = newton.usd.get_mesh(
garment_prim,
load_uvs=True,
preserve_facevarying_uvs=True,
return_uv_indices=True,
)
pattern_vertices_m = mesh.uvs * 0.001
반팔은 45,167정점·89,912삼각형, 긴팔은 24,510정점·48,824삼각형이다. 양쪽 모두 원본 해상도를 사용했다. 함수에 넘긴 면밀도는 0.30 kg/m², 입자 반경은 5 mm다. 반팔의 패턴 면적은 0.6154 m²로, 면밀도를 곱하면 약 185 g이다. 입자 반경은 충돌 계산의 길이 척도다. 실제 원단 두께와 별도로 취급한다. 두 여성용 의류에 같은 공식 티셔츠 예제의 원단값을 썼으므로, 긴팔에서 관찰한 차이에는 소매 길이와 재단 형상의 영향이 들어 있다. Newton 1.7.0 공식 원단 설정
읽은 3D 정점과 면, m 단위의 패턴 정점과 패턴 인덱스는 공개 API newton.solvers.style3d.add_cloth_mesh의 입력으로 넘긴다. 빌더에 Style3D 속성을 등록하는 순서와 전체 호출 형식은 위의 버전별 공식 예제에서 확인할 수 있다.
손이 바뀌는 순간, 옷깃을 풀어 준다

- 첫 어깨를 16 cm 든다. 목과 이어진 어깨의 작은 영역을 잡는다. 가상 손이 잡는 정점만 매 스텝 지정 위치로 옮기며, 나머지 정점은 중력과 접촉에 반응한다.
- 옷걸이 끝을 목으로 넣는다. 옷걸이를 0.62 rad 기울여 잡은 쪽 소매 방향으로 첫 패드를 밀어 넣는다. 옷걸이 중심을 직접 지정하면 회전할 때 끝이 원호를 그린다. 목표 패드 위치에서 회전된 오프셋을 빼면 회전 중에도 먼저 들어간 끝을 원하는 위치에 둘 수 있다.
- 반대 소매를 현재 위치에서 잡는다. 약 3.23초에 첫 끝만 안에 있는지 확인했다. 두 번째 손이 닫힐 때 변형된 정점 위치를 새 기준으로 저장한 뒤 소매를 옆으로 당긴다. 첫 손은 바깥쪽 몇 점만 남겨 옷깃이 다른 끝을 따라 미끄러지게 한다.
- 수평을 맞추고 양손을 놓는다. 고리를 옷깃 위에 둔 채 반대 끝을 통과시키고 중심을 맞춘다. 양쪽 파지를 해제한 뒤 옷걸이를 최대 ±3 cm 목표로 번갈아 움직이고 멈춘다.
이를 일반적인 강체 좌표 변환으로 나타내면 아래와 같다. NumPy만 사용하는 설명용 의사코드이며, rotation은 로컬 좌표를 월드 좌표로 옮기는 3×3 회전 행렬, local_tip은 로컬 기준 패드 위치, target_tip은 목표 월드 위치다. NumPy 행렬 곱 문서
import numpy as np
center = np.asarray(target_tip) - np.asarray(rotation) @ np.asarray(local_tip)
| 옷마다 바꾼 값 | 유니섹스 반팔 | 공식 여성용 반팔 |
|---|---|---|
| 첫 어깨 파지 정점 수 → 바깥쪽만 남긴 수 | 67 → 16 | 55 → 17, 처음에 14 mm 이상 간격 |
| 반대 소매 파지 중심 / 정점 수 | (−.145, .060, 1.055) / 16 | (−.147, .058, 1.079) / 14, 12 mm 이상 간격 |
| 첫 끝의 목 진입 목표 | (.042, .032, 1.056) | (.037, .033, 1.056) |
| 잡은 어깨 안쪽의 깊은 목표 | (.142, .039, .915) | (.135, .046, .934) |
| 반대 소매를 당긴 목표 | (−.249, .034, 1.100) | (−.230, .037, 1.104) |
좌표는 옷을 방향·위치 정렬한 뒤의 (좌우 X, 깊이 Y, 높이 Z), 단위는 m다. 삽입·당김 목표에는 초기 배치 이동량과 16 cm 들기 변위를 더해 월드 좌표로 변환한다. 공식 반팔에는 방향을 맞추기 위해 Z축 주위 180° 회전을 먼저 적용했다. 다른 옷에서는 목 경계와 양쪽 어깨를 찾아 이 좌표를 다시 정한다. 같은 영역 안의 정점을 전부 고정하면 고해상도 셔츠에서는 수백 점이 붙잡혀 옷깃이 굽을 여유가 사라진다.
어깨 패드가 뚫리는 문제와 고리 검사
옷걸이 충돌체는 철사 메쉬와 좌우 9개씩의 구형 패드로 구성했다. 패드 반경은 24 mm, 각 팔의 가장 바깥쪽 패드 중심은 중앙에서 20.5 cm 떨어져 있다. 여성용 의류 실험은 원단값을 유지하고 천–강체 접촉 입력을 ke=500, kd=1e-5, mu=0.2로 두었다. 형상 마진은 철사 6 mm, 패드 2 mm다. 매 1/600초마다 구동, 접촉 갱신, 천 계산 순서를 지킨다.

한 서브스텝에서는 다음 순서로 상태를 갱신한다.
- 강체 구동을 계산하고 실제 옷걸이 자세를 구한다.
- 이 자세를 천 접촉 계산에 반영하고, 활성 파지점의 목표 위치를 적용한다.
- 현재 상태에서 충돌 후보를 구한 뒤 천의 다음 상태를 계산한다.
- 다음 계산을 위해 현재 상태와 다음 상태의 역할을 바꾼다.
목표 명령 대신 강체 솔버가 계산한 실제 자세를 전달하는 것이 중요하다. 가상 파지는 활성 그룹의 정점 위치를 지정하는 방식이다. 손가락 마찰, 필요한 악력, 로봇 관절 토크를 평가하려면 실제 그리퍼를 모델링하고 반력을 전달해야 한다.
무엇을 측정하면 ‘걸렸다’고 볼 수 있을까
철사 삼각형과 천 삼각형의 교차, 패드 중심에서 천 삼각형까지의 최단거리에서 반경을 뺀 값, 목·소매 둘·밑단을 임시로 막았을 때의 안팎을 따로 검사했다. 이 가상 덮개는 측정에만 쓰인다. 둥근 고리 526개 삼각형이 덮개를 가로지르는지 검사하고 고리 기준점의 감김수도 기록했다. 바깥이면 감김수는 0에 가깝다. 두 끝의 패드는 옷 안쪽, 고리는 바깥쪽이어야 한다.
| 여성용 반팔 장착 판정 | 저장된 결과 |
|---|---|
| 0초 → 3.23초, 옷걸이 양 끝의 위치 | 양쪽 밖 → 먼저 넣은 끝만 안 |
| 7,320 서브스텝의 철사–천 교차 / 둥근 고리–개구부 교차 | 0회 / 0회, 최대 |고리 감김수| 1.08×10⁻⁶ 미만 |
| 패드 표면과 천 중간면의 최소 간격 | +6.55 mm |
| 양손을 놓은 뒤, 좌우 대표 패드 4개 중심이 모두 안쪽 | 98 / 98 프레임, 최종 옷의 최저점은 탁자 위 10.73 cm |
최소 간격은 충돌 여유 거리가 포함된 기하학적 측정값이다. 이 값으로 패드별 수직 하중을 계산할 수는 없다. 또한 교차 검사는 각 서브스텝의 끝에서 수행했으므로 두 시점 사이의 연속 충돌까지 증명하지는 않는다.
공식 여성용 긴팔 스웨트셔츠를 흔들면
Women_Sweatshirt.usd의 6초 실험. 0–3초는 중력으로 정착, 3–5초는 좌우 구동, 5–6초는 정지 후 감쇠다. 자유롭게 내려온 긴 소매와 밑단 시보리 위의 주름을 볼 수 있다. 공식 스웨트셔츠 원본이 실험은 두 어깨가 옷걸이에 들어간 상태에서 시작했다. 어깨를 지지하는 물체는 반팔과 같은 옷걸이이며, 전 구간에 파지 정점은 없다. 스웨트셔츠의 원래 길이를 유지하고 USD의 (x, −z, y)를 월드축으로 삼아 (0, 0.043, −0.373) m 평행이동했다. 첫 배치에서 패드가 천 안으로 7.47 mm 겹치는 것을 발견해 이 위치를 조정했다. 채택한 배치의 초기 최소 간격은 +6.29 mm였다.
3 cm를 진폭 계수로 둔 1 Hz 구동에서 옷걸이는 실제로 좌우 약 2.60 cm까지 움직였다. 정착 직후를 기준으로 +X 쪽 소맷단 정점군의 중심은 최대 3.31 cm 움직였고, 마지막 0.5초 동안의 좌우 이동 범위는 1.45 mm였다. 초기 상태와 3,600 서브스텝에서 패드 최소 간격은 +6.28 mm, 철사–천 교차와 둥근 고리–개구부 교차는 모두 0회였다. 대표 패드 네 개의 중심은 181개 저장 프레임 모두에서 안쪽에 있었다. 긴팔에서 검증한 구간은 장착 후의 정착과 흔들기다.
공개 예제로 확인하기
실험은 Python 3.12와 CUDA 장치에서 Newton 1.7.0, Warp 1.18.0, MuJoCo와 MuJoCo Warp 3.15.0을 사용했다. 공개 라이브러리의 설정 방법과 원본 의류는 다음 자료에서 확인할 수 있다.
- Newton 1.7.0 공식 Style3D 예제: 공식 의류의 3D 메쉬·재단 좌표를 읽고 천 모델과 접촉 계산을 설정하는 예제.
- 공식 의류와 USD 형식 설명: 여성용 티셔츠·스웨트셔츠 원본과 재단 데이터 설명.
- Newton VBD 문서: 솔버의 사용 범위와 공개 API 설명.
공식 예제에서 의류 로딩과 원단 설정을 먼저 확인한 뒤, 본문의 조건을 바탕으로 옷걸이 형상·구동·파지 목표·검사 절차를 별도로 구성해야 한다. 이 글은 저장된 실험 결과와 설정을 설명하며, 영상의 전체 실행 코드와 로컬 모듈을 제공하지 않는다.