👚 쉘 (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).
추가 이력 기록
메인 브랜치(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()를 제공합니다.