Modele

Model w usłudze Azure Remote Rendering odnosi się do pełnej reprezentacji obiektu złożonej z jednostek i składników. Modele to główny sposób pobierania danych niestandardowych do usługi zdalnego renderowania.

Struktura modelu

Model ma dokładnie jedną jednostkę jako węzeł główny. Poniżej można znaleźć dowolną hierarchię jednostek podrzędnych. Podczas ładowania modelu zwracane jest odwołanie do tej jednostki głównej.

Każda jednostka może mieć dołączone składniki . W najczęstszym przypadku jednostki mają obiekty MeshComponents, które odwołują się do zasobów siatki.

Tworzenie modeli

Tworzenie modeli dla środowiska uruchomieniowego jest osiągane przez konwertowanie modeli wejściowych z formatów plików, takich jak FBX, GLTF lub E57. Proces konwersji wyodrębnia wszystkie zasoby, takie jak tekstury, materiały i siatki, i konwertuje je na zoptymalizowane formaty środowiska uruchomieniowego. Wyodrębni również informacje strukturalne i przekonwertuje je na strukturę jednostki/składnika usługi ARR.

Ważne

Konwersja modelu to jedyny sposób tworzenia siatk. Mimo że siatki mogą być współużytkowane między jednostkami w czasie wykonywania, nie ma innego sposobu na przejście siatki do środowiska uruchomieniowego, poza ładowaniem modelu.

Ładowanie modeli

Po przekonwertowaniu modelu można go załadować z usługi Azure Blob Storage do środowiska uruchomieniowego.

Istnieją dwie odrębne funkcje ładowania, które różnią się sposobem, w jaki zasób jest adresowany w magazynie obiektów blob:

  • Model można rozwiązać bezpośrednio za pomocą parametrów magazynu obiektów blob, jeśli magazyn obiektów blob jest połączony z kontem. Odpowiednią funkcją ładowania w tym przypadku jest LoadModelAsync parametr LoadModelOptions.
  • Model można rozwiązać za pomocą identyfikatora URI sygnatury dostępu współdzielonego. Odpowiednia funkcja ładowania jest LoadModelFromSasAsync z parametrem LoadModelFromSasOptions. Użyj tego wariantu również podczas ładowania wbudowanych modeli.

W poniższych fragmentach kodu pokazano, jak ładować modele z jedną z funkcji. Aby załadować model przy użyciu parametrów magazynu obiektów blob, użyj kodu podobnego do poniższego:

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);
        }
    );
}

Jeśli chcesz załadować model przy użyciu tokenu SAS, użyj kodu podobnego do poniższego fragmentu kodu:

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);
        }
    );
}

Następnie można przejść przez hierarchię jednostek i zmodyfikować jednostki i składniki. Ładowanie tego samego modelu wiele razy powoduje utworzenie wielu wystąpień, z których każda ma własną kopię struktury jednostki/składnika. Ponieważ siatki, materiały i tekstury są zasobami udostępnionymi, ich dane nie zostaną jednak ponownie załadowane. W związku z tym utworzenie wystąpienia modelu więcej niż raz powoduje stosunkowo małe obciążenie pamięci.

Dokumentacja interfejsu API

Następne kroki