LLM으로 분리 및 결합 가능한 3D 부품 생성 도구
기존 텍스트-투-3D(Text-to-3D) 파이프라인이 통짜 덩어리(Mesh Blob) 형태의 모델만을 생성하는 한계를 극복하고, 움직임이 가능한 관절(Hinge/Socket)과 분리된 부품을 갖춘 3D 객체를 생성하는 오픈소스 도구가 공개되었습니다. 이 도구는 LLM을 이미지 생성 모델 대신 구조적 코드 컴파일러로 활용해 네이티브 Blender Python 코드를 작성하는 방식으로 작동하며, 최신 로컬 모델들은 복잡한 변환 과정에서 오류(Hallucination)를 일으키기 때문에 현재로서는 Gemini 모델 사용을 추천합니다.
공개된 영상은 이 파이프라인이 어떻게 통짜 덩어리(Monolithic 3D Blob)가 아닌 분리되고 기능적인 부품으로 구성된 3D 세탁기를 생성하는지 보여줍니다. 힌지(Hinge) 및 소켓(Socket) 관절 구조도 포함되어 있어 내부 조립품이 실제로 회전하거나 움직일 수 있습니다.
제가 해결하고자 한 문제는 이것입니다. 현재 거의 모든 텍스트-투-3D(Text-to-3D) 파이프라인은 단순히 디퓨전(Diffusion) 가중치를 사용해 메시 덩어리(Mesh Blob)를 만들어냅니다. 생성된 총 모델의 조준경을 바꾸고 싶다고 가정해 봅시다. 프롬프트에서 단어 하나만 변경해도 모델 전체나 대부분을 처음부터 다시 생성해야 합니다. 모델에는 총이 '부품'으로 이루어져 있다는 개념이 전혀 없기 때문입니다. 이 시스템들에게는 모든 것이 구분되지 않는 포인트 클라우드(Point Cloud)일 뿐입니다.
저는 이를 바꾸려고 노력했습니다. 저의 파이프라인은 LLM을 이미지 생성기가 아닌 구조적 코드 컴파일러로 사용합니다. 이 시스템은 장면 그래프(Scene Graph)의 특정 노드를 타겟으로 하는 네이티브 Blender Python 코드 블록을 작성합니다.
핵심 비결은 모든 것이 픽셀이나 포인트 클라우드 디퓨전을 거치는 대신, Blender의 실제 장면 그래프 구조를 통해 컴파일된다는 것입니다. 최종 내보내기 결과물은 변환(Transform) 노드와 작동하는 피벗(Pivot) 축이 그대로 유지되는 깔끔한 멀티파트(Multi-part) GLB 파일입니다.
기술 스택: 프론트엔드는 Flutter로 제작되었으며, 브라우저 내 렌더링과 노드 조작을 위해 Three.js 뷰포트 하네스를 사용합니다. 기본적으로 호스팅된 API를 호출하지만, 자체 호스팅(Self-hosting)을 위해 모델에 구애받지 않도록(Model-agnostic) 설계했습니다.
프론트엔드 저장소는 오픈소스로 공개되었습니다: https://github.com/RareSense/Nova3D
약간의 안 좋은 소식도 있습니다. 로컬 모델들이 발전하고는 있지만, 복잡한 변환을 처리할 때 여전히 Blender의 내부 행렬 연산(Matrix math) 함수와 관련된 환각(Hallucination) 오류를 심하게 일으킵니다. 저는 실제로는 객체를 4차원으로 회전시키고 있는 '올바르게 보이는' 코드를 디버깅하는 데 너무 많은 시간을 허비했습니다. 파이프라인 코드 자체는 LLM에 완전히 독립적이지만(Agnostic), 최고의 결과를 원한다면 BYOK(Bring Your Own Key) 방식으로 Gemini를 사용해 보세요. 저보다 뛰어난 분들과 협력하여 훌륭한 오픈소스 모델을 이 시스템에 연결하고 싶지만, 제가 직접 시도한 것들은 모두 실패했습니다.
또한, 3D 생성 환경에서 프롬프트-투-코드(Prompt-to-Code) 파이프라인을 다루어 보신 분들의 기술적인 피드백도 환영합니다.
참고로, 재미를 위한 생성 예시:
- 보스턴 다이내믹스 스타일의 로봇 개: https://imgur.com/a/CqMYgrF
- 전자레인지: https://imgur.com/a/hIqIJdr