---
title: 드론이 찍은 점 뭉치에서 집을 세웠다 — 「더 단순하게」 한 줄이 벽을 잘라먹기까지
url: https://oosioo.com/p/%EB%93%9C%EB%A1%A0%EC%9D%B4-%EC%B0%8D%EC%9D%80-%EC%A0%90-%EB%AD%89%EC%B9%98%EC%97%90%EC%84%9C-%EC%A7%91%EC%9D%84-%EC%84%B8%EC%9B%A0%EB%8B%A4-%EB%8D%94-%EB%8B%A8%EC%88%9C%ED%95%98%EA%B2%8C-%ED%95%9C-%EC%A4%84%EC%9D%B4-%EB%B2%BD%EC%9D%84-%EC%9E%98%EB%9D%BC%EB%A8%B9%EA%B8%B0%EA%B9%8C%EC%A7%80
date: 2026-09-14T13:13:24+00:00
author: SYSOP
summary: 하늘에서 찍은 사진으로 만든 점 뭉치에서 정점 열 개짜리 집을 세운다. 이번엔 그걸 더 줄여 보라고 한 줄 시켰다. 정점은 12% 줄었고, 그 과정에서 멀쩡한 벽 1.3 m 를 두 번 잘라먹었다. 무엇을 고쳤고 무엇을 도로 껐는지 적는다.
---
# 드론이 찍은 점 뭉치에서 집을 세웠다 — 「더 단순하게」 한 줄이 벽을 잘라먹기까지

예전에 드론이나 항공기, 위성 등에서 촬영한 영상들을 이용해서 3차원 지도를 구성하는 일을 한 적이 있다. Structure from Motion 이라는 아주 단순한 기법을 응용하는것인데, 나름 매칭된 점들 사이의 outlier를 제거하는 등 여러 장치가 필요하다. 그렇다고 해도 보통 촬영되어 오는 사진들의 품질이 열악하거나, 다양한 각도에서 여러장 촬영해 오는데에는 한계가 있다보니 이렇게 만들어낸 포인트 클라우드는 그다지 정확하지도 않고, 이를 활용해 3차원 메쉬를 생성하는 작업은 더 어렵다. 보통은 적당히 근사하고 텍스쳐를 입혀서 그럴싸하게 보이도록 하거나 아예 지적도 등 다른 정보를 활용해서 건물의 외곽선을 따고 높이 정보만 더하는 방식으로 만들어내는 수준에 그친다. 전자는 메쉬의 용량이 너무 커지고 동시에 불필요한 디테일이 정확하지 않게 노이즈로 나타나는 경우가 많다. 특히 건물의 가장자리 등 중요 형태가 뭉개지는 문제들이 제법 발생한다. 후자는 건물의 높이를 대강 추정하기 떄문에 높이 자체는 맞출 수 있겠지만 실제 건물의 특징을 반영한 지붕면을 형성하기는 상당히 까다롭다. 이번에는 하늘에서 찍은 사진 여러 장으로 **진짜 3차원 형태**를 만들고, 그걸 가능한 한 단순하게 줄이는 작업을 시켜봤다.

## 무엇을 물었나

시작은 몇 주 전 한 줄이었다.

> 항공 사진으로 만든 점군에서 건물을 가능한 한 단순한 3D 모델로 뽑아내는 걸 해보자. 지붕 구조는 살리되 면 개수는 최소로.

사실 이런 3차원 재구성 문제는, 문제 자체를 어떻게 정의하고 해결하느냐가 거의 전부라고 할 수 있다. 적절한 목적 함수를 만들어 제시하고, 해결해나가도록 했다.

## 무엇이 나왔나

먼저 점 뭉치가 무엇인지부터. 드론으로 건물 위를 날며 사진을 여러 장 찍으면, 같은 자리가 여러 사진에 조금씩 다른 각도로 찍힌다. 그 시차를 풀면 각 지점의 3차원 좌표가 나온다. 결과는 허공에 흩뿌려진 수백만 개의 점이다. 형태는 보이는데, 컴퓨터가 쓸 수 있는 「건물」은 아니다.

![박공지붕·모임지붕·교차 박공 세 건물. 위는 드론 사진에서 만든 점 뭉치, 아래는 거기서 세운 3D 모델. 점 4,209개짜리 박공지붕이 면 7개·정점 10개가 된다.](/uploads/5a84a4fe9bcce1ab.webp =860)

위가 점 뭉치, 아래가 거기서 세운 집이다. 왼쪽 박공지붕 한 채가 **면 7개, 정점 10개**. 파일로 저장하면 **604 바이트**다. 사진 몇 장과 문장 한 줄이 들어가서 나온 것치고는 작다.

아래 뷰어에서 직접 돌려 볼 수 있다. 같은 건물을 **점 뭉치 → 점을 그대로 이은 표면 → 간결 모델** 순서로 번갈아 놓은 것이다.


실제 드론 사진 87장으로 만든 점 뭉치(1,132만 점)에 그대로 걸었을 때, 건물로 판정된 21채 중 한 채가 위의 604 바이트짜리 집이다.

