Трехмерные объекты

41

Окно просмотра может содержать в себе любой трехмерный объект, унаследованный от Visual3D (из пространства имен System.Windows.Media.Media3D, в котором находится подавляющее большинство трехмерных классов). Однако чтобы создать трехмерное представление, придется выполнить немного больше работы. В версии WPF 1.0 отсутствовала коллекция трехмерных фигур-примитивов. Когда был нужен куб, цилиндр или тор, приходилось строить их самостоятельно.

Одним из наиболее удачных проектных решений команды разработчиков WPF, принятых при создании классов рисования трехмерной графики, была структуризация их способом, подобным структуризации классов рисования плоской графики. Это означает, что разобраться в назначении многих классов, образующих основу трехмерной графики (даже не зная еще, как их следует использовать), достаточно легко. В таблице представлены соответствующие аналогии:

Классы для создания двухмерной и трехмерной графики
Класс 2D Класс 3D Примечания
Visual Visual3D Visual3D — базовый класс для всех трехмерных объектов (объектов, отображаемых внутри контейнера Viewport3D). Подобно классу Visual, можно использовать класс Visual3D для наследования от него облегченных трехмерных фигур или создания сложных трехмерных элементов управления, предоставляющих развитый набор событий и служб платформы. Однако не рассчитывайте на значительную помощь. Более вероятно, что вы воспользуетесь одним из классов-наследников Visual3D, таким как ModelVisual3D или ModelUIElement3D
Geometry Geometry3D Класс Geometry — это абстрактный способ определения двухмерной фигуры. Геометрия часто используется для определения сложных фигур, состоящих из дуг, отрезков прямых и многоугольников. Класс Geometry3D — его трехмерный аналог, он представляет трехмерную поверхность. Однако в то время как существует несколько геометрий 2-D, WPF включает только один конкретный класс, унаследованный от Geometry3D — MeshGeometry3D. Класс MeshGeometry3D имеет важнейшее значение в трехмерном рисовании, поскольку он применяется для определения всех трехмерных объектов
GeometryDrawing GeometryModel3D Существует несколько способов использования двухмерного объекта Geometry. Его можно упаковать в GeometryDrawing и применить для рисования поверхности элемента или содержимого Visual. Класс GeometryModel3D имеет то же назначение — он принимает Geometry3D, который затем может использоваться для заполнения Visual3D
Transform Transform3D Уже известно, что трансформации 2-D — чрезвычайно удобное средство манипулирования элементами и фигурами всех видов и всеми способами, включая перемещение, деформацию и вращение. Трансформации также незаменимы для выполнения анимации. Классы, унаследованные от Transform3D, выполняют то же самое с трехмерными объектами. Фактически обнаружится неожиданно много похожих классов, таких как RotateTransform3D, ScaleTransform3D, TranslateTransform3D, Transform3DGroup и MatrixTransform3D. Конечно, возможности, предлагаемые дополнительным измерением, существенны, и трехмерные трансформации обеспечивают деформации и преобразования, которые выглядят совершенно иначе

Поначалу может показаться, что распутать отношения между этими классами довольно трудно. По сути, Viewport3D содержит объекты Visual3D. Чтобы действительно предоставить Viewport3D некоторое содержимое, необходимо определить объект Geometry3D, описывающий фигуру, и упаковать его в GeometryModel3D. Затем можно использовать его как содержимое Visual3D. На рисунке демонстрируется это отношение:

Определение трехмерного объекта

Этот двухшаговый процесс — определение фигур, которые должны использоваться, в абстрактном виде, а затем включение их в визуальное представление — является необязательным при двухмерном рисовании. Однако он обязателен для рисования трехмерной графики, поскольку в библиотеке отсутствуют предварительно построенные классы 3-D. (Члены команды создателей WPF, а также некоторые другие разработчики разместили в Интернете примеры кода, призванные заполнить данный пробел, но все это еще находится в процессе развития.)

Двухшаговый процесс также важен потому, что трехмерные модели сложнее двухмерных. Например, когда создается объект Geometry3D, то не только указываются вершины фигуры, но также и материал, из которого она состоит. Разные материалы обладают различными свойствами в отношении отражения и поглощения света.

Пройди тесты
Лучший чат для C# программистов