TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 33 READS

거리장으로 솔리드 모델링하기: 실험적 IDE 'Halfspace'가 던지는 질문

거리장으로 솔리드 모델링하기: 실험적 IDE 'Halfspace'가 던지는 질문
SOURCE IMAGE · HACKER NEWS

3D 모델링을 다뤄본 개발자라면 대부분 삼각형 메시로 표현된 표면(surface)에 익숙하다. 게임 엔진의 모델 뷰어를 열어보면 두께가 없는 벽면이 삼각형 하나로 표현된 경우를 흔히 볼 수 있다. 그러나 3D 프린팅이나 CAD/CAM처럼 물리적으로 제작 가능한 대상을 다루려면 사정이 다르다. 공간의 임의의 한 점을 골랐을 때 그 점이 물체의 안쪽인지 바깥쪽인지 명확히 판정할 수 있어야 한다. 이른바 '솔리드 모델링'이다. Matt Keeter가 공개한 실험적 IDE 'Halfspace'는 바로 이 솔리드 모델링을, 그것도 거리장(distance field) 기반 음함수 표면(implicit surface)으로 다루는 데 초점을 맞춘 도구다.

왜 음함수 표면인가

일반적인 CAD 소프트웨어는 경계 표현(B-rep) 기하 커널을 써서 여러 개의 개별 곡면을 꿰매 하나의 솔리드 바디를 만든다. 이는 대단히 어려운 문제다. 예컨대 두 NURBS 곡면의 교선은 닫힌 형태의 해가 존재하지 않을 수도 있다. 반면 저자가 석사 논문 때부터 붙잡아 온 음함수 표면 기반 커널은 한 명 또는 소규모 팀이 전체를 작성하고 완전히 이해할 수 있다는 장점이 있다. 개인 규모의 제작용 소프트웨어에 잘 맞는 접근이라는 얘기다. Halfspace는 이 철학을 이어받아, 2022년부터 개발해 온 'Fidget' 기하 커널 위에 GUI를 씌운 형태다. 사전 정의된 프리미티브와 직접 작성한 스크립트를 조합해 모델을 설계하고, 결과를 이미지나 삼각형 메시로 내보낼 수 있다.

저자는 음함수 표면을 다루는 경험을 어셈블리 작성에 비유한다. x, y, z 변수만 주어지고 이를 조합해 원하는 모든 형상을 만들어내야 하는 저수준 작업은 강력하지만 고통스럽다. 어셈블리의 고통에 대응하는 방법은 보통 두 가지다. 하나는 그 위에 고수준 추상화, 즉 구·상자·이동·확대 같은 표준 형상 라이브러리를 쌓는 것이다. 다른 하나는 덜 흔하지만 어셈블리 자체를 덜 고통스럽게 만드는 것이다. Halfspace는 두 길을 모두 택한다. 작지만 점점 커지는 표준 라이브러리를 제공하는 동시에, 복잡한 모델을 작은 조각으로 쪼개 각각 파라미터화하고 개별적으로 시각화하며 점진적으로 쌓아 올릴 수 있게 했다.

거리장을 전면에 내세운 이유

Fidget 커널을 단순히 구성적 솔리드 기하(CSG) 계층으로만 쓸 수도 있었다. 구·정육면체·원기둥 같은 형상을 만들고 합집합·교집합·차집합으로 결합하는 방식이다. 그러나 Halfspace는 그 밑에 깔린 거리장 자체를 전면에 드러내기로 결정했다. 이 선택이 왜 중요한지는 톱니파(sawtooth) 예시가 잘 보여준다. 부호(내부/외부를 정의하는 값)가 모든 지점에서 동일하지만 실제 필드 값은 서로 다른 두 거리장이 있다고 하자. 겉보기 형상은 같아도 하나는 거동이 나쁘다. 톱니의 수직 모서리에서 값이 0을 통과하지 않은 채 내부에서 외부로 급격히 건너뛰는 이른바 C0 불연속, 즉 '점프' 불연속이 생기기 때문이다.