## 어떻게 굴러갔나

### 점을 그냥 이으면 안 되는 이유

가장 단순한 방법은 이웃한 점들을 삼각형으로 이어 붙이는 것이다. 해보면 이렇게 된다.

![같은 점 뭉치를 두 방식으로 표현한 비교. 왼쪽은 점을 그대로 삼각형으로 이은 표면으로 삼각형 7,725개에 지붕이 울퉁불퉁하고 구멍이 뚫려 있으며 벽이 없다. 오른쪽은 평면을 찾아 세운 집으로 면 7개·정점 10개.](/uploads/5b074cf1ee8b9590.webp =860)

왼쪽이 점을 그대로 이은 결과다. 삼각형 7,725개. 지붕이 파도치듯 울퉁불퉁하고, 점이 빠진 자리엔 구멍이 뚫려 있고, 벽은 아예 없다. 하늘에서 내려다본 사진이라 **벽은 찍히지 않기 때문**이다. 오른쪽이 같은 점 뭉치에서 세운 집이다. 면 7개.

울퉁불퉁한 건 점의 오차다. 이 오차는 방향이 편향돼 있다 — 수직으로 내려다보며 찍었으니 거리 오차가 대부분 **높이** 쪽으로 몰린다. 그래서 삼각형을 아무리 잘 이어도 그 오차가 그대로 형태가 된다.

### 그래서 반대로 간다

점을 잇는 대신, **평면부터 찾는다.**

1. 점 뭉치에서 「여기부터 여기까지는 한 장의 평평한 면」인 무리를 찾는다. 지붕면 하나가 평면 하나가 된다.
2. 미세하게 어긋난 평면들을 서로 나란하게·직각으로 맞춘다. 이걸 안 하면 지붕 하나가 서너 조각으로 갈라진다.
3. 벽은 관측이 없으니 **가설로 세운다.** 지붕을 바닥에 비춘 그림자의 테두리를 직각으로 정리하고, 그 선마다 수직인 벽을 세운다.
4. 이 평면들을 **칼처럼 써서 공간을 자른다.** 건물 주변 상자를 평면들로 계속 쪼개면 작은 방들이 생긴다.
5. 방마다 「여기는 건물 안인가 밖인가」를 정한다. 점이 많이 걸치는 방은 안, 빈 방은 밖. 그리고 안과 밖이 맞닿는 벽면만 모으면 그게 건물 껍데기다.

이 방식의 좋은 점은 **간결함이 저절로 보장된다**는 것이다. 나오는 면은 전부 「찾아낸 평면」 위에 있고, 모서리는 평면끼리 만난 선이다. 삼각형을 잔뜩 만든 뒤 줄이는 게 아니라, 애초에 필요한 만큼만 생긴다.

### 그런데 정점은 따로 논다

이번 개선의 출발점이 여기다. 위 방식이 보장하는 건 **면** 개수까지다. 정점과 모서리는 별개로 샌다.

이유가 셋이었다.

- 한 점에서 만나야 할 평면 셋이 노이즈 때문에 살짝 어긋나면, 만나야 할 자리가 **2~3 cm 떨어진 정점 두세 개로 갈라진다.** 사각뿔 지붕의 꼭대기가 대표적이다. 그 사이엔 넓이가 거의 없는 면 조각이 낀다.
- 면을 평면마다 따로 뽑다 보니, 맞닿는 자리에서 끊는 지점이 서로 다르다. 위상을 닫으려고 **모서리 한가운데 정점을 끼워 넣는데**, 양쪽 면에서 모두 일직선이면 사실 없어도 되는 것들이다.
- 그렇게 남은 실오라기 면들.

셋 다 「형태는 맞는데 표현만 무거운」 경우다. 그래서 마지막에 네 가지를 수렴할 때까지 되풀이하게 했다.

| | 하는 일 |
|---|---|
| 되돌리기 | 정점을 자기가 속한 면들의 평면 교점으로 다시 계산한다 |
| 붙이기 | 점 간격보다 가까운 정점들은 하나로 합친다 |
| 지우기 | 어느 면에서도 꺾이지 않는(일직선인) 정점을 뺀다 |
| 버리기 | 넓이가 거의 없는 면을 버린다 |

첫 줄이 핵심이다. 다면체의 정점은 원래 **평면 셋이 만나는 점**이다. 그 정의로 되돌려 계산하면 흩어져 있던 것들이 한 점으로 모이고, 그 다음에 붙이기가 쉬워진다.

「가까우면 붙인다」의 기준은 고정된 몇 cm 가 아니라 **점 간격에 비례**하게 했다. 점이 20 cm 간격으로 찍힌 데이터에서 3 cm 떨어진 정점 둘은 애초에 데이터로는 구분할 수 없는 것이다. 구분할 수 없는 걸 둘로 유지하는 건 정보가 아니라 부피다.

![단순화 전후 비교. 위 줄은 정점을 붉은 점으로, 아래 줄은 초록 점으로 표시했다. 모임지붕 14→10개, 사각뿔지붕 15→11개, 교차 박공 26→21개로 줄었다.](/uploads/265b8e8621612a65.webp =860)

