st-tech/ppf-contact-solver
요약
ZOZO, Inc.에서 개발한 물리 기반 시뮬레이션을 위한 고성능 접촉 솔버입니다. 쉘, 고체, 로드를 포함한 복잡한 물리 연산을 GPU 병렬 처리를 통해 대규모로 수행하며, Blender 애드온과 Python API를 지원합니다.
핵심 포인트
- 1억 8천만 개 이상의 접촉을 처리하는 극한의 확장성
- FEM(유한 요소법) 기반의 정밀한 변형체 시뮬레이션
- GPU 가속을 통한 대규모 병렬 처리 및 캐시 효율성
- Blender 애드온 및 MCP 지원을 통한 LLM 연동 가능
👚 쉘 (shells), 🪵 고체 (solids), 🪢 로드 (rods)를 포함하는 물리 기반 시뮬레이션 (physics-based simulations)을 위한 접촉 솔버 (contact solver)입니다. 모두 일본 최대 패션 이커머스 기업인 ZOZO, Inc.에서 제작되었습니다.
🤖 저희는 독자들이 저자의 독창적인 목소리와 어조를 듣기를 기대한다는 점을 매우 존중하며, 이를 유지하기 위해 노력합니다. LLM (Large Language Models)의 사용 여부는 (Markdown)에 명시되어 있습니다.
🎨 저희의 Blender 애드온 (Blender add-on)을 통해 원격으로 시뮬레이션하세요 (스크린샷은 macOS에서 촬영되었습니다; Windows 또는 Linux에서 최신 NVIDIA GPU를 보유하고 있다면 로컬에서도 실행할 수 있습니다)
blender-addon-trailer-2026.mp4
🚀 또는 start.bat를 더블 클릭하거나
(Windows) 또는 Docker 명령어를 실행하여 (Linux/Windows) 구동할 수 있습니다.
🌐 URL을 클릭하여 저희의 예시들을 살펴보세요.
💪 견고함 (Robust): 접촉 해결 (Contact resolutions) 시 침투 (penetration)가 발생하지 않습니다. 엉키는 교차 (snagging intersections)도 없습니다.
⏲ 확장성 (Scalable): 100만 개가 아니라, 1억 8천만 개 이상의 접촉을 포함하는 극한의 사례도 처리합니다.
🚲 캐시 효율성 (Cache Efficient): GPU 상의 모든 작업은 단정밀도 (single precision)로 실행됩니다. 배정밀도 (double precision)는 사용하지 않습니다.
🥼 고무 같지 않음 (Not Rubbery): 삼각형이 엄격한 상한선(예: 1%)을 절대 벗어나지 않습니다.
📐 유한 요소법 (Finite Element Method): 변형체 (deformables)를 위해 FEM을 사용하며, 기호적 힘 자코비안 (symbolic force jacobians)을 사용합니다.
⚔️ 고부하 테스트 (Highly Stressed): GitHub Actions를 통해 스트레스 테스트를 10회 연속으로 실행합니다.
🚀 대규모 병렬 처리 (Massively Parallel): 접촉 (contact) 및 탄성 (elasticity) 솔버 모두 GPU에서 실행됩니다.
🪟 Windows 실행 파일 (Windows Executable): 설치 마법사가 나타나지 않습니다. 그저 압축을 풀고 실행하면 됩니다 (Video).
🐳 Docker 밀봉 (Docker Sealed): 모두 빠르게 배포할 수 있습니다. 이미지는 약 1GB입니다.
🌐 JupyterLab 포함 (JupyterLab Included): 브라우저를 열어 즉시 예시를 실행할 수 있습니다 (Video).
🐍 문서화된 Python API (Documented Python APIs): 저희의 Python 코드는 docstring이 완벽하게 작성되어 있으며 린트 (lintable)가 가능합니다 (Video).
☁️ 클라우드 준비 완료 (Cloud-Ready): 저희 솔버는 주요 클라우드 플랫폼에 원활하게 배포될 수 있습니다.
🎨 Blender 애드온 (Blender Add-on): macOS에서도 원격으로 시뮬레이션하고 결과를 로컬로 가져올 수 있습니다.
🤖 MCP 지원 (MCP Support): 자연어를 사용하여 LLM이 당신을 대신해 시뮬레이션을 실행하게 하세요.
✨ 깔끔한 유지 (Stay Clean): 사용 후 모든 흔적을 제거할 수 있습니다.
📜 허용적인 라이선스 (Permissive License): Apache 2.0 라이선스는 상업적 및 독점적 사용을 허용합니다.
⚠️ 오프라인 용도로 제작되었습니다; 실시간(Real-time) 방식이 아닙니다. 일부 예제는 상호작용 가능한 속도로 실행될 수 있습니다.
-
📝 변경 이력 (Change History)
-
🎓 기술 자료 (Technical Materials)
-
⚡️ 요구 사항 (Requirements)
-
💨 시작하기 (Getting Started)
-
🐍 사용 방법 (How To Use)
-
🔍 로그 확보하기 (Obtaining Logs)
-
🖼️ 카탈로그 (Catalogue)
-
🚀 GitHub Actions
-
📡 클라우드 서비스에 배포하기 (Deploying on Cloud Services)
-
🤝 커뮤니티 작업 (Community Works)
-
💼 상업적 이용 및 그 이상 (Commercial Use and Beyond)
-
📬 기여하기 (Contributing)
-
💬 토론 참여하기 (Participating Discussions)
-
📨 저자에게 연락하기 (Reaching the Author)
-
🙏 감사의 글 (Acknowledgements)
-
🧑 개발 환경 설정 (Setting Up Your Development Environment) (Markdown)
-
🐞 버그 수정 및 업데이트 (Bug Fixes and Updates) (Markdown)
-
(2026.04.30) Blender 애드온(Add-on) 지원을 추가했습니다. 문서를 참조하세요.
-
(2025.12.18) 네이티브 Windows 독립 실행형 실행 파일(Standalone executable) 빌드 지원을 추가했습니다 (Video).
-
(2025.11.26) 대규모 예제에 large-woven.ipynb (Video)를 추가했습니다.
-
(2025.11.12) 1억 8천만 개 이상의 개수를 보여주는 five-twist.ipynb (Video) 및 large-five-twist.ipynb (Video)를 추가했습니다. 대규모 예제를 참조하세요.
-
(2025.10.03) 코드베이스의 대대적인 리팩토링 (Massive refactor)을 진행했습니다 (Markdown). 이 변경 사항에는 Python API에 대한 파괴적 변경(Breaking changes)이 포함되어 있음에 유의하십시오.
-
(2025.08.09) Poya et al. (2023)의 선행 연구를 인정하기 위해 고유값 시스템 분석 (Eigensystem analysis)에 사후적 주석 (Hindsight note)을 추가했습니다.
-
(2025.05.01) 이제 시뮬레이션 상태 (Simulation states)를 저장하고 불러올 수 있습니다 (Video).
추가 이력 기록
-
(2025.04.02) 9개의 예제를 추가했습니다. catalogue를 참조하세요. - (2025.03.03) AWS 예산 표를 추가했습니다. - (2025.02.28) 저희 TOG 논문의 참조 브랜치(reference branch) 및 Docker 이미지를 추가했습니다. - (2025.02.26) hindsight에 ACCD에서의 부동 소수점 반올림 오차(Floating Point-Rounding Errors)에 관한 내용을 추가했습니다. - (2025.02.07) 말랑말랑한 공(squishy balls)을 사용하여 trapped 예제 (Video)를 업데이트했습니다. - (2025.03.03) AWS 예산 표를 추가했습니다. - (2025.02.28) 저희 TOG 논문의 참조 브랜치(reference branch) 및 Docker 이미지를 추가했습니다. - (2025.02.26) hindsight에 ACCD에서의 부동 소수점 반올림 오차(Floating Point-Rounding Errors)에 관한 내용을 추가했습니다. - (2025.02.07) 말랑말랑한 공(squishy balls)을 사용하여 trapped 예제 (Video)를 업데이트했습니다. - (2025.1.8) 도미노 예제 (Video)를 추가했습니다. - (2025.1.5) 단일 비틀림 예제 (Video)를 추가했습니다. - (2024.12.31) Python API, 파라미터(parameters) 및 로그 파일에 대한 전체 문서 (GitHub Pages)를 추가했습니다. - (2024.12.27) 변형 제한(strain limiting)을 위한 라인 서치(Line search)가 개선되었습니다 (Markdown) - (2024.12.23) (버그 수정 및 업데이트)를 추가했습니다 - (2024.12.21) 카드 집 예제 (Video)를 추가했습니다 - (2024.12.18) 경사면을 미끄러지는 아르마딜로를 포함한 마찰 접촉(frictional contact) 예제 (Video)를 추가했습니다 - (2024.12.18) 기울기 각도가 아니었다는 점을 언급한 hindsight를 추가했습니다## siga2024-main-mini.mp4
-
📚 ACM Transactions on Graphics (TOG) Vol.43, No.6에 게재됨
-
🎥 메인 비디오 (Video)
-
🎥 추가 비디오 예시 (Directory)
-
🎥 발표 영상 (Short) (Long)
-
📃 메인 논문 (PDF) (Hindsight)
-
📊 보충 자료 PDF (PDF)
-
🤖 보충 스크립트 (Directory)
-
🔍 특이값 고유값 분석 (Singular-value eigenanalysis) (Markdown)
메인 브랜치(main branch)는 빈번한 업데이트가 진행 중이며 논문 내용과 차이가 발생할 수 있습니다.
논문과의 일관성을 유지하기 위해, 새로운 브랜치인 sigasia-2024를 생성했습니다.
-
🛠️ 이 브랜치는 유지보수 업데이트만 계획되어 있습니다.
-
🚫 일반 사용자들은 최적의 성능을 위해 최적화되어 있지 않으므로 이 브랜치를 사용해서는 안 됩니다.
-
🚫 이 (Markdown)에 나열된 모든 알고리즘 변경 사항은 이 브랜치에서 제외됩니다.
-
📦 또한 이 브랜치의 사전 컴파일된 Docker 이미지를 제공합니다:
ghcr.io/st-tech/ppf-contact-solver-compiled-sigasia-2024:latest -
🌐 vast.ai를 위한 템플릿 링크
-
🔥 CUDA 12.8 이상을 지원하는 NVIDIA GPU. 대규모 시뮬레이션에는 RTX 4090 또는 5090이 이상적이며, 소규모에서 중규모 워크로드에는 RTX 3090, 4070 또는 5070이 적합합니다.
-
💻 x86 아키텍처 (arm64는 지원되지 않음)
-
🐳 Docker 환경 (아래 참조) 또는 네이티브 실행 파일을 위한 🪟 Windows 10/11 (아래 참조)
-
🎨 Blender 5+ (Blender 애드온을 사용할 경우에만 해당)
Blender 애드온을 사용할 계획이든 JupyterLab 인터페이스를 사용할 계획이든, 솔버 엔진(solver engine) 자체를 먼저 배포해야 합니다. 아래 단계는 두 경우 모두에 적용됩니다.
⚠️ warmup.py를 로컬에서 실행하지 마십시오. 실행할 경우 실패할 가능성이 매우 높으며 정리하기가 어려울 수 있습니다.
Windows 10/11 사용자를 위해 독립 실행형 실행 파일(~320MB)을 사용할 수 있습니다. Python, Docker 또는 CUDA Toolkit 설치가 필요하지 않습니다. 모든 것이 즉시 작동해야 합니다 (Video).
🤔 신중을 기하고 싶다면, 빌드 워크플로우(build workflow)를 직접 검토하여 안전성을 확인할 수 있습니다. 저희는 투명성을 극대화하기 위해 노력하며, 로컬에서 빌드하여 업로드하는 방식은 절대 사용하지 않습니다.
- 최신 NVIDIA 드라이버 설치 ([Link])
- GitHub Releases에서 최신 릴리스를 다운로드하고 압축을 해제합니다.
start.bat를 더블 클릭합니다.
JupyterLab 프론트엔드 (frontend)가 자동으로 시작됩니다. http://localhost:8080 에서 접속할 수 있습니다.
호스트 시스템에 NVIDIA 드라이버 ([Link])를 설치하고, Docker를 실행하기 위해 운영 체제별로 아래 지침을 따르십시오:
| 🐧 Linux | 🪟 Windows |
|---|---|
여기 ([Link])에서 Docker 엔진을 설치하십시오. 또한, NVIDIA Container Toolkit ([Link])을 설치하십시오. Container Toolkit이 로드되었는지 확인하려면 sudo service docker restart를 실행하십시오. | Docker Desktop ([Link])을 설치하십시오. 설치 후 로그아웃하거나 재부팅이 필요할 수 있습니다. 다시 로그인한 후, Docker Desktop을 실행하여 Docker가 작동 중인지 확인하십시오. |
다음으로, 컨테이너 (container)를 시작하기 위해 다음 명령어를 실행하십시오. 수정이 필요 없다면 그대로 복사하여 붙여넣으십시오:
$MY_WEB_PORT = 8080 # 사용자 측 JupyterLab 포트 (port)
$MY_BLENDER_PORT = 9090 # Blender 애드온 (add-on)용 솔버 (solver) 포트
$IMAGE_NAME = "ghcr.io/st-tech/ppf-contact-solver-compiled:latest"
...
MY_WEB_PORT=8080 # 사용자 측 JupyterLab 포트 (port)
MY_BLENDER_PORT=9090 # Blender 애드온 (add-on)용 솔버 (solver) 포트
IMAGE_NAME=ghcr.io/st-tech/ppf-contact-solver-compiled:latest
...
이미지 (image) 다운로드가 시작됩니다. 저희 이미지는 GitHub Container Registry에 호스팅되어 있습니다 (~1GB). 그 후 JupyterLab이 자동으로 시작됩니다. 최종적으로 다음과 같은 메시지가 보여야 합니다:
==== JupyterLab Launched! 🚀 ====
Press Ctrl+C to shutdown
...
다음으로, 브라우저를 열고 http://localhost:8080 으로 이동하십시오. MY_WEB_PORT 변수를 변경하면 포트 8080을 변경할 수 있습니다.
터미널 (terminal) 창을 열어둔 상태를 유지하십시오.
이제 모든 준비가 완료되었습니다! 🎉
컨테이너를 종료하려면 터미널에서 Ctrl+C를 누르기만 하면 됩니다.
컨테이너가 제거되고 모든 흔적이 정리됩니다. 🧹
컨테이너를 백그라운드 (background)에서 계속 실행하고 싶다면, --rm을 -d로 바꾸십시오.
컨테이너를 종료하고 삭제하려면 docker stop ppf-contact-solver && docker rm ppf-contact-solver를 실행하십시오.
.
Docker 이미지를 처음부터 직접 빌드(build from scratch)하고 싶다면, 더 깔끔한 설치 가이드 (Markdown)를 참조하십시오.
저희는 두 가지 프론트엔드(frontend)를 제공합니다: Blender 애드온(add-on)과 JupyterLab 인터페이스입니다. Blender 애드온을 사용하면 Blender의 UI 내에서 완전히 장면(scene)을 구축하고 시뮬레이션(simulation)을 실행할 수 있으며, JupyterLab을 사용하면 브라우저에서 모든 것을 Python으로 스크립팅할 수 있습니다. 두 방식 모두 동일한 솔버 엔진(solver engine)과 통신하므로 원하는 방식을 선택하십시오.
두 경우 모두, 실제 시뮬레이션은 인터넷을 통해 원격 헤드리스 서버(remote headless server)에서 실행되는 동안 사용자는 노트북에서 시뮬레이터와 상호작용할 수 있습니다.
이는 NVIDIA 하드웨어를 소유할 필요가 없다는 것을 의미하며, vast.ai에서 시간당 0.5달러 미만의 비용으로 대여할 수 있습니다.
물론, 로컬 Windows 또는 Linux 머신에 최신 NVIDIA GPU가 있다면 솔버를 직접 실행할 수도 있습니다.
실제로, 이 (Video)는 vast.ai 인스턴스에서 녹화되었습니다.
사용 경험이 매우 좋습니다! 👍
저희의 Blender 애드온은 모든 것이 로컬에서 작동하는 것처럼 느껴지는 친숙한 UI를 제공하는 것을 목표로 하지만, 내부적으로는 모든 시뮬레이션이 실행되는 원격 서버와 통신한 후 결과를 다시 가져옵니다.
이를 통해 사용자는 로컬 Blender 환경에서 원활하게 작업하면서 강력한 원격 (remote) GPU를 활용할 수 있는 독특한 경험을 누릴 수 있습니다. 놀랍게도, 로컬 NVIDIA GPU를 요구하는 다른 CUDA 기반 물리 시뮬레이터 애드온들과 달리, 저희의 Blender 애드온은 macOS 시스템에서도 작동합니다 😊.
더 중요한 점은, 배터리가 빨리 소모될 걱정 없이 노트북으로 작업할 수 있다는 것입니다. 🔋
애드온 설치 방법은 이 페이지의 How to Install을 따르십시오. 워크플로우(workflow)에 대한 철저한 안내를 위해 아래의 문서를 참조하십시오:
주요 특징은 다음과 같습니다:
저희는 워크플로우 가이드와 애드온 녹화 워크스루(walkthrough)가 포함된 전체 문서 사이트를 유지 관리하고 있습니다:
| 워크플로우 문서 페이지. (Link) | 비디오 튜토리얼 페이지. (Link) |
Blender 내부에서 애드온(add-on)이 실행되는 몇 가지 스크린샷입니다:
| Blender에 설정된 Kite 장면. (full-size) | Blender에 설정된 Zebra 장면. (full-size) |
우리는 MCP 서버를 통해 애드온의 모든 도구를 노출하므로, 어떤 LLM (Claude, Codex 등)이라도 자연어 프롬프트(natural language prompt)를 통해 전체 파이프라인(pipeline)을 제어할 수 있습니다. 장면 구축(Scene building), 파라미터 조정(parameter tweaks), 시뮬레이션 실행이 모두 UI 클릭 없이 이루어집니다. 다음은 두 가지 예시입니다:
| 애드온의 MCP 서버를 통해 Blender(오른쪽)를 제어하는 Codex(왼쪽). | 프롬프트: 구체 위에 시트를 드리우고 300프레임의 mp4 애니메이션 비디오로 렌더링해줘. |
또한 Blender의 스크립팅 에디터(scripting editor) 내에서 Python 스크립트를 통해 전체 파이프라인을 제어할 수도 있습니다. 이는 절차적 장면 설정(procedural scene setup) 및 배치 변형 생성(batch variant generation)에 유용합니다. 아래는 구체 위에 시트를 드리우는 전체 예시입니다:
import addon_utils
import importlib
import bpy
...
스크립트가 Blender 내부에서 실행되는 방식은 다음과 같습니다 (full-size):
전체 solver.*에 대해서는,
표면(surface), Blender Python API 가이드를 참조하십시오.
우리의 프론트엔드(frontend)는 내장된 JupyterLab 인터페이스를 사용하여 브라우저를 통해 접속할 수 있습니다. 처음 열었을 때 모든 설정이 완료됩니다. 결과는 브라우저를 통해 대화형으로 확인하고 필요에 따라 내보낼 수 있습니다. 우리의 Python 인터페이스는 다음과 같은 원칙을 염두에 두고 설계되었습니다:
🛠️ 파이프라인 내 Tri/Tet 생성: 삼각측량(triangulation) 또는 사면체화(tetrahedralization)를 위해 외부 3D/CAD 소프트웨어에 의존하면 동적인 해상도 변경이 번거로워집니다. 우리는 편리한 .triangulate() 및 .tetrahedralize()를 제공합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Python (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기