Hacker News

Halfspace experimental IDE for solid modeling with distance fields

거리장 기반 솔리드 모델링 실험용 IDE, Halfspace

Halfspace는 Fidget 기하 커널을 감싼 실험용 솔리드 모델링 IDE입니다. 거리장 값을 직접 시각화해 모델 오류를 살피고, Rust·egui·wgpu를 활용해 웹과 네이티브 환경에서 GPU 렌더링을 지원합니다.

AI 요약

Halfspace는 거리장(distance field)을 활용해 솔리드 모델을 만들고 살펴보는 실험용 IDE입니다. 개발자 Matt Keeter는 자신의 Fidget 기하 커널을 GUI로 감싸, 사전 정의된 도형과 스크립트로 모델을 작성하고 이미지나 삼각형 메시로 내보내도록 구성했습니다. 프로젝트는 2025년 4월부터 개발했으며, 오픈소스 MPLv2 라이선스로 공개했습니다. 작성자는 중요한 작업에 바로 쓰기에는 아직 실험 단계라고 설명합니다.

암시적 표면으로 솔리드 모델링

솔리드 모델은 공간의 한 점을 골랐을 때 모델 안인지 밖인지 판별할 수 있는 물체를 뜻합니다. 게임용 모델처럼 얇은 삼각형 벽으로 이루어진 표면과 달리, 3D 프린팅 같은 실제 제작에 쓸 수 있는 형태를 목표로 합니다. 일반 CAD 소프트웨어는 여러 표면을 이어 붙이는 경계 표현(B-rep) 커널을 쓰곤 하지만, 표면의 교차를 정확히 계산하는 일은 어렵습니다. Keeter는 한 명이나 작은 팀이 이해하고 구현하기에 적합한 대안으로 암시적 표면 기반 기하 커널을 연구해 왔습니다.

Halfspace는 표준 도형 라이브러리를 제공하면서 모델을 작은 단위로 나눠 점진적으로 만들 수 있게 합니다. 각 부분을 매개변수화하고 따로 시각화할 수도 있습니다. 개발자는 저수준 거리장 코드를 직접 작성하는 방식과, 도형·변환 같은 고수준 추상화를 사용하는 방식을 함께 지원합니다.

거리장 값을 화면에 표시하는 이유

Halfspace는 구, 상자, 원기둥 같은 도형을 합집합·교집합·차집합으로 조합하는 CSG 계층만 제공하지 않습니다. 내부의 거리장 값을 화면에 직접 드러냅니다. 색상은 값의 부호를 나타내 안팎을 구분하고, 흰 선은 값이 0인 경계를 표시합니다. 희미한 등고선은 거리장 값을 일정 간격으로 보여줍니다.

글에서는 톱니파(sawtooth wave) 형태의 거리장 두 개를 비교합니다. 두 필드는 모든 지점에서 부호가 같아 같은 안팎 판정을 내리지만, 값의 분포는 다릅니다. 한 필드는 톱니의 수직 경계에서 안쪽에서 바깥쪽으로 넘어가면서도 0을 통과하지 않는 점프 불연속을 보입니다. Fidget는 자동 미분으로 법선(normal)을 계산하므로, 이 경계에서 법선 방향이 틀어집니다. 3D 렌더링에서는 지붕의 널빤지 같은 표면에 잘못된 음영이 나타납니다.

거리장 값을 시각화하면 이런 문제를 쉽게 찾을 수 있습니다. 작성자는 기울기를 조정해 거리장의 그래디언트 크기를 전 구간에서 1에 가깝게 만드는 개선도 소개합니다. Fidget가 정확히 동작하기 위한 필수 조건은 아니지만, 그래디언트가 균일하면 메시 품질 같은 알고리즘 결과가 나아질 수 있습니다.

웹과 네이티브를 함께 겨냥한 기술 스택

Halfspace는 Rust로 작성했으며 GUI에는 egui, 창과 탭 구성에는 egui_dock을 사용합니다. 렌더링과 GPU 계산은 wgpu가 맡고, 스크립팅에는 Rhai를 씁니다. Rayon과 wasm-bindgen-rayon은 병렬 알고리즘을 가속하고 웹에서 짧은 백그라운드 작업을 처리하는 데 활용합니다. 웹에서는 일반적인 방식으로 스레드를 만들 수 없어 별도 스레드 풀도 사용합니다. 그 밖에 web-time과 GPU 작업을 오프로드하는 자체 워커 풀도 포함합니다.

