방(3D 모델)을 넣으면 — 가구를 알아보고, 이름을 붙이고,
걷는 순서대로 번호를 매기기까지. 차근차근 풀어봤어요.
방마다 실제 크기가 제각각이라, 먼저 가로 폭을 같은 기준으로 맞춰요. 그래야 "방 높이의 절반보다 크면 가구" 같은 모든 기준을 방 크기와 상관없이 똑같이 적용할 수 있어요.
※ 기준 폭은 7.2 — 물리 상수가 아니라, 방 스캐너가 쓰는 정규화 값과 같게 맞춘 거예요(좌표 호환 · 실제 중형 방 ~7m라 걷기·카메라 속도감도 자연스러움).
3D 모델 속 수많은 조각 중 '가구'만 추려요. ① 이름표(조각 이름에 sofa·chair 같은 단어가 있으면) ② 모양(가로·세로·높이 상자 크기). 얇고 큰 면은 '벽', 아주 납작·거대하면 '바닥'으로 보고 걸러내요.
3D 모델 조각마다 만든 사람이 붙여둔 '이름표(라벨)'가 있어요. 그게 'dining table'처럼 확실하면 그대로 '식탁'으로 둬요. 이름표가 없거나 틀린 경우 — 예를 들어 모델 라벨은 'umbrella'인데 실제론 화분일 때 — 그땐 AI 비전이 사진을 직접 보고 한국어로 이름을 붙여요.
바닥에 깔린 러그와 벽에 걸린 수납장이 같은 바닥 위치에 겹치면 마커가 둘 겹쳐 보여요. 높이 차이로는 안 걸러지니, 바닥 평면(위에서 본 거리)으로 가까운 둘은 하나로 정리해요. (떨어져 있는 카페 의자들은 그대로 둬요.)
번호는 실제로 걷는 동선으로 매겨요. 한 바퀴를 매끄럽게 돌게 하려고 두 가지를 점수로 설계했어요.
① 가까움 — 지금 위치에서 가장 가까운 미방문 마커일수록 높은 점수.
② 방향 유지 — 지금 가던 방향과 비슷한 쪽이면 가산점, 갑자기 뒤로 꺾이면 감점.
매 단계 이 둘을 합친 점수가 가장 높은 마커를 다음으로 골라요 → 방을 횡단하거나 되돌아가지 않고 자연스럽게 한 바퀴.
마커를 그 자리에서 아래로 빛을 쏴(레이캐스트) 닿는 표면 바로 위에 살짝 띄워 얹어요(사물을 파고들거나 가려지지 않게). 그래서 책상 위·소파 위에 자연스럽게 붙죠. (창문·그림처럼 벽에 붙은 건 바닥으로 안 떨어지게 예외 처리해요.)
다음 →을 누르면 카메라가 다음 마커로 부드럽게 가감속하며 이동해요. 이동 중엔 흔들림을 막고, 지금 보던 방향과 비슷한 각도를 골라 갑자기 뒤로 휙 도는 일이 없어요.
마커가 가리키는 사물을 3D 화면에서 스크린샷으로 찍어 AI에게 보내요. 중앙에 조준점을 찍어 '바로 이 사물'만 보게 하고, 빈 곳이면 '없음'으로 정직하게 답해요.
지금까지는 3D 모델(GLB)에 좌표가 이미 들어 있는 경우였어요. 그런데 모델에 이름표가 전혀 없거나(벽이 'Object_4'), 내 진짜 방을 찍은 사진밖에 없을 땐? — '방 스캐너'가 나서요. 방을 여러 각도에서 찍어 각 사진을 Azure AI Vision에 보내 사물을 찾고(2D 박스), 그 사물의 3D 좌표를 직접 계산해 핫스팟 파일(JSON)을 만들어요. 방 시스템은 이 파일을 그대로 불러와 마커·동선을 깔죠.
3D 모델은 좌표가 이미 들어 있어 바로 읽지만, 사진은 평면(2D)이라 "얼마나 멀리"가 없어요. 그래서 여러 시점에서 같은 사물을 향해 쏜 시선(광선)이 만나는 점을 그 사물의 3D 위치로 잡아요 — 측량사가 두 지점에서 같은 봉우리를 재 위치를 찾는 것과 똑같죠. 잘 수렴하면 ±몇 cm까지 정확해요.
모델(GLB)은 좌표가 이미 있으니 바로 읽어요(삼각측량 불필요·무오차). 사진은 좌표가 없으니 삼각측량으로 복원하죠. 게다가 스캐너는 1차로 표면에 광선을 쏴 맞은 점(베스트샷)을 쓰고, 가림이 의심될 때만 삼각측량 수렴점으로 보정해요. 두 길의 결과는 똑같은 정규화 좌표계(가로 7.2·바닥 0)로 나와서, 스캐너 좌표·모델에서 읽은 좌표·손으로 고친 좌표가 서로 갈아끼워집니다.
얇은 사물 바로 뒤에 큰 배경(커튼 등)이 있으면 비전이 배경을 잡을 수 있어요. 그럴 땐 그 사물만 '정밀' 버튼으로 한 번 더 정확히 잡을 수 있어요.
모양만으로 '책상 vs 식탁'을 100% 가르긴 어려워요 — 그래서 이름이 확실하면 이름을, 아니면 비전을 쓰는 하이브리드로 가장 정확하게 맞춰요.