이것이 실무적으로 문제가 되는 이유는 Fidget이 법선(normal) 계산에 자동 미분을 쓰기 때문이다. 불연속 경계에서는 법선이 올바른 방향을 가리키지 못하고, 3D에서 법선은 셰이딩에 쓰이므로 결과적으로 표면 음영이 잘못 그려진다. 거리장을 화면 전면에 놓으면 이런 종류의 문제를 눈으로 진단하기 쉬워진다. 나아가 톱니파의 경우 대각선에 값이 몰리지 않도록 기울기를 손봐 필드의 그래디언트가 공간 전체에서 1이 되도록 개선할 수도 있다. Fidget이 정확성을 위해 균일한 그래디언트를 요구하는 것은 아니지만, 이런 성질은 메시 품질 향상 같은 여러 알고리즘의 거동을 더 안정적으로 만든다.

웹과 네이티브를 동시에, 그리고 GPU

주목할 만한 결정 하나는 웹과 네이티브 플랫폼을 함께 겨냥했다는 점이다. 저자는 공급망 공격이 잦은 시대에, 상대에게 코드를 컴파일해 실행하라고 요구하는 대신 웹 링크 하나를 공유할 수 있다는 것이 온보딩과 가벼운 사용 양쪽에 큰 이점이라고 본다. 이를 위해 네이티브와 웹을 최소한의 고통으로 함께 배포하게 해주는 라이브러리와 패턴을 모은 이른바 'Halfspace 스택'을 정리해 왔다. 저자 스스로 스택의 모든 계층에 불만이 있다고 털어놓으면서도, 전체적으로는 모든 것이 그럭저럭 작동한다는 점을 높이 평가한다.

성능 면의 가장 큰 성과는 fidget-wgpu 작업이다. 네이티브 빌드는 충분히 빨랐지만 웹에서 WebAssembly 계층을 거쳐 CPU에서 래스터화를 하면 상호작용이 불가능한 수준으로 느렸다. Fidget 쪽을 상당히 손본 끝에 래스터화와 셰이딩 같은 후처리를 CPU 왕복 없이 순수하게 GPU에서 돌릴 수 있게 됐고, 2D 렌더링 파이프라인 역시 완전히 GPU 가속을 받게 됐다. 이는 성능뿐 아니라 아키텍처 측면의 성과이기도 하다. 흥미로운 건 Halfspace의 또 다른 목표가 이처럼 비자명한 실제 애플리케이션에서 커널을 굴려 Fidget 자체의 개선을 이끌어내는 데 있다는 점이다. 도구가 커널을 다듬고, 다듬어진 커널이 다시 도구를 받치는 순환 구조다.

실무자가 새겨둘 한계

저자는 여러 차례 못을 박는다. 이것은 실험적 프로젝트이며, 지금 시점에 Halfspace를 하중을 견뎌야 하는(load-bearing) 용도나 중요한 애플리케이션에 쓰는 것은 매우 대담한 결정이라는 것이다. Fidget과 마찬가지로 '올바른' API를 찾아가는 과정에서 호환성을 깨는 대대적인 변경을 공격적으로 반복할 수 있다고 밝힌다. 다만 이 코드가 이른바 '바이브 코딩'으로 만들어진 것이 아니라 2025년 4월부터 사람이 직접 작성해 온 결과물이라는 점, MPLv2 라이선스의 오픈소스라는 점은 분명히 해둔다. 정리하면 Halfspace는 당장 도입할 제품이라기보다, 거리장 기반 솔리드 모델링이라는 접근이 어떤 문제를 어떻게 드러내고 다루는지를 실제 코드로 보여주는 참고 자료에 가깝다. 음함수 표면이나 개인 규모의 제작 소프트웨어에 관심 있는 실무자라면, 특히 거리장의 불연속이 셰이딩과 메시 품질에 어떻게 영향을 주는지 눈으로 확인해 볼 만한 데모다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://www.mattkeeter.com/projects/halfspace/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...