본문 바로가기
공허의 유산/표현의 자유

Unity3D에서 USD 사용하기

by 바른생활머시마 2023. 11. 28.
728x90
반응형

연말이 되니 여기 저기서 저마다 성과를 자랑(?)하기 위해 난리입니다. 기업들은 특히 더 그렇죠.

재작년에 메타버스 바람이 불었고, 그 덕분에 우후죽순 시작했던 메타버스들은 아마도 지금 추운 겨울을 맞이하고 있을 것입니다. 메타버스가 그다지 붐이 불 상황이 아닌데 막 붐이 일었죠. 포털에서 '메타버스 출시'라는 키워드로 검색 해 보면 그 상황을 잘 볼 수 있습니다.

 

 외국의 사정은 조금 다른 것 같아요. 메타버스를 서비스로써 막 시도하는 것이 아니라 표준화 작업을 하고 있는 것 같아요.

 특히, Metaverse Standrard Forum에 특별한 관심이 가는데, OpenGL을 이끌었던 Khronos Group이 주도하고 있다는 점 때문에 개인적인 애정(?)도 많이 가고, 실제로 다른 표준 단체들보다 실질적인 활동과 산업적인 활용 측면에서 실질적인 사례 중심으로 접근을 한다는 점도 매력적인 것 같습니다. 

https://metaverse-standards.org/

 

The Metaverse Standards Forum

Leading Standards Organizations and Companies Unite to Drive Open Metaverse Interoperability

metaverse-standards.org

 

이런 표준들을 살펴보다 보면, 메타버스가 무엇인가에 대해서 좀 더 통찰(?) 같은 것이 생기는 것 같습니다. 우리가 GMarket이나 Youtube 같은 웹 기반으로 서비스 하는 사이트를 웹 서비스라고 하지 웹이라고 하지 않듯, 메타버스와 메타버스 기반(혹은 메타버스 스타일) 서비스를 구별해야 되겠습니다. 그래야, 메타버스가 억울한 오명을 쓰지 않을테니까요.

 

 

아래 그림은 MSF에서 관심있게 다루는 주제 중 하나인 교환 포멧에 대한 내용입니다.

 

여러 포메들 중, USB와 glTF를 표준에서 사용 할 포멧으로 검토 진행 중에 있습니다 USD는 Scene을 표현하는 쪽에, glTF는 오브젝트를 표현하는 쪽에 비중을 두고 있고, 공통적인 속성을 통일하기 위한 논의를 해 나가고 있는 것 같습니다.

 

glTF는 OpenGL 관련 된 일을 하면서 이전부터 그 존재를 잘 알았지만, USD는 개인적으로 매우 생소한 포멧이었습니다. PIxal에서 만들었다고 하고... 이 포멧도 범용적인 목적으로 쓰게 되면서 오픈소스 프로젝트로 진행이 되고 있습니다.

https://openusd.org/release/index.html

 

USD Home — Universal Scene Description 23.11 documentation

USD is a high-performance extensible software platform for collaboratively constructing animated 3D scenes, designed to meet the needs of large-scale film and visual effects production. USD enables robust interchange between digital content creation tools

openusd.org

 

전에 glTF를 Unity에서 로딩하는 포스트를 한 번 쓴 적이 있으니, 겸사 겸사 USD 로딩도 한번 해보겠습니다.

https://learn-and-give.tistory.com/124

 

Unity GLTF Utility를 이용한 모델 데이터 로딩

Unity에서 뭐 좀 해보려면 이쁜 데이터들이 많이 필요하고, 또 데이터를 입맛에 맞게 수정 할 수 있게 하려다보면 Runtime에 파일을 로딩하는 방법도 필요합니다. 그런 여러가지 길고 복잡한 업무들

learn-and-give.tistory.com

 

 

샘플 파일

OpenUSD의 아래 페이지의 아래쪽에 있는 부엌 데이터를 받겠습니다.

https://openusd.org/release/dl_downloads.html

 

