📌 이번 글에서 다룬 것
가구 복원은 어느 정도 잡혔으니까 이제 방을 3D로 만들 차례였다. 근데 이게 진짜 오래 걸렸고 결국 포기했다. 그 과정을 솔직하게 기록한다.
🤔 왜 SAM3D로 방을 만들려 했냐
SAM3D를 방 전체에 적용해보면 어떨까 생각했다. 가구를 3D로 만드는 모델이니까 방도 하나의 객체로 보고 넣으면 실제 방 구조를 반영한 3D가 나오지 않을까 하는 기대였다.
그리고 아무도 시도한 사람이 없었다. SAM3D는 단일 객체용으로 설계된 거라 실내 씬에 적용한 사례 자체가 없었다. 하지만 시도해서 어떤 결과를 내는 지 궁금했고, 논문 기여가 될 수도 있겠다 싶었다.

🔨 뭘 시도했냐
1단계: 그냥 넣어봤다
빈방 이미지를 SAM3D에 통째로 넣었다. 마스크는 방 내부 전체 영역으로 잡았다.
결과는 예상대로 울퉁불퉁했다. 벽이 평평하지 않고, 바닥이 생기지 않고, 형태가 완전 뒤틀렸다.
근데 희망적인 건 벽 3개의 윤곽은 어느 정도 나왔다는 거였다. 완전 실패는 아니었다.
2단계: 후처리로 뭔가 해보려 했다
결과가 울퉁불퉁하면 후처리로 평평하게 만들면 되지 않을까 생각했다.
trimesh 후처리 적용:
# degenerate face 제거
face_mask = mesh_tri.area_faces > 1e-8
mesh_tri.update_faces(face_mask)
# 구멍 메우기
trimesh.repair.fill_holes(mesh_tri)
# Laplacian smoothing
trimesh.smoothing.filter_laplacian(mesh_tri, iterations=1, lamb=0.2)
_flatten_room_mesh 적용: 벽/바닥 vertex를 각 평면 방향으로 snap하는 함수를 만들었다. 바닥 근처 vertex는 y_min 쪽으로, 뒷벽 근처는 z_min 쪽으로 당기는 방식이다.
def _flatten_room_mesh(vertices_np, snap_strength=0.9, snap_zone=0.28):
# 각 vertex를 가장 가까운 면(바닥/뒷벽/좌벽/우벽) 방향으로 snap
d_floor = (v[:, 1] - y_min) / dy
d_back = (v[:, 2] - z_min) / dz
d_left = (v[:, 0] - x_min) / dx
d_right = (x_max - v[:, 0]) / dx
# snap_zone 안에 있는 vertex만 해당 면 쪽으로 당김
...이렇게 하니까 확실히 벽이 더 평평해졌다. 근데 여전히 문제가 많았다.
3단계: 천장/앞벽 제거, 바닥 강제 추가
SAM3D 결과에서 천장이 생성되면 안으로 들어갔을 때 막혀 보이고, 앞벽이 생기면 내부가 안 보인다. 그래서 face center 기준으로 천장과 앞벽을 잘라냈다.
바닥은 아예 안 만들어지는 경우가 많았다. 그래서 바닥 커버리지를 체크해서 부족하면 강제로 평면을 추가했다.
# 바닥 커버리지 체크
floor_verts = vertices_np[y_arr <= (y_min + 0.15 * dy)]
coverage = (fx * fz) / (bx * bz + 1e-6)
if coverage < 0.4: # 40% 미만이면 바닥 없는 거로 판단
# 바닥 평면 강제 추가
floor_verts = np.array([
[x_min, y_min, z_min], [x_max, y_min, z_min],
[x_max, y_min, z_max], [x_min, y_min, z_max],
])4단계: 색상 입히기
SAM3D vertex color를 그대로 쓰면 창문, 문 색깔이 벽에 번져서 이상하게 나왔다. 그래서 빈방 이미지에서 직접 벽색/바닥색을 추출해서 단색으로 입혔다.

↓

😭 근데 결국 안 됐다
후처리를 아무리 해도 근본적인 문제가 해결이 안 됐다.
SAM3D 학습 데이터: 볼록한 단일 객체 (소파, 의자 등)
우리 입력: 오목한 실내 공간 (방 전체)
후처리로 평면 snap을 아무리 해도 근본적으로 잘못 생성된 메쉬를 완전히 고칠 수는 없었다. 후처리를 해도 3D 메쉬가 랜덤으로 나와 결과가 잘 나올때도 있고 정말 이상하게 나올때도 있었다.
- trimesh 후처리 ✅ (어느 정도 개선)
- flatten snap ✅ (벽 평평하게)
- 천장/앞벽 제거 ⚠️ (너무 많이 자르면 벽도 같이 잘림)
- 바닥 강제 추가 ✅ (없을 때만)
- 색상 단색 적용 ✅
이렇게 시도를 해봤다. 그래도 결과물이 인테리어 시뮬레이션으로 쓰기엔 너무 불안정했다.
🔄 Three.js 절차적 방으로 전환
결국 SAM3D 방을 포기하고 Three.js 박스 방으로 돌아왔다. 근데 기존 박스 방에서 개선한 것들이 있다.
- 텍스처 적용 — 단순 단색이 아니라 빈방 이미지에서 벽/바닥 텍스처를 추출해서 그대로 입혔다. 바닥에는 나무 판자 텍스처도 오버레이했다.
- 색상 추출 방식 개선 — 이미지 상단 40~60% 영역을 벽색으로, 하단 15% 중앙 80% 영역을 바닥색으로 추출했다.
- 천장 흰색 고정 — 대부분 방 천장이 흰색이라 그냥 고정했다.
결과적으로 SAM3D 방보다 훨씬 안정적이고 보기에도 자연스러웠다.
💭 근데 이게 논문에서는 기여가 되지 않을까?
SAM3D로 방을 만들려고 삽질한 게 아깝지 않은 이유가 있다.
"단일 객체용 모델을 실내 씬에 적용하면 어떤 문제가 생기는지"를 실험으로 규명했다는 게 학술적으로 의미가 있다. 아무도 이걸 시도한 사람이 없었으니까.
논문에는 이렇게 썼다.
"SAM3D를 실내 공간 전체에 적용하는 탐색적 실험을 수행하였다. 객체용 shape prior가 오목한 실내 공간에 적용될 때 발생하는 메쉬 품질 저하 문제를 분석하고 완화시킬 수 있는 방법을 제안하였다. 이는 향후 실내 특화 3D 복원 모델 연구의 방향을 제시한다."
실패도 논문이 된다. 오히려 "시도해봤더니 이런 한계가 있더라"는 게 더 정직하고 신뢰감 있는 연구다.
다음 글에서는 UV 텍스처 베이킹 vs 버텍스 컬러 비교 실험, 그리고 사용자 평가 20명 + 논문 제출 후기를 정리할 예정이다.
'프로젝트' 카테고리의 다른 글
| Meta SAM3D 인테리어 시스템 개발 기록 (6) — UV 텍스처 베이킹 vs 버텍스 컬러, 사용자 평가, 논문 제출 (0) | 2026.06.14 |
|---|---|
| Meta SAM3D 인테리어 시스템 개발 기록 (4) — SAM3D 가구 복원 최적화 (0) | 2026.06.07 |
| Meta SAM3D 인테리어 시스템 개발 기록 (3) (0) | 2026.05.06 |
| Meta SAM3D 인테리어 시스템 개발 기록 (2) (0) | 2026.04.26 |
| Meta SAM3D 인테리어 시스템 개발 기록 (1) (0) | 2026.04.22 |
