개발 기록/[CTSG] 25.06.01-

[디지털 트윈] Unity에서 건물을 3D로 시각화하기

Dachaes 2025. 6. 27. 13:07
728x90
728x90

Unity에서 건물을 3D로 시각화하기 

디지털 트윈 프로젝트를 준비하며, 웹 브라우저 상에서 3D 지도를 구현해보려 합니다. 이를 위해 지형, 건물, 도로 등 다양한 공간 정보를 시각화할 계획입니다. 우선 V-World 디지털트윈국토에서 지원하는 GIS건물통합정보를 기반으로,  Unity 위에 건물 데이터를 3D로 표현하려 합니다.

 


이전 글 보기

 

[디지털 트윈] Unity에 3D 지형 시각화하기 - 수치 지형도/정사 영상 편

Unity에 3D 지형 시각화하기 - 수치 지형도/정사 영상 편 디지털 트윈 프로젝트를 준비하며, 웹 브라우저 상에서 3D 지형을 구현해보려 합니다. 이를 위해 지형, 건물, 도로 등 다양한 공간 정보를

dachaes-devlogs.tistory.com

 

[디지털 트윈] Unity에 3D 지형 시각화하기 - DEM 편

Unity에 3D 지형 시각화하기 - DEM 편 디지털 트윈 프로젝트를 준비하며, 웹 브라우저 상에서 3D 지형을 구현해보려 합니다. 이를 위해 지형, 건물, 도로 등 다양한 공간 정보를 시각화할 계획입니다.

dachaes-devlogs.tistory.com

 


개발 환경

  • Node v22.16.0
  • React v19.1.0 (TypeScript) + Vite
  • QGIS Desktop 3.42.3 3.44.0
  • Unity 6000.0.50f1 (LTS)

개발 순서

    1. 건물 정보 SHP 파일 다운받기
    2. QGIS에서 필요 지역만 자르기
    3. QGIS에서 건물을 3D로 변환하기
    4. glTF 파일로 내보내기 (export)
    5. 유니티에 불러오기

참고 사이트

 


1.  건물 정보 SHP 파일 다운받기

V-World 디지털트윈국토 공식 사이트에서 필요한 GIS건물통합정보 SHP 파일을 다운받습니다.

 


2.  QGIS에서 필요 지역만 자르기

a.  QGIS에서 SHP 파일 열기 (예시 - 경기도)

QGIS를 실행합니다. 레이어 > 레이어 추가 > 벡터 레이어 추가 > SHP 파일 선택하면 지도에 전체 건물이 표시됩니다.

💡 참고 : QGIS에서 .shp 파일을 열 때 실제로는 해당 .shp와 연관된 모든 파일(.shx, .dbf, .prj 등)을 백그라운드에서 자동으로 함께 로드합니다. 사용자는 .shp만 선택하지만, 이들 파일은 각각 공간정보, 속성정보, 좌표계 정보 등을 담고 있어 정상적인 레이어 표시를 위해 모두 필요합니다.

추가한 SHP 파일을 우클릭하여 속성 > 소스 에서 데이터 소스 인코딩을 korean 으로 바꿉니다.

b.  필요한 지역 찾기

위치 좌표를 통해 찾는 방법과 직접 지도에서 찾는 방법이 있습니다.

직접 지도에서 찾기 위해 탐색기 탭의 XYZ Tiles > OpenStreetMap 를 레이어 탭으로 끌어 내립니다.

c.  필요한 지역 잘라내기

레이어 > 레이어 생성 > 새 임시 스크래치 레이어를 선택하면 새 임시 스크래치 레이어 창이 열립니다. 레이어 이름을 작성하고, 도형 유형을 선택합니다. 좌표계는 프로젝트와 파일과 동일한 좌표계를 선택합니다.

레이어 탭에 방금 만든 임시 스크래치 데이터가 생성된 것을 볼 수 있습니다.

새로 만든 레이어를 우클릭하여 편집 모드 켜고 끄기를 누릅니다. 편집 > 폴리곤 피처 추가를 선택하고, 원하는 영역을 그리고, 저장합니다.

벡터 > Geoprocessing Tools > 잘라내기(clip)를 선택하면 벡터 중첩 - 잘라내기(clip) 창이 열립니다. 입력 레이어에는 건물 정보가 있는 레이어를, 중첩 레이어에는 원하는 위치를 고른 레이어를 선택한 후 실행합니다.

경기도의 경우에는 건물 레이어가 3개 였으니 잘라내기를 3번 실행합니다. 레이어 탭에 산출물이 3개 생성됩니다.

 


3.  QGIS에서 건물을 3D로 변환하기

레이어 탭의 산출물을 우클릭하여 속성 > 정보를 확인하면 도형 란이 Polygon(MutiPolygon)인 것을 확인할 수 있습니다. Polygon(MutiPolygon)은 Z값이 없는 2D 폴리곤이기 때문에 속성 테이블의 높이 값을 사용하기 위해서 압출 방식으로 3D 효과 적용해야 합니다.

