물리 시뮬레이션 클로스 러그를 Mac 데스크톱에 구현한 방법
요약
이 글은 macOS 데스크톱의 어지러운 아이콘을 물리 시뮬레이션 클로스 러그로 가리는 네이티브 앱 'Desk Rug'에 대한 기술 분석입니다. 이 러그는 XPBD 기반으로 정점 그리드를 사용하여 실제 직물처럼 변형되고, 높이장(height field)과 셰이더를 통해 사실적인 시각 효과와 안정성을 구현했습니다.
핵심 포인트
- XPBD 기반의 클로스 시뮬레이션으로 현실적인 직물 변형을 구현함.
- 높이장(Height Field)을 사용하여 러그가 바닥에 자연스럽게 자리 잡고 미끄러지도록 함.
- 솔버 안정성 개선 및 CPU 사용량 최적화로 실사용성을 높임.
- 전역 단축키와 공간별 프로필 기능을 추가하여 자동화된 사용자 경험 제공.
화면 공유나 화상 통화를 할 때마다 사람들이 가장 먼저 보는 것은 제 데스크톱인데, 그게 난장판입니다. 저는 그냥... 이걸 덮을 방법이 필요했습니다. Dock의 아이콘 숨기기 트릭처럼 아이콘을 감추는 것이 아니라, 말 그대로 러그를 어지러운 곳 위에 던져 놓는 식이죠. 그래서 Desk Rug라는 작은 네이티브 macOS 앱이 개발되어 데스크톱에 살아있는 물리 시뮬레이션 클로스 러그를 얹어줍니다. 하나의 단축키로는 그 아래의 아이콘들을 쓸어 담고, 다른 단축키로는 다시 원래 위치로 되돌립니다.
솔직히 말씀드리자면
제가 이걸 처음부터 만든 것은 아닙니다. Desk Rug는 siliconbag이 MIT 라이선스로 공개한 under-the-rug에서 발전된 것입니다. 이 아이디어는 더 많은 공학적 노력을 받을 자격이 있는 훌륭한 것이었습니다. 제가 한 일은 이것을 분해하고, 문제가 있던 부분들을 재건하는 것이었습니다: 솔버 안정성, 시작 속도, CPU 사용량, 그리고 확장성(더 많은 러그, 더 많은 바닥, 스케줄링, Space별 프로필). 공로를 인정해야 합니다. 이 모든 것은 오리지널 없이는 존재할 수 없습니다.
클로스가 실제로 작동하는 방식
이 러그는 미리 렌더링된 애니메이션이 아니라 XPBD(substepped 방식으로, Ten Minute Physics 스타일의 클로스)로 시뮬레이션되는 정점(vertex) 그리드입니다:
- 약 19pt 간격의 56열 클로스 그리드가 있습니다. 이 간격은 아이콘 더미들이 러그 아래에서 천을 변형시켜 눈에 보이는 볼록한 부분과 접힌 주름들을 만들기에 충분히 작습니다.
- 바닥은 정적 및 운동성 마찰력이 적용된 부호화된 **높이장(height field)**입니다. 따라서 러그는 실제로 직물이 하듯 자리 잡고, 제자리에 머무르며, 미끄러지기도 합니다.
- 아이콘 더미들은 높이장에 볼록한 부분을 추가합니다. 이것이
모든 셰이더는 소스 문자열로부터 런타임에 MSL로 컴파일됩니다. 따라서 Metal toolchain이나 사전 컴파일된 번들(precompiled bundle)이 필요하지 않아 앱 자체가 단일하고 가벼운 바이너리 형태로 유지됩니다. 러그에는 부드러운 방향성 조명, 16탭 포아송 소프트 그림자(Poisson soft shadow), 그리고 플리스 질감은 버텍스 그리드 위에 적용되는 절차적 프래그먼트 패스(procedural fragment pass)를 통해 구현되었습니다.
기존 프로젝트 대비 변경 사항
- 솔버 안정성(Solver stability): 더 타이트한 서브스텝 예산, 속도 제한(velocity caps), 그리고
maxSpeed가드를 추가하여 러그가 정지 상태일 때 발생하는 떨림이나 "눈보라" 같은 깨어남 현상이 사라졌습니다. - 시작 및 CPU: 그리드와 렌더링 경로를 간소화했습니다. 이제 러그는 거의 0%의 CPU만 사용하며 대기합니다.
- 콘텐츠: 러그 6개와 바닥재 6개가 포함되었으며, 사용자 자신의 이미지를 둘 다 공급할 수 있습니다 (UV 매핑된 직물로 처리됩니다).
- 스케줄링: 회의 전에 아이콘을 정리하고 후에 복원하는 일별 스케줄이 추가되었습니다.
- 공간별 프로필(Per-Space profiles): 러그, 바닥재, 크기가 현재 사용 중인 공간(Space)에 따라 달라집니다.
- 자동화: 아이콘은 Finder를 통해 실제로 이동하며 (삭제되는 것은 없음), 화면 가장자리의 정확한 위치로 복원됩니다. Carbon을 이용한 전역 단축키(⌃⌥⌘R)가 추가되었습니다.
- 러그 개수 증가: 12개에서 늘어났으며, 13개의 인터페이스 언어로 배포됩니다.
튜닝 과정의 재미있는 점은 직물 매개변수들이 환경 변수(RUG_G, RUG_BEND, RUG_DAMP, RUG_COLS 등)를 통해 노출되어, 데모 하네스(demo harness)가 재컴파일 없이 값들을 스윕할 수 있었다는 점입니다. 이는 "눈보라 없이 안정적으로 자리 잡는지"를 테스트하는 경우에 매우 유용했습니다.
개인 정보 보호 (Privacy)
계정, 분석 기능, 네트워크 호출, 화면 녹화 권한이 전혀 없습니다. 이 앱은 사용자의 기기에서 Finder를 통해 파일을 이동시킬 뿐, 어떠한 데이터도 외부로 전송하지 않습니다.
사용해 보세요
무료이며, 네이티브 Swift 기반이고 macOS 14 이상을 지원하는 범용 바이너리입니다. 아직 노타라이즈(notarized)되지 않았으므로, 첫 실행은 _오른쪽 클릭 → 열기_를 통해 진행해야 합니다.
다운로드: [https://artapps.dev/desk-rug-macos]
이 재구축 버전이 잘 작동하는지 궁금합니다. 특히 60 fps로 직물을 드래그하는 느낌이 어떨지 알고 싶습니다. 기본 프로젝트의 라이선스를 존중하며 PR이나 이슈를 환영합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기