3D 방이나 사진을 넣으면 — 가구를 찾고, 위치를 잡고, 이름을 붙이고,
걷는 순서로 번호를 매겨, 외울 내용을 얹습니다.
그 모든 기술을 쉬운 말로 한 페이지에 담았어요.
위치를 얻는 길은 둘이에요. 3D 모델(GLB)은 좌표가 이미 들어 있어 그냥 읽고(오차 0), 사진은 깊이가 없어 여러 각도로 삼각측량해 복원해요. 둘 다 같은 자(가로 7.2·바닥 0)로 맞춰, 결과를 서로 갈아끼울 수 있죠. 뷰어와 스캐너가 똑같은 공식(7.2÷가로폭)을 쓰기 때문에, 스캐너가 미리 구운 좌표를 뷰어가 그대로 다시 써도 어긋나지 않아요.
★ 시연 방들은 ② 미리 구운 스캐너 좌표가 켜져 있고, ③ 모양 추정은 그게 없을 때의 예비책이에요.
3D 방 파일(GLB)을 열면 수많은 조각 중 '가구'만 추려요. 이름표가 있으면('Sofa', 'Chair') 그대로 믿고, 없거나 'Object_12'처럼 모호하면 크기·모양으로 가려내요. 노드 이름은 공짜로 딸려 오는 정보라, '가구' 단어만 보이면 AI를 한 번도 안 부르고 이름·위치를 얻을 수 있어요.
크기·모양 판별은 절대 길이가 아니라 방 기준(가로 7.2≈7.2m)에 대한 비율로 재요 — 방이 커도 작아도 같은 잣대가 통하죠. 7.2m 방으로 환산하면 이런 뜻이에요:
천장 조명을 왜 빼냐면 — 천장에 번호가 찍히면 걸으면서 올려다볼 수 없어 ‘걷는 순서로 외우기’가 깨지거든요. 이렇게 비율 잣대 하나로 어떤 방 파일이든 자동으로 가구만 골라내요.
먼저 방마다 다른 크기를 같은 자(가로 7.2)로 맞춰요. 가로(폭)만 기준 삼는 건, 천장 높은 방까지 높이로 줄이면 너무 작아져 버리기 때문이에요. 바닥은 한가운데가 아니라 가장 낮은 면을 0에 맞춰요 — 그래야 눈높이(바닥+1.6m)·그림자·바닥이 늘 들어맞아 발이 뜨거나 파묻히지 않죠. 이렇게 통일해야 "0.5m 안이면 같은 가구" 같은 기준을 모든 방에 똑같이 써요.
모델(GLB)은 가구를 감싸는 상자(바운딩박스)의 중심을 읽으면 끝 — 화면에 안 그리고 좌표만 읽어 오차 0. 메쉬에 박힌 중심점은 모델러 마음대로라 못 믿으니, 상자 한가운데(=부피의 무게중심)를 기준 삼아요. 사진은 깊이가 없어, 여러 각도 시선이 만나는 점(삼각측량)으로 위치를 복원해요. 이때 시선들이 한 점에 모이는 정도(평균 이탈)가 0.5m 안쪽이어야 '하나의 사물'로 인정하고, 그보다 벌어지면 다른 사물을 본 광선으로 보고 버려요.
★ 삼각측량은 사실 '사진 전용'이에요. GLB는 좌표가 이미 있어 거의 안 거치고, 가림이 의심될 때만 가끔 보정용으로 써요.
이름표가 항상 옳진 않아요. 그래서 애매하거나 이름 없는 것만 그 자리를 화면 캡처해 GPT-4.1 비전에게 "이거 뭐야?" 물어 한국어 이름을 받아요. 진짜 확실한 이름(식탁·소파)은 그대로 둬 정확도는 지키고 비용은 아끼죠. ‘헷갈리는 사물’의 기준은 ① 모양으로만 잡은 것(obj12) ② 좌표만 있는 합성 지점(spot) ③ object·mesh·untitled 같은 무의미·임의 이름 — 이 셋 중 하나면 비전이 다시 봐요.
2단으로 지어요 — ① 방 전체를 한 번에, ② 약한 것만 클로즈업으로 다시.
방 전체 4컷은 대각선 네 방향(±45·±135°)에서 찍어요 — 한 각도에서 가려진 가구가 다른 컷에서는 드러나거든요. 좁은 방이라 카메라를 멀리 못 빼도, 64°의 넓은 화각이면 면 전체와 여러 마커가 한 장에 담겨요. 이 4컷을 묶어 AI를 딱 한 번만 부르고(호출 제한·비용↓) 결과는 방마다 저장해 다시 부르지 않아요. 정밀 클로즈업은 512×512로 충분히 또렷하면서 가볍고, 한가운데 빨간 십자로 '바로 이 좌표'를 콕 집어 옆의 큰 가구를 잘못 부르지 않게 해요. 답이 매번 같도록 무작위성은 끄고(temperature 0) 돌려요.
마커가 가리키는 사물을 3D 화면에서 스크린샷으로 찍어 AI에게 보내요. 중앙에 조준점을 찍어 '바로 이 사물'만 보게 하고, 빈 곳이면 '없음'으로 정직하게 답해요.
번호는 검출 순서가 아니라 사람이 한 바퀴 걷는 동선으로 매겨요. 핵심은 방에 들어선 시점의 '부채꼴 시야'를 기준 삼는 것 — 입장 지점은 긴 축의 끝(눈높이 1.6m)으로 잡아요. 거기 서야 방을 가장 깊게 내다보는 '설정샷'이 나오고, 짧은 축 가운데에 서서 옆벽을 비스듬히 보는 일이 없거든요. 거기서 앞뒤·좌우를 재고, 같은 종류가 많으면 네 모서리 대표를 뽑아 방 구석구석을 담아요 — 그냥 '가까운 네 개'를 고르면 가운데로 쏠려 방 끝(가장 강한 공간 단서)이 비니까, 대각선으로 가장 튀어나온 항목을 골라 네 모서리를 채우죠. 순서는 가까움 + 가던 방향 유지로 이어요(지그재그·되돌아감 방지). 두 후보의 거리 차가 작을 때(약 1.4m 이내)는 덜 꺾이는 쪽을 골라 U턴을 억눌러요.
번호를 누르면 그 가구 둘레 28방향을 따져 가장 잘 보는 자리를 골라 부드럽게 날아가요. 28방향이면 약 12.86°마다 한 번 — 더 적으면 트인 틈을 놓치고, 더 많으면 마커마다 28번씩 광선 쏘기가 비싸져 딱 그 사이예요. 자리를 고르는 기준 셋: ① 잘 보이나(다른 가구에 안 가려지나) ② 방 안쪽을 보나(벽 보고 끝나지 않게) ③ 직전 시선과 비슷한가. ③에 가장 큰 가중치를 줘요 — 화면이 홱 돌면 멀미가 나고 맥락도 끊기니까요. 그리고 약 0.9초에 걸쳐 시작·끝 속도가 0인 곡선으로 가속→감속하며 활공해요(0.3초면 맥락을 놓치고 2초↑면 클릭이 지치며, 등속이면 멀미가 나거든요). 이동 경로 자체를 봐야 가구들의 공간 관계가 머리에 새겨지죠.
가구 위치는 3단 우선순위로 관리돼요 — ① 사람이 직접 손본 것 > ② 스캐너로 구운 좌표 > ③ 모델 모양 추정. 이 순서는 '무회귀 원칙'이에요 — 나중에 돌린 자동 추정이 사람이 손으로 고친 결과를 절대 덮어쓰지 못하게 막죠. 각 가구는 학습 개념과 묶여, 순서 바꾸거나 다시 들어와도 "이 사물 = 이 개념"이 유지돼요.
최신 기능 — 내가 만든 궁전·편집·의미부여를 '내 서재'(서버 DB)에 저장해요(클라우드 Cosmos+Blob). 로그인하면 다시 들어와도 그대로 복원되죠.
서버는 사물 검출(Azure Vision), 이름 짓기(GPT-4.1 비전), 내 서재 저장(Cosmos+Blob)을 맡아요. 쓰는 AI 모델은 코드에 박혀 있지 않고 설정값(배포 이름)으로 정해져요 — 그 이름이 곧 모델이라 요청에 모델명을 따로 적지 않고, Azure가 안 될 땐 더 가벼운 모델로 자동 대체돼요. 무거운 방 파일(GLB)은 Draco 압축으로 300MB를 9MB까지 줄여 빠르게 띄우는데, 압축을 푸는 도구를 3D 라이브러리와 같은 버전으로 못 박아 둬요(버전이 어긋나면 풀다 실패하거든요). 그리고 학습 자료(PDF)는 GraphRAG가 의미로 분석해 방·개념으로 만들어요.
솔직한 한계 — 얇은 사물 뒤에 큰 배경(커튼)이 있으면 비전이 배경을 잡을 수 있어요. 그땐 그 사물만 '정밀' 버튼으로 다시 잡고, 자동이 어긋난 방은 손편집으로 받쳐요(①계층).
바운딩 박스 — 가구 조각의 모든 점을 감싸는 가장 작은 상자를 씌워, 그 한가운데를 위치로, 상자 모양을 '가구냐 벽이냐' 단서로 써요(렌더링 없이 점만 읽어 오차 0). 상자 한가운데를 쓰는 건, 모델에 박힌 중심점이 모델러 손에 달려 못 믿는 반면 상자 가운데는 부피의 진짜 무게중심이라 사람이 느끼는 자리와 같기 때문이에요. 사진일 땐 AI가 화면에 2D 박스를 그리고 거기로 광선을 쏴 3D로 바꿔요. 이때 한 점만 쏘면 가구 틈으로 빠져 뒤벽을 맞히니, 3×3=9곳에 쏴 가장 가까운 앞면 무리만 평균 내요.
세그멘테이션 — "어떤 조각들이 한 사물인가"를 묶는 문제예요(부정확은 좌표가 아니라 대부분 여기서). 한 가구가 여러 조각이면 마커가 겹쳐 → 가까운 건 합쳐요. 거리 기준이 셋이에요 — 라벨과 상관없이 0.5m는 사람이 '같은 자리'로 느끼는 최소 간격(의자끼리는 보존하면서 쪼개진 메쉬만 솎음), 같은 라벨이면 1.0m(수납장 패널 여럿을 하나로), 높이를 버리고 위에서 본 0.42m는 바닥 러그와 공중 벽그림이 위에서 겹쳐 보이던 걸 풀려고 의자 간격보다 일부러 좁게 잡은 값이에요. 여러 가구가 한 덩어리면 좌표가 뭉쳐 → 통짜 메쉬는 빼고 사진·손편집으로 받쳐요(점이 한 덩어리라 기하학만으론 못 쪼갬).
📸 스크린샷 — 자동 이름 짓기는 방을 네 모서리 4장 찍어 AI에 딱 1번. '정밀'은 마커 1개당 1장(512×512)씩. 방 스캐너는 고정 장수가 아니라, 빠짐없이 덮이게 방 크기에 맞춰 자동으로 더 찍어요. 가장 먼 칸부터 채우는 건 적은 장수로 방을 최대한 덮어 촬영 비용을 아끼려는 것이고, 이웃 칸끼리 약 60% 겹치게 해 사이가 비지 않게 해요(형상 복원이 아니라 '빠짐없이 보였나'만 보면 되니 60%로 충분). 사물마다 15° 벌려 한 번 더 찍는 건 두 시선이 만나 위치를 정확히 잡게 하는 여유분이에요.
🔢 개수 — 가구 최대 22개 인식, 동선엔 최대 16개. 22는 한 방을 한 바퀴 돌며 외울 '정거장'의 경험적 상한이에요(쪼개진 메쉬가 수백 개면 외울 게 폭발하니까) — 부피 큰 가구부터 채워 22에서 끊고, 모자라면 동선 합성으로 메워요. 동선 16은 사람이 한 번에 떠올릴 수 있는 한계(7±2 + 공간 단서)인데, 학습할 내용이 16개를 넘으면 사용자 데이터를 버릴 수 없어 그 수까지는 허용하고 그 위로는 신뢰도순으로 잘라요. 마커가 겹치면 황금각 137.5°로 흩뿌려요 — 가장 무리수에 가까운 각이라 점을 돌려 찍어도 겹치거나 일렬로 안 서고 매번 가장 넓은 빈틈으로 들어가거든요(해바라기 씨앗이 박히는 원리). 무작위가 아니라 늘 같은 결과로 고르게 퍼지죠.
🎥 카메라 — 핫스팟 누를 때마다 28방향(약 12.86°마다)을 따져 가장 잘 보이는 자리를 골라 0.9초 활공해요. 너무 적으면 트인 틈을 놓치고 너무 많으면 계산이 비싸지는 균형점이죠.
방 파일(GLB) 하나만 열면, 업로드·세팅 없이 가구마다 번호 마커가 자동으로 박히고 동선까지 짜여요. (학습 개념은 PDF를 분석하면 이 마커 위에 얹혀요.)
이 실제 결과에서 바로 보이는 것:
• 시점 라벨 — "뒤 왼쪽", "앞 오른쪽"이 이름에 그대로(들어선 시점 기준)
• 같은 의자 여럿 → "의자 / 의자2"로 구분(4코너 선별)
• 동선 — 1식탁→2화분→3소파…12, 되돌아가지 않는 한붓
여기서 시작 — 도시·방을 고르는 화면. 한국사면 종로구(경복궁 등)를 고르면 그 명소 방에 학습을 배치해요.