Сетки
Сетки являются неизменяемыми общими ресурсами , которые можно создать только с помощью преобразования модели. Сетки используются для отрисовки, но и для предоставления физики для запросов приведения лучей. Чтобы поместить сетку в трехмерное пространство, добавьте MeshComponent в сущность.
Типы сетки
В ARR есть два разных типа ресурсов сетки: триангулярные сетки и облака точек. Оба типа представлены одинаковым классом Mesh
API. За исключением незначительных различий в поведении для различных типов сетки, функциональные возможности предоставляемых API идентичны.
Служба преобразования автоматически определяет соответствующий тип сетки по расширению исходного файла. Например, FBX-файл всегда преобразуется как треугольная сетка, в то время как PLY рассматривается как облако точек. Полный список поддерживаемых форматов файлов см. в списке форматов исходных файлов.
Существует два существенных различия между преобразованиями точек облака и треугольной сетки:
- Точечные облачные сетки не предоставляют никаких материалов. Внешний вид точек определяется исключительно их цветом на точку.
- Облака точек не предоставляют граф сцены. Вместо этого все точки присоединяются к сущности корневого узла.
Свойства ресурса сетки
Класс Mesh
имеет следующие свойства.
Materials: массив материалов. Каждый материал используется другой вложенной сеткой. Несколько записей в массиве могут ссылаться на один и тот же материал. Записи в этом массиве не могут быть изменены во время выполнения, однако свойства материала могут быть изменены. Для точек облака этот массив пуст.
Bounds: выровненный по осям ограничивающий прямоугольник (AABB) вершин сетки в локальном пространстве.
MeshComponent
Класс MeshComponent
используется для размещения экземпляра ресурса сетки. Каждый MeshComponent ссылается на одну сетку. Он может переопределять материалы, которые используются для преобразования для просмотра каждой вложенной сетки.
Свойства MeshComponent
Mesh: ресурс сетки, используемый этим компонентом.
Materials: массив материалов, указанный в самом компоненте сетки. Размер массива всегда будет такой же, как у массива Materials в ресурсе сетки. Материалы, которые не должны переопределяться из сетки по умолчанию, в этом массиве имеют значение null.
UsedMaterials: массив фактически используемых материалов для каждой вложенной сетки. Его данные будут идентичны данным в массиве Materials для значений, отличных от NULL. В противном случае он содержит значение из массива Materials в экземпляре сетки. Этот массив доступен только для чтения.
Совместное использование сеток
Ресурс Mesh
может совместно использоваться несколькими экземплярами компонентов сетки. Кроме того, ресурс Mesh
, назначенный компоненту сетки, можно изменить программным способом в любое время. В приведенном ниже коде показано, как клонировать сетку.
Entity CloneEntityWithModel(RenderingConnection api, Entity sourceEntity)
{
MeshComponent meshComp = sourceEntity.FindComponentOfType<MeshComponent>();
if (meshComp != null)
{
Entity newEntity = api.CreateEntity();
MeshComponent newMeshComp = api.CreateComponent(ObjectType.MeshComponent, newEntity) as MeshComponent;
newMeshComp.Mesh = meshComp.Mesh; // share the mesh
return newEntity;
}
return null;
}
ApiHandle<Entity> CloneEntityWithModel(ApiHandle<RenderingConnection> api, ApiHandle<Entity> sourceEntity)
{
if (ApiHandle<MeshComponent> meshComp = sourceEntity->FindComponentOfType<MeshComponent>())
{
ApiHandle<Entity> newEntity = *api->CreateEntity();
ApiHandle<MeshComponent> newMeshComp = api->CreateComponent(ObjectType::MeshComponent, newEntity)->as<RemoteRendering::MeshComponent>();
newMeshComp->SetMesh(meshComp->GetMesh()); // share the mesh
return newEntity;
}
return nullptr;
}