위가 전, 아래가 후다. 왼쪽 모임지붕은 정점 14개가 **10개**가 됐다. 이건 정답 형상과 정확히 같은 숫자다.


사실 이 예시들은 이미 여러 논문에서 너무 잘되는 케이스들 뿐이다.

실제로는 훨씬 더 복잡하고 어려운 지붕면과 독특한 랜드마크 건물들이 많고, 이를 단순하게 재구성하는 것은 조금 더 어려운 문제이다. 여러 솔루션을 만들어 시험했었고, 어떤 포인트 클라우드를 넣어도 정확한 높이를 보장하는 단순 모델을 만들어낼 수 있었다. 아직 이 분야는 상업적 활용도 가능한 것이라 이곳에 더 공개하지는 않는다.

## 그래서 얼마나 줄었나

같은 조건에서 껐다 켰다 하며 160회씩 비교했다.

| 데이터 품질 | 표면 오차 | 정점 | 모서리 | 닫힌 표면 |
|---|---|---|---|---|
| 좋음 | 0.152 → 0.150 m | 13.7 → 12.0 | 21.0 → 18.9 | 82% → 90% |
| 보통 | 0.240 → 0.231 m | 14.8 → 13.1 | 22.5 → 20.4 | 72% → 88% |
| 나쁨 | 0.534 → 0.531 m | 16.3 → 14.8 | 24.9 → 22.9 | 74% → 80% |
| 성김 | 0.888 → 0.879 m | 15.3 → 14.1 | 23.2 → 21.4 | 69% → 88% |

정점 12%, 모서리 10% 가 줄고 **표면 오차는 오히려 조금 낮아졌다.** 오차가 안 나빠지는 게 핵심이다 — 줄어든 게 전부 형태가 아니라 표현의 군더더기였다는 뜻이니까.

덤이 하나 더 붙었다. 맨 오른쪽 열, **닫힌 표면**이다. 껍데기에 틈이 없어서 「안쪽」이 제대로 정의되는 상태를 말한다. 부피를 재거나 물·바람을 시뮬레이션하려면 이게 돼야 한다. 갈라져 있던 정점을 붙이면 그 자리에 있던 미세한 틈이 함께 사라져서, 147건 중 110건이던 게 **127건**이 됐다.

실제 드론 데이터 10채에도 같은 걸 돌렸다. 정점 463개 → 417개, 껍데기에 남은 틈 121곳 → 87곳.

## 왜 한 줄로 되는가

「더 단순하게」라는 말은 그 자체로는 아무 지시도 아니다. 단순함은 정확함과 맞바꾸는 것이라, 얼마나 맞바꿀지를 정하지 않으면 대화가 안 된다.

이게 한 줄로 굴러간 이유는 **판정 기준이 이미 있었기 때문**이다. 정답 형상을 알고 있는 가짜 건물 8종을 만들어 두고, 거기서 사진측량의 결함(높이 오차, 모서리 결손, 구멍, 잡동사니)을 흉내 낸 점 뭉치를 뽑고, 복원 결과와 정답 사이의 거리를 재는 장치가 앞선 작업에서 이미 만들어져 있었다.

그래서 이번엔 시키는 쪽이 「이건 좋은 단순화고 저건 나쁜 단순화다」를 설명할 필요가 없었다. **오차는 그대로 두고 개수만 줄여라**는 한 문장이면 됐고, 나머지는 160회를 돌려서 판정하면 그만이었다. 위의 실패 세 건도 전부 내 눈이 아니라 그 표가 잡아냈다.

## 따라 하려면

- **판정 기준을 먼저 만든다.** 「더 좋게」류의 요청은 채점표가 없으면 의견 교환으로 끝난다. 정답을 아는 가짜 데이터로 채점표를 만들어 두면, 그 뒤의 개선 요청은 전부 한 줄이 된다.
- **한 조건에서만 재지 않는다.** 이번에도 「깨끗한 데이터에서만 나빠지는」 실패가 있었다. 한 조건에서만 쟀으면 그대로 통과했을 것이다.

보통 건물의 3차원 모델을 다루는 논문들에서는 직선이나 평면으로 구성된 것만 다루는 경우가 많지만 생각 외로 곡면이나 독특한 형태의 외곽 구조를 갖는 건물들이 있어 이러한 건물에도 적용할 수 있는 목적 함수를 찾아내는 것은 제법 구상이 오래 걸렸었다. 실제로는 저런 단순한 건물 외에도 국내외에서 볼 수 있는 대부분의 건물을 쉽고 빠르게 재구성할 수 있다.

사실 이 아이디어는 예전에 구상하고 따로 구현해두었던 것인데, 동일한 내용을 클로드 코드로 구현하는데에는 40분쯤 걸렸다. 대부분은 개선을 만드는 시간이 아니라, 만든 개선이 정말 이득인지 여러번 검증하는데 사용했을 뿐이다. 수학적 모델과 3차원 공간 모델에 대한 이해만 있다면 누구나 충분히 따라할 수 있을 것이다.
