模型

Azure 遠端轉譯中的「模型」指的是完整的物件標記法,其由 實體元件所組成。 模型是讓自訂資料加入遠端轉譯服務的主要方式。

模型結構

模型只有一個實體做為根節點。 其底下可能有子實體的任意階層。 載入模型時,系統會傳回此根實體的參考。

每個實體都可能有附加元件。 在最常見的情況下,具有「MeshComponents」的實體會參考網格資源

建立模型

建立執行階段模型的方式是從檔案格式 (例如 FBX、GLTF 或 E57) 轉換輸入模型。 轉換程序會將所有資源 (例如紋理、材質和網格) 解壓縮,並將這些資源轉換成最佳化的執行階段格式。 它也會將結構化資訊解壓縮,並將其轉換成 ARR 的實體/元件圖表結構。

重要

模型轉換是建立網格的唯一方式。 雖然網格可以在執行階段於實體之間共用,但是卻沒有其他方法可以在不載入模型的情況下,將網格加入執行階段。

載入模型

一旦模型轉換之後,就可以從 Azure blob 儲存體載入至執行階段。

其中有兩個不同的載入函式,其與在 blob 儲存體中定址資產的方式不同:

  • 此模型可直接由 Blob 儲存體參數定址,以防 Blob 儲存體連結至帳戶。 在此情況下,相關的載入函式為 LoadModelAsync 搭配 LoadModelOptions 參數。
  • 模型可以透過其 SAS URI 定址。 相關的載入函式為 LoadModelFromSasAsync 搭配 LoadModelFromSasOptions 參數。 當在載入內建模型時,也請使用此變數。

下列程式碼片段示範如何使用其中一個函式以載入模型。 若要使用模型的 Blob 儲存體參數載入模型,請使用類似下列的程式碼:

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

如果您想使用 SAS 權杖載入模型,請使用類似下列程式碼片段的程式碼:

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

之後,您可以周遊實體階層,並修改該實體和元件。 多次載入相同的模型會建立多個執行個體,而每個執行個體都有自己的實體/元件結構複本。 由於網格、材質和紋理是共用資源,因此系統不會再次載入其資料。 因此,多次具現化模型只會產生相對較少的記憶體額外負荷。

API 文件

下一步