Модели
В Удаленной отрисовке Azure моделью называется полное представление объекта, составленное из сущностей и компонентов. Модели — это основной способ передачи пользовательских данных в службу удаленной отрисовки.
Структура модели
У каждой модели только одна сущность является корневым узлом. На следующих уровнях иерархии может существовать произвольная структура из дочерних сущностей. При загрузке модели возвращается ссылка на эту корневую сущность.
К каждой сущности могут прикрепляться компоненты. В большинстве случаев сущности имеют компоненты MeshComponents со ссылками на ресурсы сетки.
Создание моделей
Создание моделей для среды выполнения достигается путем преобразования входных моделей из форматов файлов, таких как FBX, GLTF или E57. Процесс преобразования извлекает все ресурсы (текстуры, материалы, сетки и т. д.) и преобразует их в форматы, оптимизированные для среды выполнения. Он также извлекает структурную информацию и преобразует ее в структуру графа из сущностей и компонентов Удаленной отрисовки Azure.
Важно!
Преобразование модели — это единственный способ создания сеток. В среде выполнения сетки могут совместно использоваться несколькими сущностями, но передать сетку в среду выполнения можно только путем загрузки модели.
Загрузка моделей
После преобразования модель можно загрузить из хранилища BLOB-объектов Azure в среду выполнения.
Существуют две разные функции загрузки, которые отличаются способом адресации ресурса в хранилище BLOB-объектов.
- К модели можно обращаться напрямую по параметрам хранилища BLOB-объектов, если хранилище BLOB-объектов связано с учетной записью. В этом случае используется функция загрузки
LoadModelAsync
с параметромLoadModelOptions
. - К модели можно обращаться по подписанному URL-адресу. Для этого используется функция
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
- C# RenderingConnection.LoadModelAsync()
- C# RenderingConnection.LoadModelFromSasAsync()
- C++ RenderingConnection::LoadModelAsync()
- C++ RenderingConnection::LoadModelFromSasAsync()