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

Последнее обновление: 13.03.2016

Для создания трехмерного объекта мы можем использовать различные виды элементов:

3D-элемент

2D-аналог

Описание

Visual3D

Visual

Базовый класс для всех трехмерных объектов, которые визуализируются в Viewport3D. В частности, классы ModelVisual3D и ModelUIElement3D, объекты которых добавляются в Viewport3D через свойство Children, как раз наследуются от Visual3D

Model3D

Drawing

Представляет трехмерную модель, которая визуализируется элементом Visual3D

Geometry3D

Geometry

Абстрактный класс, который представляет трехмерную поверхность элемента. Для использования нам доступен его производный класс MeshGeometry3D

GeometryModel3D

GeometryDrawing

Класс, производный от Model3D. Объединяет объект Geometry3D, преставляющий поверхность 3D-объекта, и объект Material, определяющий материал для покрытия трехмерного объекта

Transform3D

Transform

Определяет трансформации 3D-объектов

UIElement3D

UIElement

Базовый класс для трехмерных объектов, которые могут вести себя как обычные элементы управления, например, реагировать на события

В прошлой теме для задания трехмерного объекта мы использовали следующую разметку xaml:

<ModelVisual3D>
    <ModelVisual3D.Content>
        <GeometryModel3D>
		
            <!--Определяем геометрию объекта-->
            <GeometryModel3D.Geometry>
                <MeshGeometry3D Positions="-0.5,0,0 0,0.5,0 0.5,0,0" TriangleIndices="0, 2,1" />
            </GeometryModel3D.Geometry>
			
            <!--Установка материала - красный цвет-->
            <GeometryModel3D.Material>
                <DiffuseMaterial Brush="Red" />
            </GeometryModel3D.Material>
        </GeometryModel3D>
    </ModelVisual3D.Content>
</ModelVisual3D>

Объект ModelVisual3D предсталяет визуализируемый трехмерный объект. Для его установки используется свойство Content.

В качестве содержимого этого свойства устанавливается элемент GeometryModel3D. Этот элемент объединяет два аспекта: геометрию трехмерного объекта и его материал. Для определения материала применяется свойство Material, а для установки геометрии элемента - свойство Geometry.

В качестве геометрии устанавливается элемент MeshGeometry3D, который преставляет собой меш - один из фундаментальных концептов разработки трехмерных объектов. Для определения самого трехмерного объекта у MeshGeometry3D доступны следующие свойства:

  • Positions: определяет координаты вершин треугольников. В нашем случае фигура представляет один треугольник, поэтому для его определения потребуется всего три точки. Для каждой точки определяется три координаты x, y, z.

  • TriangleIndices: определяет треугольник, принимая набор верши. Например, TriangleIndices="0,2,1" - треугольник строиться от первой вершины, далее к третьей и далее ко второй, которая соединяется с первой.

  • Normals: векторы нормалей, которые применяются для вычисления освещенности

  • TextureCoordinates: определяет, как двухмерная текстура будет накладываться на трехмерный объект

Итак, чтобы нарисовать объект, мы должны задать его вершины. Для этого в объекте MeshGeometry3D мы устанавливаем свойство Positions. В случае одно треугольника нам нужны только три вершины, которые в координатной системе размещены следующим образом:

Затем с помощью свойства TriangleIndices мы устанавливаем, в какой последовательности эти вершины будут соединены линиями. В данном случае мы указываем, что сначала мы соединыем первую и третью вершины (точку -0.5,0,0 с точкой 0.5,0,0), потом от третьей вершины проводим линию до второй (до точки 0,0.5,0). Почему мы не написали TriangleIndices="0,1,2", что вроде было бы более логично? В WPF действует правило, согласно которому мы должны перечислять точки против часовой стрелки относительно оси Z, поэтому, если бы мы написали 0,1,2, то у нас бы ничего не получилось.

При этом надо отметить, что ось Z направлена на нас, то есть положительные значения после условного нуля будут ближе к нам, а отрицательные - дальше от нас.

Материалы

Кроме геометрии в объекте GeometryModel3D мы еще должны определить материал. Материалы бывают нескольких видов:

  • DiffuseMaterial. Создает матовую поверхность объекта, на которой свет распространен равномерно во всех направлениях. Яркость же объекта зависит от угла, под которым свет падает на поверхность.

  • SpecularMaterial. Имитирует блестящую поверхность, отражая свет зеркально в противоположном направлении. Зачастую он используется для наложения бликов на темной поверхности, к которой ранее применялся DiffuseMaterial

  • Для использования материала SpecularMaterial изменим код материала следующим образом:

    <GeometryModel3D.Material>
        <MaterialGroup>
            <DiffuseMaterial Brush="Black" />
            <SpecularMaterial Brush="LightBlue" SpecularPower="19" />
        </MaterialGroup>
    </GeometryModel3D.Material>
    

    Материал SpecularMaterial имеет свойство SpecularPower, которое позволяет задать размытость цвета. При большем значении цвет становится ярче, а при меньшем значении, наоборот, мы получаем более мягкий, более размытый эффект.

    Материалы в WPF
  • EmissiveMaterial. Создает светящуюся поверхность.

  • <GeometryModel3D.Material>
        <MaterialGroup>
            <DiffuseMaterial Brush="DarkBlue" />
            <EmissiveMaterial Brush="LightGray" />
        </MaterialGroup>
    </GeometryModel3D.Material>
    

    При наложении различных цветов они смешиваются, создавая средний оттенок.

  • MaterialGroup. Создает комбинацию нескольких материалов.

Кроме свойства Material в объекте GeometryModel3D определено свойство BackMaterial, которое настраивает внешний вид также с помощью материалов для задней поверхности предмета. Но поскольку в данном случае нас задняя поверхность треугольника не интересует, мы не используем это свойство. Но оно в принципе аналогично свойству Material.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850