Bagikan melalui


Model

Model di Azure Remote Rendering mengacu pada representasi objek lengkap, yang terdiri dari entitas dan komponen. Model adalah cara utama untuk mendapatkan data kustom ke layanan penyajian jarak jauh.

Struktur model

Model memiliki satu entitas sebagai simpul akarnya. Di bawahnya, mungkin ada hierarki entitas anak arbitrer. Saat memuat model, referensi ke entitas akar ini ditampilkan.

Setiap entitas mungkin memiliki komponen yang terpasang. Dalam kasus yang paling umum, entitas memiliki MeshComponents, yang mereferensikan sumber daya jala.

Membuat model

Membuat model untuk runtime dicapai dengan mengonversi model input dari format file seperti FBX, GLTF, atau E57. Proses konversi mengekstrak semua sumber daya, seperti tekstur, materi, dan jala, dan mengonversinya ke format runtime yang dioptimalkan. Ini juga akan mengekstrak informasi struktural dan mengubahnya menjadi struktur entitas/grafik komponen ARR.

Penting

Konversi model adalah satu-satunya cara untuk membuat jala. Meskipun jala dapat dibagikan antara entitas pada waktu proses, tidak ada cara lain untuk memasukkan jala ke dalam runtime, selain memuat model.

Memuat model

Setelah model dikonversi, model dapat dimuat dari penyimpanan blob Azure ke dalam runtime.

Ada dua fungsi pemuatan berbeda yang tidak sama dengan cara aset ditangani dalam penyimpanan blob:

  • Model dapat diatasi dengan parameter penyimpanan blob secara langsung, jika penyimpanan blob ditautkan ke akun. Fungsi pemuatan yang relevan dalam hal ini adalah LoadModelAsync dengan parameter LoadModelOptions.
  • Model ini dapat diatasi oleh SAS URI-nya. Fungsi pemuatan relevan adalah LoadModelFromSasAsync parameter LoadModelFromSasOptions. Gunakan varian ini juga saat memuat model bawaan.

Cuplikan kode berikut menunjukkan cara memuat model dengan salah satu fungsi. Untuk memuat model menggunakan parameter penyimpanan blobnya, gunakan kode seperti yang ada di bawah:

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

Jika Anda ingin memuat model dengan menggunakan token SAS, gunakan kode yang mirip dengan cuplikan berikut:

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

Setelah itu Anda dapat melintasi hierarki entitas dan memodifikasi entitas dan komponen. Memuat model yang sama beberapa kali membuat beberapa instans, masing-masing dengan salinan struktur entitas/komponennya sendiri. Karena jala, bahan, dan tekstur adalah sumber daya bersama, data mereka tidak akan dimuat lagi. Oleh karena itu, pembuatan instans model lebih dari sekali menimbulkan overhead memori yang relatif sedikit.

Dokumentasi API

Langkah berikutnya