Пример функций сетки glTF

Создание glTF файлов с EXT_mesh_features

Этот пример демонстрирует, как создать glTF файл с расширением EXT_mesh_features, используя API Aspose.3D.

Объяснение кода

Следующий код на C# создает сетку с контрольными точками и полигонами, а затем добавляет идентификаторы признаков к контрольным точкам перед сохранением в glTF файл:

// Этот пример создаст glTF файл с EXT_mesh_features
// Сначала мы создаем сетку
var mesh = new Mesh();

// Добавляем контрольные точки (вершины) в сетку
// Первый набор из четырех точек создает квадрат в плоскости XY при y=1
mesh.ControlPoints.Add(new Vector4(0, 1, 0));  // Точка 0
mesh.ControlPoints.Add(new Vector4(2, 1, 0));  // Точка 1
mesh.ControlPoints.Add(new Vector4(2, 2, 0));  // Точка 2
mesh.ControlPoints.Add(new Vector4(1, 2, 0));  // Точка 3

// Второй набор из четырех точек создает еще один квадрат в плоскости XY при y=0
mesh.ControlPoints.Add(new Vector4(3, 0, 0));  // Точка 4
mesh.ControlPoints.Add(new Vector4(4, 0, 0));  // Точка 5
mesh.ControlPoints.Add(new Vector4(4, 1, 0));  // Точка 6
mesh.ControlPoints.Add(new Vector4(3, 1, 0));  // Точка 7

// Создаем треугольные грани (полигоны) из контрольных точек
// Первый квадрат (точки 0-3) делится на два треугольника
mesh.CreatePolygon(0, 1, 2);  // Треугольник 0-1-2
mesh.CreatePolygon(0, 2, 3);  // Треугольник 0-2-3

// Второй квадрат (точки 4-7) также делится на два треугольника
mesh.CreatePolygon(4, 5, 6);  // Треугольник 4-5-6
mesh.CreatePolygon(4, 6, 7);  // Треугольник 4-6-7

// Затем мы создаем элемент пользовательских данных для хранения идентификаторов признаков
// Это свяжет идентификаторы признаков с контрольными точками
var featureId = (VertexElementUserData)mesh.CreateElement(
    VertexElementType.UserData,  // Тип элемента
    MappingMode.ControlPoint,   // Применять к контрольным точкам
    ReferenceMode.Direct        // Прямое отображение (не индексировано)
);

// Назначаем идентификаторы признаков каждой контрольной точке
// Первые четыре точки получают ID 0, следующие четыре получают ID 1
featureId.Data = new float[] { 0, 0, 0, 0, 1, 1, 1, 1 };

// Устанавливаем специальное имя атрибута, соответствующее спецификации EXT_mesh_features
// Формат _FEATURE_ID_<n> распознается экспортером glTF
featureId.Name = "_FEATURE_ID_0";

// Сохраняем сетку в файл glTF Binary (GLB)
// Экспортер автоматически сгенерирует данные расширения EXT_mesh_features
// Используем относительный путь для выходного файла
(new Scene(mesh)).Save("mesh_feature.glb");

Ключевые концепции

Создание сетки

  • Класс Mesh представляет собой полигональную сетку геометрии
  • Контрольные точки определяют вершины сетки
  • Метод CreatePolygon создает треугольные грани между контрольными точками

Идентификаторы признаков

  • Идентификаторы признаков позволяют группировать геометрию внутри сетки
  • Реализованы с помощью VertexElementUserData со специальной конвенцией именования
  • _FEATURE_ID_0 указывает на то, что это поток идентификаторов признаков
  • Можно создать несколько потоков идентификаторов признаков с возрастающими индексами

Назначение данных

  • Идентификаторы признаков хранятся как значения с плавающей точкой
  • Каждая контрольная точка получает соответствующее значение идентификатора признака
  • В этом примере мы используем два различных идентификатора признаков: 0 и 1

Экспорт файла

  • Сохранение в формате GLB сохраняет все функции, включая EXT_mesh_features
  • Aspose.3D автоматически обрабатывает генерацию расширения
  • Полученный файл содержит метаданные о признаках сетки
  • Использование относительных путей делает код более переносимым и упрощает его запуск в различных средах