웹 링크로 앱을 공유하면 사용자가 코드를 직접 빌드하고 실행하지 않아도 됩니다. 다만 작성자는 스택의 각 계층에 불만이 있고 구조를 계속 바꿀 계획이라고 밝힙니다. Halfspace는 API를 안정적으로 제공하는 제품이 아니라, 웹과 네이티브를 아우르는 앱을 만들며 설계를 시험하는 프로젝트입니다.

Fidget의 GPU 렌더링 개선

웹에서 WebAssembly로 CPU 래스터화를 실행하면 속도가 대화형 작업에 적합하지 않았습니다. 이에 Fidget 쪽에서 래스터화와 셰이딩 같은 후처리를 GPU에서 처리하도록 fidget-wgpu를 개발했습니다. CPU와 GPU 사이를 오가는 과정 없이 렌더링할 수 있어 네이티브와 웹 모두에서 네이티브 수준의 속도를 얻었습니다. 렌더링 로직도 Fidget에 모였고, Halfspace에는 RGBA 텍스처를 그리는 얇은 셰이더만 남았습니다. 2D 렌더링 파이프라인도 GPU 가속을 적용했습니다.

Halfspace는 계속 바뀔 수 있는 실험 프로젝트입니다. 작성자는 문제를 발견하면 GitHub에 이슈를 올리거나 토론을 열어 달라고 요청합니다.

Hacker News 반응

  • @matthewfcarlson — 정말 마음에 듭니다!
  • @thefourthchime — 아주 멋진 아이디어입니다!
  • @SirFatty — Halfspace 3을 기다리고 있습니다.
  • @mncharity — 글에서 Kartik Agaram의 Mu를 가장 좋아하는 관련 프로젝트로 소개했네요. Mu는 x86 어셈블리 일부를 대상으로 에뮬레이션, 추적, 시간 되돌리기 디버깅을 제공한다고 합니다. 프로젝트 페이지에는 원시 기계어부터 쌓아 올리는 안전하고 손보기 쉬운 컴퓨팅 스택이라고 설명되어 있습니다. 안내서, 논문, 강연, 예제 앱도 링크되어 있습니다.
  • @WillAdams — Matt Keeter는 꽤 오랫동안 작업과 연구를 진행하며 아낌없이 공유해 왔다는 점을 덧붙이고 싶습니다. 연구 페이지를 참고하세요. 특히 석사 논문을 읽어 볼 가치가 있습니다.
    • @mncharity — “독립 연구는 어떤 모습인가요?”라는 질문에 답하는 영상 링크입니다. 2025년 ‘Implicit Surfaces & Independent Research’ 강연의 해당 구간입니다. 나머지 이야기를 미리 맛볼 수 있도록 몇 초 앞에서 재생되게 했습니다.
    • @neomantra — 참고 자료를 알려줘서 고맙습니다. 저도 독립 연구를 하고 있고, 연구를 “하기는” 하지만 그 이상은 잘 못하는 것 같다고 느낍니다. 학계나 기업에서 연구할 때는 주변 지원 체계가 잘 갖춰져 있어서, 그 경험이 연구를 맥락화하고 실제로 진행하는 방법을 알려줬습니다.
    • @mncharity — 맞습니다. 독립 연구를 시작하는 과정은 더 나아져야 합니다. 기존 연구 환경에 여러 변화가 다가오는 상황에서는 특히 그렇습니다. Ira Glass의 ‘The Gap’이 떠오릅니다. 글쓰기나 다른 예술, 창업을 시작할 때와 비슷한 대화가 필요합니다. 무엇을 어떻게 해야 하는지, 어떻게 지속할지에 관한 이야기가 여럿 있어야 합니다. 즐거운 부분과 지루한 부분, 고된 부분도 다뤄야 합니다. 연구를 포함해 지속 가능한 삶을 만드는 보편적인 과제입니다. 연구를 유용하게 이어갈 수 있도록 리듬과 제약, 네트워크와 공동체, 일을 받쳐 줄 구조를 직접 만들어야 합니다. 신분증과 책상, 멘토, 지도교수, 라운지, 화이트보드 용품, 필요한 일을 도와줄 담당자, 주간 연구실 모임이 있는 곳에 들어가는 것과는 다릅니다. 프리랜서로 살 거라 생각했는데 1인 사업자가 되는 경우도 있습니다. 이런 이야기를 다룬 블로그가 이미 있는지 모르겠습니다. 조사해 블로그 글이나 HN 토론으로 만들면 흥미로울 것 같습니다.
  • @pvillano — 저도 다른 목적의 SDF 편집기를 만들었습니다. ShaderToy 코드를 붙여넣기 위해 WebGL을 사용하며, 3D 프린팅용 STL 파일을 내보낼 수 있습니다.

원문: Matt Keeter / 번역·요약: Trawling