Downloads and Videos — Universal Scene Description 23.11 documentation

© Copyright 2021, Pixar Animation Studios.

openusd.org

사용 조건에 동의를 한 후 다운로드 받게 됩니다.

 

 

Unity 쪽 준비

Unity Project를 하나 만들겠습니다.

 

USD는 Experimental package를 이용하여 다룰 수 있습니다.

https://docs.unity3d.com/Packages/com.unity.formats.usd@3.0/manual/index.html

 

USD Experimental Package for Unity | USD | 3.0.0-exp.5

USD Experimental Package for Unity This package includes a set of libraries designed to support the use of USD in C#, as well as code to import and export USD files into the editor. The goal of this package is to make it maximally easy to integrate and exp

docs.unity3d.com

 

일단 프로젝트가 만들어지면 프로젝트 셋팅에서 두 가지 설정을 변경 해 줍니다. 

패키지 설명 된 페이지 내용을 찬찬히 읽어보면서 하면 됩니다.

 

그 아래 나오는 내용처럼, Package Manager에서 Package 배포처를 설정하는데, 저는 git URL을 입력해서 설치하겠습니다.

https://github.com/Unity-Technologies/usd-unity-sdk.git?path=package/com.unity.formats.usd

아래와 같이 설치가 되었습니다.

 

Project 폴더의 Package에도 USD 폴더가 보이고,

메뉴에도 USD가 보입니다.

 

메뉴에서 USD를 눌러보면 GameObject, Prefab, Timeline Clip 으로 가져 올 수 있습니다.

GameObject로 한번 가져와 보겠습니다.

다운로드 받은 파일에서 instanced 말고 다른 것을 한번 가져와 보겠습니다.

음...아무것도 보이지 않네요. ㅋ

instance도 마찬가지고...

 

Package 내부에 포함 되어 있던 샘플을 한번 로딩 해 보니 잘 보이네요.

\Library\PackageCache\cohttp://m.unity.formats.usd@fc4f7b10a7\Samples\ImportMesh

 

로딩이 된 GameObject를 선택하면 Inspector에 다양한 속성이 보입니다.

일단 GameObject가 되고 나면 그 다음엔 UnityPackage 등으로 Export도 할 수 있으니, Unity 기반의 사용에는 별 문제가 없을 것입니다.

 

Runtime에 임의 위치에 있는 USD를 로딩하는 것은, 저 메뉴에 연결 된 코드를 따라서 해보면 되는데...

대충 아래와 같은 형태로 코드를 짜면 런타임에도 로딩을 할 수 있었습니다. 

매뉴의 코드를 보면 using...요런게 있는데 적당한 것을 추가해야 하고, 자동으로 안되면 같은걸로 해주면 됩니다.

    public void LoadUSDFile()
    {
        if (Application.isPlaying)
        {
            var path = (USD 파일 경로);
            var loadSet = pxr.UsdStage.InitialLoadSet.LoadAll;


            InitUsd.Initialize();
            var stage = pxr.UsdStage.Open(path, loadSet);
            var scene = Scene.Open(stage); 

            if (scene == null)
            {
                Debug.Log("No Scene");
                return;
            }

            ImportHelpers.ImportSceneAsGameObject(scene, Selection.activeGameObject);
            scene.Close();
        }
        else
            Debug.Log("Not Playing");
    }

 

아래와 같이 UI에 버튼을 달아서 버튼을 누르면 파일을 로딩 할 수도 있습니다.

매뉴에 사용하는 코드를 다른 목적으로 전용했기 때문에, 속성 설정 관련 코드는 없기 때문에 요런 부분은 에디터에서 설정을 변경 해 보면서 로딩 할 때 조건을 바꿔 볼 수 있을 것 같습니다.

 

USD package에 샘플 프로젝트나 파일들이 있으니, 그것을 살펴보면서 공부를 해보면 좋을 것 같네요.

일단 퀵~ 하게 되는지는 요렇게 알아보았습니다.

728x90
반응형

댓글