잘라낸 건물 레이어를 우클릭하여 속성창을 엽니다. 3D 뷰 > 단일 심볼 > 압출 에서 원하는 높이 값이 있는 필드를, 계산이 필요할 경우에는 표현식을 선택합니다.

모든 건물 레이어의 3D 뷰 속성을 변경했으면, 상단 탭의 보기 > 3D 지도 보기 에서 정상적으로 높이가 압출되었는지 확인합니다.

 


4.  glTF 파일로 내보내기 (export)

상단 탭의 플러그인 > 플러그인 관리 및 설치 창을 엽니다. 플러그인 창에서 Qgis2threejs을 설치합니다. 설치가 완료되면 상단 탭의 웹 > Qgis2threejs > Qgis2threejs Exporter  열고, DEM을 선택합니다.

 

원하는 구획만 export하고 싶다면, Scene > Scene Settings 를 누르고, Base Extent > Fixed extent > Select > Use Layer Extent 에서 원하는 크기의 레이어를 선택합니다. 또는 Base Extent > Fixed extent > Select > Select Extent on Canvas 를 선택하여 원하는 크기를 직접 드래그합니다.

선택한 DEM을 우클릭하여 properties 창을 띄우고, Material에서 원하는 레이어(정사 영상 이미지 선택, 건물은 선택하지 않아도 됨)를 선택해줍니다. 그리고 해상도 설정을 해줍니다.

Resampling level은 DEM 지형 mesh의 디테일(폴리곤 수)이고, Image width는 텍스처 이미지의 가로 해상도를 의미합니다. Imaga format은 압축 손실도가 낮은 PNG를 선택합니다. Tiles 탭에서도 수치를 조정해줍니다. Tiles size는 DEM과 텍스처(정사영상)를 몇 개의 작은 블록(조각)으로 나눌지 정하는 값이고, Tiles Roughness는 타일 경계가 너무 딱딱하지 않게, 연결 부위를 부드럽게 만드는 정도입니다.

너무 높은 수치는 성능의 저하 가능성이 있으니 유의해서 조정해야 합니다. 또한 export 후에 유니티에 import 했는데, 지도 바깥의 불필요한 부위가 export되는 경우가 있습니다. 이럴 경우에는 넓은 지역을 export하게 되어서 원하는 지역의 해상도가 오히려 떨어집니다. 이때는 Tiles size 가 과도하게 많이 적용되어 그런거니 수치를 줄여주시면 됩니다.

본 프로젝트에서는 Tiles 값은 건드리지 않았고, 정사 영상 단위로 개별 export하였습니다.

하지만 glTF 파일로 export하기 전에 확인하니, 건물이 높이가 적용이 제대로 되고 있지 않는다는 것을 알았습니다.

Layers 탭에서 아래로 스크롤을 내리면, Polygon에 잘라낸 건물의 레이어가 있습니다. 건물 레이어를 우클릭하여 Properties 창을 엽니다. Type 과 Z coordinate 설정을 변경합니다. Height는 원하는 높이가 있는 테이블 컬럼이나 원하는 표현식을 적어줍니다.

모든 건물 레이어의 높이 설정이 끝나면, Qgis2threejs 창에서 건물들이 깔끔하게 3D 설정이 완료된 것을 볼 수 있습니다. (가시성을 위해 레이어 색상을 바꾸었음)

export에 앞서 building이 완전히 끝나고, glTF로 저장합니다.

 


4.  유니티에 불러오기

우선 유니티 프로젝트를 열고, 상단 탭에서 Window > Package Manager 를 엽니다. 추가(+) > 패키지 이름으로 설치(install package by name) 를 선택하여 com.unity.cloud gltfast를 설치합니다.

폴더에 gltf 파일을 드래그하고, 변환된 파일을 씬에 드래그하면 유니티에 성공적으로 올라간 것을 확인할 수 있습니다.

 


5.  실행 결과

아무리 Qgis2threejs에서 해상도를 높이려 해도, 한정된 데스크탑 성능과 너무 넓은 지형인 까닭에 많은 어려움이 있었습니다. 최종적으로는 해당 지역의 모든 정사영상+건물을 각각 쪼개어 export하여 유니티에 불러오는 방식을 선택하였습니다.

 

 


다음 글 보기

 

[디지털 트윈] Unity에서 SUMO 도로 네트워크(.net.xml) 시각화하기

Unity에서 SUMO 도로 네트워크(.net.xml) 시각화하기 SUMO로 도로네트워크 시뮬레이션을 위해 도로 정보를 lane(차선) 단위로 분석·시각화하려고 합니다. 하지만 SUMO에서 자체적으로 변환한 GeoJSON 파일

dachaes-devlogs.tistory.com

 


728x90