Megosztás a következőn keresztül:


Modellek

Az Azure Remote Renderingben a modellek entitásokból és összetevőkből álló teljes objektumábrázolásra utalnak. A modellek az egyéni adatok távoli renderelési szolgáltatásba való beolvasásának fő módja.

Modellstruktúra

A modell gyökércsomópontként pontosan egy entitással rendelkezik. Az alábbiakban a gyermek entitások tetszőleges hierarchiája lehet. Modell betöltésekor a függvény a legfelső szintű entitásra mutató hivatkozást ad vissza.

Minden entitáshoz csatolhatók összetevők . A leggyakoribb esetben az entitások MeshComponents-ekkel rendelkeznek, amelyek a mesh-erőforrásokra hivatkoznak.

Modellek létrehozása

A futtatókörnyezet modelljeinek létrehozásával olyan fájlformátumok bemeneti modelljeit konvertálhatja, mint az FBX, a GLTF vagy az E57. Az átalakítási folyamat kinyeri az összes erőforrást, például a textúrákat, az anyagokat és a hálókat, és optimalizált futtatókörnyezeti formátumokká alakítja őket. Emellett kinyeri a szerkezeti információkat, és átalakítja az ARR entitás-/összetevő-gráfstruktúrájába.

Fontos

A hálók létrehozásának egyetlen módja a modellkonvertálás. Bár a hálók futásidőben megoszthatóak az entitások között, a modell betöltésén kívül nincs más mód a hálók futásidejű betöltésére.

Modellek betöltése

A modell konvertálása után betölthető az Azure Blob Storage-ból a futtatókörnyezetbe.

Két különböző betöltési függvény létezik, amelyek az objektum blobtárolóban való kezelése alapján különböznek:

  • A modell közvetlenül blobtároló paraméterekkel kezelhető, ha a blobtároló a fiókhoz van csatolva. A megfelelő betöltési függvény ebben az esetben a paraméterrel LoadModelOptionsvanLoadModelAsync.
  • A modell az SAS URI-jával kezelhető. A megfelelő betöltési függvény a paraméterrel LoadModelFromSasOptionsvan LoadModelFromSasAsync megadva. Ezt a változatot beépített modellek betöltésekor is használhatja.

Az alábbi kódrészletek bemutatják, hogyan tölthet be modelleket bármelyik funkcióval. Ha egy modellt a blobtároló paramétereivel szeretne betölteni, használja az alábbihoz hasonló kódot:

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

Ha SAS-jogkivonat használatával szeretne betölteni egy modellt, használja az alábbi kódrészlethez hasonló kódot:

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

Ezt követően bejárást végezhet az entitáshierarchián, és módosíthatja az entitásokat és összetevőket. Ugyanazon modell többszöri betöltése több példányt hoz létre, és mindegyik saját példányt tartalmaz az entitás/összetevő szerkezetéről. Mivel a hálók, anyagok és textúrák megosztott erőforrások, az adataik azonban nem töltődnek be újra. Ezért a modell többszöri példányosítása viszonylag kevés memóriaterhelést okoz.

API-dokumentáció

Következő lépések