동적 가상 대상을 불러올 수 있는 규범과 실현 방안

Project Spirare란


Project Spirare[1](프로젝트 속도)는 포함된 프로그램의 가상 객체를 정의하고 구현하기 위한 일반적인 형식의 프로젝트입니다.
Spirare에서는 3D 모델과 프로그램이 결합된 가상 객체를 정의할 수 있으며 응용 프로그램에서 가상 객체를 동적으로 로드할 수 있습니다.
예를 들어, 다음 객체의 3D 모델과 사용 후 점프 프로그램은 응용 프로그램 내에서 매립되지 않고 외부 파일에서 로드됩니다.

Spirare 대상


모든 응용 프로그램에서 사용할 수 있는 일반 형식


VRChat 등 소셜VR 앱에서는 세계로 불리는 공간 정보(공간의 3D 모델과 스크립트 등)를 업로드해 앱 내에서 활용할 수 있다.
하지만 세계의 규격은 응용 프로그램에 따라 다르다.
특히 절차 부분은 큰 과제다.Unity에 사용된 C# 스크립트는 실행 시 동적으로 추가될 수 없습니다(Asset Bundle 메커니즘을 사용하는 경우 제작 시 포함된 스크립트를 사용할 수 있습니다).따라서 몇 개의 응용 프로그램에서 사용할 수 있는 스크립트를 제공하여 각 응용 프로그램의 독특한 구조에 따라 프로그램을 기술할 수 있으며 서로 다른 규격이다.
응용 프로그램마다 형식이 다르면 대상과 세계를 다시 만들어야 하고 응용 프로그램의 서비스가 끝나면 대상을 사용할 수 없습니다.

동시에 서비스 시작


현재의 AR/VR 설비에서 3D 응용 프로그램은 대부분 배타적으로 작동한다.한 애플리케이션만 동시에 시작할 수 있다는 뜻이다.
따라서 하나의 응용 프로그램을 작게 만들고 조합해서 사용할 수 없다.업무 사용과 일상적인 사용을 고려하면 매우 불편하다.
따라서 가상 대상이 서비스의 UI와 기능을 실현할 수 있다면 한 응용 프로그램에서 여러 개의 서비스를 사용하여 응용과 동시에 시작할 수 있다.
미리 애플리케이션 기능을 구축한 로컬 애플리케이션이 아닌 로드 컨텐트가 있는 것이므로 웹 브라우저나 웹 애플리케이션과 유사한 구조입니다.

Spirare의 구조


