[SDK] LiveSketch
내부 자료의 유출 방지를 위해 공개 가능한 범위에서의 자료만 공유합니다.
소개
3D 게임 엔진 기반으로 Web, Mobile, Standalone 에서 3D 도면 생성과 수정 기능을 제공하는 SDK 입니다.
- B-rep Procedural Mesh 생성 로직
- Winged Edge, DCEL 등 이용
도면 그리기가 생각보다 어려운 이유
3D 공간에 벽을 하나 세우는 일은 어렵지 않습니다. 어려워지는 건 고치기 시작할 때입니다.
방 하나를 그려 놓고 벽 하나를 옆으로 밀 면, 그 벽만 움직여서는 안 됩니다. 붙어 있던 두 벽이 같이 늘어나야 하고, 바닥 면적이 다시 계산되어야 하고, 천장도 따라와야 합니다. 벽을 지우면 두 방이 하나로 합쳐지기도 합니다.
즉 도면은 삼각형 덩어리가 아니라 서로 붙어 있는 관계가 본체입니다. 화면에 보이는 메시는 그 관계를 그려 낸 결과일 뿐입니다.
B-rep: 형상을 면이 아니라 경계로 기억하기
B-rep(Boundary Representation)은 물체를 "속이 찬 덩어리"가 아니라 꼭짓점, 모서리, 면과 그 연결 관계로 기억하는 방식입니다. 종이접기를 떠올리면 쉽습니다. 접힌 종이의 모양을 사진으로 저장하는 대신, 접는 선이 어디에 있고 어느 면과 어느 면이 그 선을 공유하는지를 저장하는 쪽입니다.
이렇게 두면 "이 모서리를 옮기면 어떤 면들이 영향을 받는가"를 바로 답할 수 있습니다. 도면 편집에서 필요한 게 정확히 이 질문입니다.
Winged Edge 와 DCEL 은 무엇을 해결하나요?
두 자료구조 모두 모서리를 중심으로 이웃을 기록하는 방법입니다.
삼각형 목록만 갖고 있으면 "이 모서리에 붙은 면이 무엇인가"를 알기 위해 전체를 훑어야 합니다. 도형이 커질수록 이 비용이 그대로 편집 지연으로 나타납니다.
- Winged Edge: 모서리 하나가 자기 양 끝점, 양옆 면, 그리고 이어지는 앞뒤 모서리를 함께 들고 있습니다. 날개처럼 좌우 정보를 붙여 둔다고 해서 붙은 이름입니다.
- DCEL (Doubly Connected Edge List): 모서리를 방향이 반대인 반쪽(half edge) 두 개로 나눠 다룹니다. 면을 한 바퀴 도는 순회가 자연스러워져서 면 단위 작업에 특히 편합니다.
공통점은 이웃을 찾는 작업을 전체 탐색 없이 끝낼 수 있다는 점입니다. 벽을 끌 때 화면이 즉각 따라오는 느낌은 대부분 여기서 나옵니다.
Procedural Mesh 로 만든다는 것
도면의 벽은 미리 만들어 둔 모델 파일을 불러오는 게 아니라, 편집 결과를 보고 그 자리에서 만들어 냅니다. 두께와 높이, 개구부 위치가 매번 달라지기 때문에 파일로 준비해 둘 수가 없습니다.
그래서 편집 조작이 들어올 때마다 경계 구조를 갱신하고, 갱신된 구조에서 다시 메시를 생성하는 순서로 돕니다. 이 경로가 빠를수록 도면 편집이 부드럽게 느껴집니다.