Modely

Model ve vzdáleném vykreslování Azure odkazuje na úplné reprezentace objektů tvořené entitami a komponentami. Modely představují hlavní způsob, jak získat vlastní data do služby vzdáleného vykreslování.

Struktura modelu

Model má právě jednu entitu jako svůj kořenový uzel. Pod tím, že může mít libovolnou hierarchii podřízených entit. Při načítání modelu je vrácen odkaz na tuto kořenovou entitu.

Každá entita může mít připojené součásti . V nejběžnějších případech mají entity MeshComponents, které odkazují na prostředky sítě.

Vytváření modelů

Vytváření modelů pro modul runtime je dosaženo převodem vstupních modelů z formátů souborů, jako jsou FBX a GLTF. Proces převodu extrahuje všechny prostředky, jako jsou textury, materiály a sítě, a převede je na optimalizované formáty modulu runtime. Také extrahuje strukturální informace a převede je na strukturu grafu entit/komponent v ARR.

Důležité

Převod modelu je jediným způsobem, jak vytvořit sítě. I když lze sdílet sítě mezi entitami za běhu, neexistuje žádný jiný způsob, jak získat síť do modulu runtime, kromě načítání modelu.

Načítání modelů

Po převodu modelu je možné ho načíst z Azure Blob Storage do modulu runtime.

Existují dvě odlišné funkce načítání, které se liší podle způsobu, jakým se prostředek řeší v úložišti objektů BLOB:

  • Model je možné adresovat přímo pomocí parametrů služby Blob Storage, pokud je úložiště objektů BLOB propojené s účtem. Relevantní funkce načítání v tomto případě je LoadModelAsync s parametrem LoadModelOptions .
  • Model může být adresován identifikátorem URI SAS. Relevantní funkce načítání je LoadModelFromSasAsync s parametrem LoadModelFromSasOptions . Tuto variantu použijte také při načítání předdefinovaných modelů.

Následující fragmenty kódu ukazují, jak načíst modely pomocí kterékoli funkce. Chcete-li načíst model pomocí jeho parametrů úložiště objektů blob, použijte kód podobný následujícímu:

async void LoadModel(RenderingSession session, Entity modelParent, string storageAccount, string containerName, string assetFilePath)
{
    // load a model that will be parented to modelParent
    var modelOptions = new LoadModelOptions(
        storageAccount, // storage account name + '.blob.core.windows.net', e.g., 'mystorageaccount.blob.core.windows.net'
        containerName,  // name of the container in your storage account, e.g., 'mytestcontainer'
        assetFilePath,  // the file path to the asset within the container, e.g., 'path/to/file/myAsset.arrAsset'
        modelParent
    );

    var loadOp = session.Connection.LoadModelAsync(modelOptions, (float progress) =>
    {
        Debug.WriteLine($"Loading: {progress * 100.0f}%");
    });

    await loadOp;
}
void LoadModel(ApiHandle<RenderingSession> session, ApiHandle<Entity> modelParent, std::string storageAccount, std::string containerName, std::string assetFilePath)
{
    LoadModelOptions modelOptions;
    modelOptions.Parent = modelParent;
    modelOptions.Blob.StorageAccountName = std::move(storageAccount);
    modelOptions.Blob.BlobContainerName = std::move(containerName);
    modelOptions.Blob.AssetPath = std::move(assetFilePath);

    ApiHandle<LoadModelResult> result;
    session->Connection()->LoadModelAsync(modelOptions,
        // completion callback
        [](Status status, ApiHandle<LoadModelResult> result)
        {
            printf("Loading: finished.");
        },
        // progress callback
        [](float progress)
        {
            printf("Loading: %.1f%%", progress * 100.f);
        }
    );
}

Pokud chcete model načíst pomocí tokenu SAS, použijte kód podobný následujícímu fragmentu kódu:

async void LoadModel(RenderingSession session, Entity modelParent, string modelUri)
{
    // load a model that will be parented to modelParent
    var modelOptions = new LoadModelFromSasOptions(modelUri, modelParent);

    var loadOp = session.Connection.LoadModelFromSasAsync(modelOptions, (float progress) =>
    {
        Debug.WriteLine($"Loading: {progress * 100.0f}%");
    });

    await loadOp;
}
void LoadModel(ApiHandle<RenderingSession> session, ApiHandle<Entity> modelParent, std::string modelUri)
{
    LoadModelFromSasOptions modelOptions;
    modelOptions.ModelUri = modelUri;
    modelOptions.Parent = modelParent;

    ApiHandle<LoadModelResult> result;
    session->Connection()->LoadModelFromSasAsync(modelOptions,
        // completion callback
        [](Status status, ApiHandle<LoadModelResult> result)
        {
            printf("Loading: finished.");
        },
        // progress callback
        [](float progress)
        {
            printf("Loading: %.1f%%", progress * 100.f);
        }
    );
}

Následně můžete procházet hierarchii entit a upravit entity a komponenty. Načtení stejného modelu několikrát vytvoří více instancí, z nichž každá má vlastní kopii struktury entity nebo komponenty. Vzhledem k tomu, že sítě, materiály a textury jsou sdílené prostředky, jejich data nebudou znovu načtena, ale. Proto se vytváření instancí modelu více než jednou zaznamená poměrně malým nároky na paměť.

Dokumentace k rozhraní API

Další kroky