가상 객체의 정의는 다음 요소로 구성됩니다.
  • 대상의 정의(xml 파일)
  • 3D 모델(GLB 파일)
  • 프로그램(WebAssiembly 파일)
  • 정의 대상(xml 파일)


    <scene>
        <model src="./gun.glb" position="1 0 0.1">
            <script src="../wasm/fire_object.wasm"/>
        </model>
    </scene>
    <resource>
        <model id="bullet" src="./bullet.glb"/>
    </resource>
    
    객체 정의 파일에서 3D 모델 데이터와 WebAssiembly 스크립트를 조합하여 객체 정의를 수행합니다.<scene> 탭에 표시되는 객체, <resource> 탭에서 스크립트에서 사용되는 에셋 정의(예: Unity의 장면 및 프리셋)를 실행합니다.
    이 형식을 xml로 바꾸는 것은 HTML과 합치기 위해서입니다.
    어느 정도 눈에 익은 포맷이고 웹의 구조와 구조를 활용하기 쉽다는 이유에서다.나는 SSG(Static Site Generator)와 성격이 매우 좋다고 생각한다.

    3D 모델(GLB 파일)


    3D 모델 부분은 GLB 형식의 파일을 직접 사용합니다.

    프로그램(WebAssiembly 파일)


    WebAssembly(wasm)는 브라우저에서 실행되는 수준 낮은 언어입니다.원래는 브라우저를 대상으로 했으나 여러 환경에서 같은 프로그램을 안전하고 고속으로 실행할 수 있어 브라우저 밖에서도 활용되고 있다.
    WebAssembly에서는 스크립트 이외의 접근(파일 접근, 네트워크 접근 등)에 직접 접근할 수 없으며, WebAssiembly를 실행하는 호스트 측의 코드를 통해 진행된다.
    WebAssiembly 사이드 코드와 WebAssiembly를 실행하는 호스트 사이드 코드를 사용하여 함수 이름과 파라미터를 호스트에서 호출하거나 호스트의 함수를 반대로 호출할 수 있습니다.
    Spirare는 게임 엔진 객체를 조작하는 데 사용되는 원래 함수를 정의합니다.
    예를 들어 transform_get_local_positon_x는 대상 위치를 얻는 x 좌표의 함수이고 transform_set_local_positon는 대상 위치를 설정하는 함수이다.만약 게임 엔진에서 이 행위를 실현했다면, WebAssiembly에서 이 함수를 사용하여 대상을 조작할 수 있다.지금은 유니티에서만 구현되며, 언리얼 에너지 등 다른 플랫폼에서도 함수를 구현할 경우 웹애슬리브블루에서는 플랫폼과 관계없이 모두 조작이 가능하다.
    또한 호스트 측면에서 WebAssembly 함수를 호출하는 예는 프레임당 호출update 함수나 객체를 선택할 때 호출되는on_select 함수 등을 정의합니다.
    이를 통해 특정 이벤트에 반응하는 코드를 WebAssembly 측면의 코드로 기술할 수 있습니다.
    image

    이루어지다


    샘플 내용


    https://github.com/ProjectSpirare/spirare-sample-contents
    견본 내용.
    GiitHub Pages를 사용하여 컨텐트 파일을 공개합니다. 예를 들어 다음 URL에서 컨텐트를 다운로드할 수 있습니다.
    https://projectspirare.github.io/spirare-sample-contents/index.xml

    Unity용 라이브러리


    https://github.com/ProjectSpirare/Spirare-Unity
    가상 객체의 동적 로드 및 WebAssiembly 스크립트를 실행하는 Unity용 라이브러리

    WebAssiembly용 Rust 라이브러리


    https://github.com/ProjectSpirare/spirare-rust
    호스트와 WebAssiembly 사이의 함수는 원시적이며 직접 사용하면 기술량이 많아지고 복잡한 코드가 된다.
    그래서 우리는 원시 함수를 더욱 잘 응용하기 위해 프로그램 라이브러리를 만들었다.
    예를 들어 다음은'사용 대상'의 활동을 촉발할 때 총알을 발사하는 코드다.마치 Unity의 C# 스크립트처럼 느껴집니다.
    #[no_mangle]
    unsafe fn on_use() {
        let transform = Transform::myself();
        let gun_position = transform.world_position();
        let gun_rotation = transform.world_rotation();
    
        // spawn bullet
        let result = element::spawn_object_by_id("bullet");
        if result.is_err() {
            return;
        }
        let bullet_element = result.unwrap();
    
        // set position and rotation
        let offset = 0.5;
        let forward = transform.forward();
        let bullet_position = gun_position + offset * forward;
    
        let bullet_transform = bullet_element.transform();
        bullet_transform.set_world_position(bullet_position);
        bullet_transform.set_world_rotation(gun_rotation);
    
        // set velocity
        let speed = 4.0;
        let velocity = speed * forward;
        bullet_element.physics().set_world_velocity(velocity);
    }
    

    끝말


    Project Spirare는 현재 혼자만의 프로젝트로 앞으로 어디까지 할 수 있을지 모르겠지만 여러분의 응원을 받을 수 있다면 기쁠 것 같습니다.
    의견이나 건의가 있으면 반드시 트위터(Twitter)에 메시지를 보내주세요.
    각주
    스피라레는 라틴어로'숨'을 뜻한다.가상 대상에 프로그램을 삽입해서 생명을 주입하기를 바랍니다.↩︎

    좋은 웹페이지 즐겨찾기