Cesium for Unity에 원하는 위도, 경도에 건물 obj들을 띄워보자

나묘쿠·2023년 2월 26일
0

유니티

목록 보기
1/1
post-thumbnail

교수님이 진행하시는 프로젝트에 렌더링 팀의 팀장으로 참여한지 어연 세 달...모델링 팀의 작업이 드디어 일단락 되어 나의 할 일이 생겼다. 모델링팀에게 전달받은 obj 파일과 언물들의 위도, 경도 정보가 들어있는 json파일을 읽어 cesium for unity에 구현하는 것이다!

유니티가 완전 처음이기에...obj 파일을 어떻게 유니티에 부르는지 부터 시작했다. 먼저, 유니티에서 obj파일이나 json파일을 읽어오려면 asset 폴더 안에 Resources 라는 폴더를 만들어야 하더라.
https://ansohxxn.github.io/unitydocs/resources/ 참고!

내가 해야 하는 건 json을 읽어 여러개의 obj파일을 하나의 스크립트로 자동으로 불러와 위도, 경도까지 설정해주는 스크립트를 작성하는 것이다.
일단 Building이라는 빈 오브젝트를 생성해주었다.

CesiumGeoreference를 세팅하는 방법은 Cesium for Unity 퀵스타트 튜토리얼에 나와있으니 그걸 참고하도록 하자.

그리고 Building 오브젝트에 빌딩이라는 스크립트를 만들어 붙여주었다.

json파일을 어떻게 유니티에서 읽어오는지 찾아보니 유니티에서 제공하는 JsonUtility가 2계층 이상의 Json 파일은 읽지 못한다고 한다. 하지만 내가 전달받은 파일은 배열의 이름이 건물 번호이고, 배열 안에 파일명, 위도, 경도가 저장되어있는 복잡한 Json파일이어서 먼저 Json의 샘플 파일을 만드는 것부터 했다.

이렇게 Json파일을 정리했다.
http://www.tcpschool.com/json/json_basic_structure 참고!

https://nicotina04.tistory.com/211https://bloodstrawberry.tistory.com/754 를 참고하여 다음과 같이 스크립트를 짜주었다. 주석에 쓰여있는 데이터 손실은 밑에서 설명하겠다.

그리고 이제 prefab을 이용해 Building이라는 빈 오브젝트에 전달받은 여러개의 obj파일의 모습을 입혀 복사할 것이다.

먼저, 읽어들인 각 obj마다 모습과 정보를 따로 설정해주어야 하기 때문에 다음과 같이 foreach로 묶어 이 안에서 코드를 짤것이다.

먼저 class의 바로 밑에 prefab이라는 property를 선언해주자.
그리고 다음과 같이 코드를 짜주었다.

첫 줄에서 prefab에 Resources 폴더에서 json에서 읽어온 파일명의 파일을 불러와 입혀주고, Instantiate을 사용해 scene에 복사를 한다. 이렇게 하면 obj의 모습을 한 오브젝트가 scene에 보이게 된다. 그 밑 줄의 SetParent는, Cesium의 좌표계가 CesiumGeoreference영역 안에서만 작동하기 때문에 CesiumGeoreference를 부모 오브젝트로 설정해 그 밑에 생성되게 하였다.

Cesium for unity에서 obj의 위치를 위도와 경도로 지정하려면 CesiumGlobeAnchor라는 component를 지정해줘야 한다.
그래서 다음과 같이 복사된 오브젝트가 컴포넌트를 갖도록 하였다.

그리고 이제 읽어온 위도와 경도 정보를 오브젝트에 지정해줘야 하는데, 이때 아까 데이터 손실때문에 string으로 읽어온 정보를 double형으로 바꿔주며 위도와 경도를 지정해준다. 왠진 모르겠는데 double형이 충분히 읽을 수 있는 데이터의 크기였음에도 불구하고 double형으로 읽으면 데이터 손실이 발생하여 먼저 string으로 읽어 숫자들을 보존하고 이렇게 double형으로 바꾸어 사용하였더니 데이터 손실이 발생하지 않았다.

이러면 이제 원하는 위도 경도에 원하는 obj의 모습을 한 객체들을 맵에 띄울 수 있다. 하지만 이대로는 rotation이 멋대로 생성되기 때문에 (이유는 모름)

이렇게 rotation도 0으로 지정을 해줬다.

이렇게 하면 완성 같지만 완성이 아니다..height는 자동으로 지정되는게 아니고 cesium에서도 height를 읽어오는 편의기능을 아직 제공하지 않기 때문에 외부 라이브러리를 사용해야 한다고 하더라..
Cesium 개발자의 공식 답변도 Raycast라는 라이브러리를 사용하라고 했다.

https://community.cesium.com/t/getting-the-map-height-for-a-given-lat-long/21815 참고!

어쨌든..! 4월 중으로 해결해야하는 프로젝트인데 주말동안 거진 이틀만에 끝내버려서 좀 뿌듯하다. 일단 교수님께 보여드려야겠다.

profile
사고의 흐름을 따라가 보자.

0개의 댓글