Sdílet prostřednictvím


Modely

Model ve službě Azure Remote Rendering odkazuje na úplnou reprezentaci objektů tvořenou 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á jako kořenový uzel přesně jednu entitu . Pod tím, že může mít libovolnou hierarchii podřízených entit. Při načítání modelu se vrátí odkaz na tuto kořenovou entitu.

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

Vytváření modelů

Vytváření modelů pro modul runtime se dosahuje převodem vstupních modelů z formátů souborů, jako jsou FBX, GLTF nebo E57. 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 entity nebo komponenty ARR.

Důležité

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

Načítání modelů

Jakmile se model převede, můžete ho načíst z úložiště objektů blob v Azure do modulu runtime.

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

  • Model je možné vyřešit přímo parametry úložiště objektů blob, 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 adresovat jeho identifikátor 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 s některou funkcí. Pokud chcete načíst model pomocí 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 = LoadModelOptions.CreateForBlobStorage(
        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 načíst model 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);
        }
    );
}

Potom můžete procházet hierarchii entit a upravovat entity a komponenty. Načtení stejného modelu několikrát vytvoří více instancí, z nichž každá má vlastní kopii struktury entity/komponenty. Vzhledem k tomu, že sítě, materiály a textury jsou sdílené prostředky, jejich data se ale znovu nenačtou. Proto vytvoření instance modelu více než jednou způsobuje relativně malou režii na paměť.

Dokumentace k rozhraní API

Další kroky