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 parametremLoadModelOptions
. - Model může adresovat jeho identifikátor URI SAS. Relevantní funkce načítání je
LoadModelFromSasAsync
s parametremLoadModelFromSasOptions
. 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
- Vykreslování jazyka C#Připojení ion LoadModelAsync()
- Vykreslování jazyka C#Připojení ion LoadModelFromSasAsync()
- Vykreslování C++Připojení ion::LoadModelAsync()
- Vykreslování C++Připojení ion::LoadModelFromSasAsync()